12

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

这是脚本:

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

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

cat
/tmp/tables

这显然不是我想要的。

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

任何有助于解决这个问题的帮助将不胜感激。

4

5 回答 5

25

您使用了错误类型的引号。

您需要使用反引号而不是单引号来使参数成为正在运行的程序并将内容传送到 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
于 2011-07-29T03:40:02.940 回答
4

单引号应该是反引号:

for tbl in `cat /etc/tables`

虽然,这不会让您按行输出/输入,而是按单词输出/输入。要逐行处理,您应该尝试以下操作:

cat /etc/tables | while read line
    echo $line
done
于 2011-07-29T03:41:57.520 回答
3

使用while循环:

while read line
do
echo "$line"
done < "file"
于 2011-07-29T03:52:19.223 回答
2
while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables

这个

于 2011-07-29T04:01:18.140 回答
0

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

IFS="\t\n"  # You must use double quotes for escape sequences. 
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl"
done
于 2012-03-20T02:36:38.603 回答