Печать вывода инструкции cat в цикле bash script

Я пытаюсь выполнить команду для каждой строки, исходящей из команды cat. Я основываю это на примере кода, который я получил от поставщика.

Здесь script:

for tbl in 'cat /tmp/tables'
do
   echo $tbl
done

Итак, я ожидал, что вывод будет каждой строкой в ​​файле. Вместо этого я получаю следующее:

cat
/tmp/tables

Это явно не то, что я хотел.

Я собираюсь заменить эхо фактической командой, которая взаимодействует с базой данных.

Любая помощь в выпрямлении этого результата будет с благодарностью.

Ответ 1

Вы используете неправильный тип кавычек.

Вам нужно использовать обратные кавычки, а не одну кавычку, чтобы заставить аргумент быть запущенной программой и выводить содержимое на вход.

for tbl in `cat /tmp/tables` 
do 
    echo "$tbl"
done

Также для лучшей читаемости (если вы используете bash), вы можете записать его как

for tbl in $(cat /tmp/tables) 
do 
    echo "$tbl"
done

Если ваши ожидания состоят в том, чтобы получить каждую строку (для циклов, указанных выше, вы получите каждое слово), тогда вам может быть лучше использовать xargs, как этот

cat /tmp/tables | xargs -L1 echo

или как петля

cat /tmp/tables | while read line; do echo "$line"; done

Ответ 2

С циклом while:

while read line
do
echo "$line"
done < "file"

Ответ 3

Одиночные кавычки должны быть обратными:

for tbl in `cat /etc/tables`

Хотя это не приведет к выходу/выводу по строке, но по слову. Чтобы обрабатывать строку за строкой, вы должны попробовать что-то вроде:

cat /etc/tables | while read line
    echo $line
done

Ответ 4

while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables

прочитайте это.

Ответ 5

Вы можете выполнить много разборов в bash, переопределив IFS (Разделитель полей ввода), например

IFS="\t\n"  # You must use double quotes for escape sequences. 
for tbl in 'cat /tmp/tables' 
do 
    echo "$tbl"
done