Вывести вывод оператора cat в цикле bash-скрипта - PullRequest
10 голосов
/ 29 июля 2011

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

Вот сценарий:

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

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

cat
/tmp/tables

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

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

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

Ответы [ 5 ]

18 голосов
/ 29 июля 2011

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

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

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

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

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

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

cat /tmp/tables | xargs -L1 echo

или как петля

cat /tmp/tables | while read line; do echo "$line"; done
3 голосов
/ 29 июля 2011

С , в то время как цикл:

while read line
do
echo "$line"
done < "file"
2 голосов
/ 29 июля 2011
while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables

читать это .

2 голосов
/ 29 июля 2011

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

for tbl in `cat /etc/tables`

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

cat /etc/tables | while read line
    echo $line
done
0 голосов
/ 20 марта 2012

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

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