Печать вывода инструкции 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