Я хочу сделать следующее: читать строку за строкой файла и использовать значение в строке в качестве параметров
FILE="cat test"
echo "$FILE" | \
while read CMD; do
echo $CMD
done
но когда я делаю echo $CMD, он просто возвращает cat: S
Я хочу сделать следующее: читать строку за строкой файла и использовать значение в строке в качестве параметров
FILE="cat test"
echo "$FILE" | \
while read CMD; do
echo $CMD
done
но когда я делаю echo $CMD, он просто возвращает cat: S
То, что у вас есть, это передать текст "cat test"
в цикл.
Вы просто хотите:
cat test | \
while read CMD; do
echo $CMD
done
FILE=test
while read CMD; do
echo "$CMD"
done < "$FILE"
Есть некоторые дополнительные улучшения, которые можно сделать:
IFS=
чтобы read
не урезало начальные и конечные пробелы в каждой строке.-r
для чтения, чтобы избежать обратной косой черты от интерпретации как escape-последовательности.CMD
и FILE
. Соглашение bash относится только к окружающим, а переменные внутренней оболочки - в верхнем регистре.printf
вместо echo
что безопаснее, если $cmd
является строкой, подобной -n
, которую echo
будет интерпретировать как флаг.file=test
while IFS= read -r cmd; do
printf '%s\n' "$cmd"
done < "$file"
xargs
- это наиболее гибкое решение для разделения вывода на аргументы команды.
Он также очень удобен для чтения и простота использования благодаря простой параметризации.
Формат xargs -n $NUMLINES mycommand
.
Например, для echo
каждой отдельной строки в файле /tmp/tmp.txt
вы бы сделали:
cat /tmp/tmp.txt | xargs -n 1 echo
Или до diff
каждой последовательной пары файлов, перечисленных как строки в файле с указанным выше именем:
cat /tmp/tmp.txt | xargs -n 2 diff
-n 2
инструктирует xargs
потреблять и передавать в качестве отдельных аргументов две строки того, что вы запустили в него за раз.
Вы можете настроить xargs
для разделения на разделителях, кроме возврата каретки/новой строки.
Используйте man xargs
и google, чтобы узнать больше о возможностях этой универсальной утилиты.
Вы хотите сделать:
cat test | \
while read CMD; do
echo $CMD
done
Если вы хотите использовать каждую из строк файла в качестве параметров командной строки для своего приложения, вы можете использовать команду xargs.
xargs -a <params_file> <command>
Файл параметров с:
a
b
c
d
и файл tr.py:
import sys
print sys.argv
Выполнение
xargs -a params ./tr.py
дает результат:
['./tr.py', 'a', 'b', 'c', 'd']
Правильная версия вашего script выглядит следующим образом:
FILE="cat test"
$FILE | \
while read CMD; do
echo $CMD
done
Однако этот вид косвенности - использование вашей команды в переменной с именем FILE - не требуется. Используйте одно из уже предоставленных решений. Я просто хотел указать на вашу ошибку.
while read CMD; do
echo $CMD
done << EOF
data line 1
data line 2
..
EOF