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



我有一个简单的文件叫做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"

我记得在某处读到printfecho更安全,因为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·泰尔怎么说,$()shashzshdashbash工作。

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

'与 '

相关内容

  • 没有找到相关文章

最新更新