在bash脚本中逐行阅读

use*_*948 48 linux bash

我想要执行以下操作,逐行读取文件并使用每行的值作为参数

FILE="cat test"
echo "$FILE" | \
while read CMD; do
echo $CMD
done
Run Code Online (Sandbox Code Playgroud)

但当我做echo $ CMD时,它只返回cat:S

Joh*_*ica 108

FILE=test

while read CMD; do
    echo "$CMD"
done < "$FILE"
Run Code Online (Sandbox Code Playgroud)

可以进行一些额外的改进(感谢@RanyAlbegWein):

  • 添加< "$FILE"以便cat "$FILE" | while ...不会修剪每行的前导和尾随空格.
  • 添加|以读取以防止反斜杠被解释为转义序列.
  • 小写<$CMD.bash约定只是环境和内部shell变量是大写的.
  • 使用IFS=替代的read,如果它是安全的-r就像是一个字符串,CMDFILE会解释为一个标志.

结果:

file=test

while IFS= read -r cmd; do
    printf '%s\n' "$cmd"
done < "$file"
Run Code Online (Sandbox Code Playgroud)


Oli*_*rth 82

你所拥有的是将文本传递"cat test"到循环中.

你只想要:

cat test | \
while read CMD; do
    echo $CMD
done
Run Code Online (Sandbox Code Playgroud)


Kom*_*ave 13

xargs 是将输出拆分为命令参数的最灵活的解决方案.

由于其简单的参数化,它也非常易读且易于使用.

格式是xargs -n $NUMLINES mycommand.

例如,对于您要执行echo的文件中的每个单独行/tmp/tmp.txt:

cat /tmp/tmp.txt | xargs -n 1 echo
Run Code Online (Sandbox Code Playgroud)

或者对于diff您在上述名称的文件中列为行的每个连续文件对,您将执行以下操作:

cat /tmp/tmp.txt | xargs -n 2 diff
Run Code Online (Sandbox Code Playgroud)

-n 2指示xargs消耗,并通过作为独立参数的你在一个时间管道输送到它什么两行.

xargs除了回车/换行之外,您还可以定制拆分分隔符.

使用man xargs和谷歌找到更多关于这个多功能实用程序的力量.