Подтвердить что ты не робот

Прочитайте строку за строкой в ​​bash script

Я хочу сделать следующее: читать строку за строкой файла и использовать значение в строке в качестве параметров

FILE="cat test"
echo "$FILE" | \
while read CMD; do
echo $CMD
done

но когда я делаю echo $CMD, он просто возвращает cat: S

4b9b3361

Ответ 1

То, что у вас есть, это передать текст "cat test" в цикл.

Вы просто хотите:

cat test | \
while read CMD; do
    echo $CMD
done

Ответ 2

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"

Ответ 3

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, чтобы узнать больше о возможностях этой универсальной утилиты.

Ответ 4

Вы хотите сделать:

cat test | \
while read CMD; do
echo $CMD
done

Ответ 5

Если вы хотите использовать каждую из строк файла в качестве параметров командной строки для своего приложения, вы можете использовать команду 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']

Ответ 6

Правильная версия вашего script выглядит следующим образом:

FILE="cat test"
$FILE | \
while read CMD; do
echo $CMD
done

Однако этот вид косвенности - использование вашей команды в переменной с именем FILE - не требуется. Используйте одно из уже предоставленных решений. Я просто хотел указать на вашу ошибку.

Ответ 7

while read CMD; do
    echo $CMD
done  << EOF
data line 1
data line 2
..
EOF