我有一个简单的BASH命令,看起来像
for i in `seq 2`; do echo $i; done; > out.dat
运行此命令时,输出seq 2会输出到终端,而数据文件(out.dat)不会输出任何内容
seq 2
我希望标准输出能够像直接执行命令那样重定向到out.dat seq 2 > out.dat
seq 2 > out.dat
删除分号。
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可能导致路径名扩展的输出。
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