我想在我的一个bash脚本中替换以下循环:
for i in $(seq 1 $nb) do
grep -h 'my pattern' $mydir/$my_dir_prefix$i/$myfile_prefix*
done
诸如:
之类的东西grep -h 'my pattern' $mydir/$my_dir_prefix${1,$nb}/$myfile_prefix*
但失败了...取决于我尝试在何处放置双引号,我得到不同的结果,但从来没有正确的结果。
我看到的所有答案都没有解决这个问题。有什么想法吗?
只需将grep
从循环中拉出:
grep -h 'my pattern' $(for i in $(seq 1 $nb); do find $mydir -wholename "$mydir/$my_dir_prefix$i/$myfile_prefix*"; done )
您会遇到怪异命名文件(例如包含新线或其他空格)的问题,但是您在原始解决方案中遇到了相同的问题。
edit:第一个解决方案仅适用于数字1-9,添加更好的一个
查看bash手册:
序列表达式以{x..y [.. engr]}的形式,其中x和y为 整数或单个字符。
...
在任何其他扩展之前进行撑杆扩展
因此,变量从字面上进行处理。
解决方案1.(仅适用于数字1-9)
,但是您应该能够为您的目的使用[]
Glob:
grep -h 'my pattern' $mydir/$my_dir_prefix[1-$nb]/$myfile_prefix*
关于双引号,您可以到处添加它们,但可以在Glob周围添加:
grep -h 'my pattern' "$mydir/$my_dir_prefix"[1-$nb]"/$myfile_prefix"*
解决方案2。
您可以启用bash extglob
选项并使用扩展模式匹配:
shopt -s extglob
grep -h grep -h 'my pattern' "$mydir/$my_dir_prefix"@($(seq -s | 1 $nb))"/$myfile_prefix"*