我想$var in
在 bash 中使用带有范围的 shell 大括号扩展。简单地说{$var1..$var2}
是行不通的,所以我选择了“横向”......
以下内容有效,但有点混乱。
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
还有更“正常”的方式吗?
答案1
您可能想尝试:
eval rm foo.{$ext0..$extN}
不确定这是否是最好的答案,但它肯定是一个。
答案2
正如您已经意识到的那样,{1..3}
展开为1 2 3
但{foo..bar}
或{$foo..$bar}
不触发大括号展开,后者随后展开以替换$foo
和$bar
的值。
GNU(例如非嵌入式Linux)的后备方案是seq
命令。
for x in `seq $ext0 $extN`; do rm foo.$x; done
另一种可能性。如果foo.
不包含 shell 特殊字符,则为
rm `seq $ext0 $extN | sed 's/^/foo./'`
最简单的解决方案是使用 zsh,rm foo.{$ext0..$extN}
你想要的东西在哪里。
答案3
function f_over_range {
for i in $(eval echo {$1..$2}); do
f $i
done
}
function f {
echo $1
}
f_over_range 0 5
f_over_range 00 05
笔记:
- 使用 eval 会暴露命令注入安全风险
- Linux 将打印“00\n01\n02..etc”,但 OSX 将打印“1\n2\n...etc”
- 使用 seq 或 C 风格的 for 循环与大括号扩展对前导零的处理不匹配
答案4
我有以下命令可以查找根目录中的文件总数:
命令01:
ls -dq *dog* | wc -l
我还有一个使用数字序列创建多个文件夹的命令:
命令02:
mkdir -p {0..3}
我知道根目录中有 3 个文件的名称中包含字符串“DOG”。
但我想在其他根文件夹中使用 01 命令,并计算您的名称中有多少个文件包含“DOG”,将结果存储在变量结果中,并使用此变量代替命令 02 中所示的“3”。
以下是我无法创建子文件夹 1、2 和 3 的所有可能尝试:
result=$ls -dq *dog* | wc -l) mkdir {0..$result}
result=$(ls -dq *dog* | wc -l) | mkdir {0..$result}
ls -dq *dog* | wc -l | xargs I{} mkdir {0..{}}
ls -dq *dog* | wc -l | while read file; do mkdir -p {1.."$file"}; done
但是对于上面的任何尝试,我只有两个结果:或者创建了一个名为的文件夹,{0..3}
或者除了接收结果的打印之外什么也没有发生
ls -dq *dog* | wc -l
解决如下:
看着这个答案可以建立一个能够获得所需结果的模型:
eval "mkdir -p {1..`ls -dq *dog* | wc -l`}"
虽然严格不是最合适的答案,因为我提出问题是“在内部使用变量mkdir {1 .. $variable}
”