如何使用bash脚本和for循环回显文件行

时间:2012-11-08 21:37:38

标签: bash

我有一个名为dbs.txt的简单文件 我想在bash中使用for循环将该文件的行回显到屏幕上。

该文件如下所示:

db1
db2
db3
db4

bash文件名为test.sh 看起来像这样

for i in 'cat dbs.txt'; do
echo $i
done
wait

当我通过输入以下命令运行文件时:

bash test.sh

我得到终端输出:

cat dbs.txt

而不是希望的

db1
db2
db3
db4

以下bash文件效果很好:

cat dbs.txt | while read line
do
echo "$line"
done

为什么第一个脚本不起作用?

4 个答案:

答案 0 :(得分:14)

您可以使用内置read而不是cat的shell。如果你只处理一个文件并且它不是很大,那么以下内容可能比大多数解决方案更容易,更便携:

#!/bin/sh

while read line
do
    printf "%s\n" "$line"
done < "$1"

我记得在某个地方printfecho更安全,因为echo接受的选项可能因平台而异。因此养成使用printf的习惯可能是值得的。

有关read内置的说明,请查看shell的手册页。

答案 1 :(得分:5)

您需要执行子shell并捕获输出,如下所示:

for i in `cat dbs.txt`; do
echo $i
done
wait

注意反引号`而不是单引号。

在bash中,您还可以使用$(command)

for i in $(cat dbs.txt); do
echo $i
done
wait

答案 2 :(得分:4)

您需要命令替换 shell功能。这需要POSIX表达式$()

不要像其他人所说的那样使用反引号

反引号(`)用于旧式命令替换,例如

foo=`command`

foo=$(command)
建议使用

语法。 $()内的反斜杠处理不那么令人惊讶,$()更容易嵌套。参见

尽管Linus G Thiel说过,$()适用于shashzshdashbash ...

答案 3 :(得分:1)

你需要反引号而不是单引号

`vs'