【发布时间】:2016-10-11 16:30:43
【问题描述】:
我正在尝试使用 for 循环和字符串格式运行多个类似的命令。
我能够创建并打印我想运行的命令的字符串:
$foo=( "bar" "baz" )
$for ((j=0;j<2;++j)); do printf "touch %s_file.txt; " "${foo[j]}"; done
touch bar_file.txt; touch baz_file.txt;
但我想将这些字符串作为命令输入。基于其他问题,我认为eval 可以满足我的需要:
$for ((j=0;j<2;++j)); do eval "touch %s_file.txt; " "${foo[j]}"; done
-bash: bar: command not found
-bash: baz: command not found
我期待(或希望)输出等同于:
$touch bar_file.txt; touch baz_file.txt;
这里的touch 只是一个例子。我对如何格式化字符串然后将其作为命令运行更感兴趣。谢谢。
【问题讨论】:
-
您是否有理由按索引而不是
for prefix in "${foo[@]}"; do进行迭代?根本不需要j。 -
顺便说一句——您能否更清楚地了解为什么您要尝试使用字符串格式?如果您采用最佳实践方法,它会产生大量安全隐患。
-
@CharlesDuffy 我对 bash 相当陌生,所以我并不总是知道最佳实践是什么。就使用计数器进行循环而言,在我的实际用例中,我正在循环多个数组,并使用
j对它们进行索引。真的,我正在使用字符串格式,因为这是我知道该怎么做的事情。很高兴知道这不是执行此操作的正确方法,我将研究替代方案。感谢您的建议! -
Re:迭代多个数组,如果你的 shell 是 bash 4.3 或 ksh93,你可能会考虑使用 namevars。也就是说,有效地做到这一点在很大程度上是一个很好的例子。