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

14

我试图对来自cat命令的每一行执行一个命令。 我基于从供应商获取的示例代码。

这是脚本:

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

所以我期望的输出是文件中的每一行。但实际上我得到了这个:

cat
/tmp/tables

显然这不是我想要的。

我将用一个实际的命令替换echo,这个命令可以与数据库进行交互。

如果有帮助把这个问题搞清楚将不胜感激。

5个回答

25

你使用的是错误类型的引号。

你需要使用反引号而不是单引号来使参数成为一个运行程序并将内容管道传输到for循环的命令。

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

最新版本的优点是还可以去除空格。 - Anthony Rutledge

5
单引号应该改为反引号:
for tbl in `cat /etc/tables`

虽然这样做不能逐行读取输出/输入,但可以逐个单词读取。为了按行处理,可以尝试以下方法:
cat /etc/tables | while read line
    echo $line
done

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

read this.


3

使用 while 循环:

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

0

你可以通过重新定义IFS(输入字段分隔符)在bash中进行许多解析操作,例如

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

1
你真的在bash中尝试过吗?它会将'', 't', 'n'分开,不是很有帮助。 - kubanczyk
单引号不允许转义。使用双引号"\t\n"。否则,单引号将会保留 ''、't'、'n'的本意。 - Anthony Rutledge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接