зацикливание содержимого файла на аргументы - PullRequest
0 голосов
/ 25 мая 2018

Значит, вы все это знаете, верно? Цикл по содержимому файла в Bash

Итак, я хочу зациклить содержимое файла до аргументов.Какие изменения выводятся и т. Д.

То, что я пробовал:

while read $1 & $2 & $3; do
#also tried:
#while read $1 $2 $3; do
    echo ${1}
    echo ${2}
    echo ${3}

    ./${1}.sh & ./${2}.sh & ./${3}.sh

done <file.txt

Результаты:

#arguments aren't echoed
./script.sh: line 31: ./.sh: No such file or directory
./script.sh: line 31: ./.sh: No such file or directory
./script.sh: line 31: ./.sh: No such file or directory
#scripts aren't executed

file.txt content

apple_fruit
#$1
apple_veggie
#$2
veggie_fruit
#$3
pear_fruit
#$1
pear_veggie
#$2
veggie_fruit
#$3

Это циклывот так в этом шаблоне ^^

Я также пытался изменить файл на этот:

apple_fruit apple_veggie veggie_fruit
pear_fruit pear_veggie veggie_fruit

В двух словах:

Я хочу, чтобы $ 1 был замененна apple_fruit, $ 2 будет заменено на apple_veggie, а $ 3 будет заменено на veggie_fruit.Затем, когда он достигнет done, я хочу, чтобы он заменил 1 доллар на pear_fruit, 2 доллара на pear_veggie и так далее.

Связанные мини-вопросы

А также, чтобы заставить это работать, вы не добавляете аргументы при вводе этого скрипта

script.sh

или действительнонадо что-то вставлять, если что делать?Потому что аргумент всегда будет меняться.

script.sh mystery mystery mystery

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Три строки, три read с:

while IFS= read -r l1
      IFS= read -r l2
      IFS= read -r l3
do
    echo "$l1, $l2, and $l3"
done <<EOF
apple_fruit
apple_veggie
veggie_fruit
pear_fruit
pear_veggie
veggie_fruit
EOF

Вывод:

apple_fruit, apple_veggie, and veggie_fruit
pear_fruit, pear_veggie, and veggie_fruit

Нет реальной причины использовать здесь позиционные параметры;просто используйте обычные переменные.

0 голосов
/ 25 мая 2018

Вы можете использовать встроенную команду bash readarray для чтения строк в массив (line):

readarray line < file.txt
echo ${line[@]}

output:

apple_fruit                                                              
apple_veggie                                                             
veggie_fruit                                                             
pear_fruit                                                               
pear_veggie                                                              
veggie_fruit

Тогда вы можете сделать

printf './%s.sh & '  "${line[@]}" | sed 's/ \& $//'         

который выводит

./apple_fruit.sh & ./apple_veggie.sh & ./veggie_fruit.sh & ./pear_fruit.sh & ./pear_veggie.sh & ./veggie_fruit.sh
...