在bash脚本循环中打印cat语句的输出

时间:2011-07-29 03:37:03

标签: linux bash for-loop cat

我正在尝试为来自cat命令的每一行执行命令。我的基础是我从供应商处获得的示例代码。

这是脚本:

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

所以我期待输出是文件中的每一行。相反,我得到了这个:

cat
/tmp/tables

这显然不是我想要的。

我将用一个与数据库连接的实际命令替换echo。

任何帮助纠正这一点的人都将不胜感激。

5 个答案:

答案 0 :(得分:18)

您使用了错误的报价类型。

你需要使用后引号而不是单引号来使参数成为一个程序运行并将内容输出到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

答案 1 :(得分:3)

while 循环:

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

答案 2 :(得分:2)

单引号应该是反引号:

for tbl in `cat /etc/tables`

虽然,这不会让你按行输出/输入,而是按字。要逐行处理,您应该尝试类似:

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

答案 3 :(得分:2)

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

阅读this

答案 4 :(得分:0)

您可以通过重新定义IFS(输入字段分隔符)在bash中进行大量解析,例如

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