我想要执行以下操作,逐行读取文件并使用每行的值作为参数
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就像是一个字符串,CMD它FILE会解释为一个标志.结果:
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和谷歌找到更多关于这个多功能实用程序的力量.