13

我有一个名为 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

4 回答 4

17

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

#!/bin/sh

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

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

有关read内置的​​描述,请查看 shell 的手册页。

于 2012-11-09T13:18:32.410 回答
10

您需要执行一个子 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
于 2012-11-08T21:40:02.963 回答
5

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

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

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

foo=`command`

foo=$(command)

建议使用语法。$() 内的反斜杠处理不那么令人惊讶,并且 $() 更容易嵌套。看

尽管 Linus G Thiel 说了什么,但$()工作在sh, ash, zsh, dash, bash...

于 2012-11-08T23:42:29.910 回答
1

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

`与'

于 2012-11-08T21:40:40.543 回答