如何在Bash中展开表达式生成多命令?批量创建文件并写入指定字符串
解决方案
当然可以实现!你不用写for循环,通过大括号展开(brace expansion)结合eval命令就能生成你想要的多个独立命令序列。
具体命令如下:
eval 'echo "TEST" > file'{1..9}'.txt;'
原理说明:
- 大括号
{1..9}会先被shell展开为1 2 3 ... 9,所以整个字符串部分会被展开成:'echo "TEST" > file1.txt;' 'echo "TEST" > file2.txt;' ... 'echo "TEST" > file9.txt;' eval命令会把这些展开后的字符串作为独立的shell命令依次执行,最终效果和你手动写echo "TEST" > file1.txt ; echo "TEST" > file2.txt ; …… ; echo "TEST" > file9.txt完全一致。
另一种替代方案(用printf生成命令):
如果你觉得eval看起来有点“重”,也可以用printf生成完整的命令序列,再交给shell直接执行:
$(printf 'echo "TEST" > file%d.txt; ' {1..9})
这个命令里,printf会根据模板生成每个echo命令并加上分号,shell会直接执行生成的整个命令串,同样能达到目的。
为什么你之前的尝试没生效?
你写的echo "TEST" > file{0..9}.txt之所以不符合预期,是因为shell会先展开文件名部分,变成echo "TEST" > file1.txt > file2.txt ... > file9.txt——这种写法里,所有重定向都是针对同一个echo命令的,shell会依次打开每个文件进行截断操作,最终只有最后一个文件(file9.txt)会保留TEST内容,前面的文件都会被创建但为空。而我们上面的方法是让每个文件对应一个独立的echo命令,就能保证每个文件都被写入TEST。
内容的提问来源于stack exchange,提问作者Nebeski
相关产品推荐
相关产品推荐

