我有一个简单的文件叫做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
为什么第一个脚本不起作用?
您可以使用内置的 shellread
而不是cat
。如果您只处理单个文件并且它不是很大,那么以下解决方案可能比大多数解决方案更容易、更便携:
#!/bin/sh
while read line
do
printf "%sn" "$line"
done < "$1"
我记得在某处读到printf
比echo
更安全,因为echo
接受的选项可能因平台而异。因此,养成使用printf
的习惯可能是值得的。
有关内置read
的说明,请查看 shell 的手册页。
你需要执行一个子 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
你需要命令替换外壳功能。这需要 POSIX 表达式$()
。
请不要像其他人所说的那样使用反引号。
反引号 (') 用于旧式命令替换,例如
foo=`command`
这
foo=$(command)
建议改用语法。$() 中的反斜杠处理不那么令人惊讶,并且 $() 更容易嵌套。看
- http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html ->2.6.3 命令替换
- http://mywiki.wooledge.org/BashFAQ/082
不管莱纳斯·G·泰尔怎么说,$()
在sh
、ash
、zsh
、dash
、bash
工作。
你需要反引号而不是单引号
'与 '