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

Chi*_*Fur 9 bash

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

该文件如下所示:

db1
db2
db3
db4
Run Code Online (Sandbox Code Playgroud)

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

for i in 'cat dbs.txt'; do
echo $i
done
wait
Run Code Online (Sandbox Code Playgroud)

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

bash test.sh
Run Code Online (Sandbox Code Playgroud)

我得到终端输出:

cat dbs.txt
Run Code Online (Sandbox Code Playgroud)

而不是希望的

db1
db2
db3
db4
Run Code Online (Sandbox Code Playgroud)

以下bash文件很有用:

cat dbs.txt | while read line
do
echo "$line"
done
Run Code Online (Sandbox Code Playgroud)

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

小智 14

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

#!/bin/sh

while read line
do
    printf "%s\n" "$line"
done < "$1"
Run Code Online (Sandbox Code Playgroud)

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

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


Lin*_*iel 6

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

for i in `cat dbs.txt`; do
echo $i
done
wait
Run Code Online (Sandbox Code Playgroud)

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

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

for i in $(cat dbs.txt); do
echo $i
done
wait
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 5

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

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

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

foo=`command`
Run Code Online (Sandbox Code Playgroud)

foo=$(command)
Run Code Online (Sandbox Code Playgroud)

建议改为使用语法。$() 内部的反斜杠处理并不令人意外,而且 $() 更容易嵌套。看

不管 Linus G Thiel 怎么说,$()工作于sh, ash, zsh, dash, bash...