【问题标题】:How to echo lines of file using bash script and for loop如何使用 bash 脚本和 for 循环回显文件行
【发布时间】:2012-11-08 21:37:37
【问题描述】:

我有一个名为 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

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

【问题讨论】:

  • fwiw,最好使用while read 而不是for i in $(cat dbs.txt)
  • 如果任何行包含空格,第一个(即使已修复)也不会逐行回显
  • 你的单引号应该是反引号:
    for i in cat dbs.txt; do echo $i done wait

标签: bash


【解决方案1】:

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

#!/bin/sh

while read line
do
    printf "%s\n" "$line"
done < "$1"

我记得在某处读到printfecho 更安全,因为echo 接受的选项可能因平台而异。所以养成使用printf 的习惯可能是值得的。

有关 read 内置函数的描述,请查看您的 shell 的手册页。

【讨论】:

    【解决方案2】:

    您需要执行一个子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
    

    【讨论】:

    • 看我的帖子,不鼓励反引号。
    【解决方案3】:

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

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

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

    foo=`command`
    

    foo=$(command)
    
    建议使用

    语法。 $() 中的反斜杠处理不那么令人惊讶,并且 $() 更容易嵌套。见

    尽管 Linus G Thiel 说过,$()shashzshdashbash...中工作...

    【讨论】:

      【解决方案4】:

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

      `与'

      【讨论】:

      • 看我的帖子,不鼓励反引号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2013-10-04
      • 2013-11-07
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多