我有一个名为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
为什么第一个脚本不起作用?
答案 0 :(得分:14)
您可以使用内置read
而不是cat
的shell。如果你只处理一个文件并且它不是很大,那么以下内容可能比大多数解决方案更容易,更便携:
#!/bin/sh
while read line
do
printf "%s\n" "$line"
done < "$1"
我记得在某个地方printf
比echo
更安全,因为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说过,$()
适用于sh
,ash
,zsh
,dash
,bash
...
答案 3 :(得分:1)
你需要反引号而不是单引号
`vs'