我有一个名为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的手册页.
您需要执行一个子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)
您需要命令替换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...