一尘不染

重定向bas​​h的输出以进行循环

linux

我有一个简单的BASH命令,看起来像

for i in `seq 2`; do echo $i; done; > out.dat

运行此命令时,输出seq 2会输出到终端,而数据文件(out.dat)不会输出任何内容

我希望标准输出能够像直接执行命令那样重定向到out.dat seq 2 > out.dat


阅读 232

收藏
2020-06-07

共1个答案

一尘不染

删除分号。

for i in `seq 2`; do echo "$i"; done > out.dat

建议

同样按照Fredrik Pihl的建议,在不需要二进制二进制文件时,或者至少在实际上不使用它们时,请尽量不要使用它们:

for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat

另外,请注意words可能导致路径名扩展的输出。

for A in $(echo '*'); do echo "$A"; done

将显示文件而不只是文字*

$()还建议使用Bash和POSIX shell中的命令替换语法```,使其比使用反引号()更清晰,并且支持嵌套。

用于将输出读取到变量的更清洁的解决方案是

while read VAR; do
    ...   
done < <(do something)

read ... < <(do something)  ## Could be done on a loop or with readarray.

for A in "${ARRAY[@]}"; do
    :
done

就预期功能而言,使用printf也可以是一个更容易的选择:

printf '%s\n' {1..2} > out.dat
2020-06-07