我有一个编译并运行一段idl代码的脚本。看起来像这样,
arg1=$1
idl << EOF
.rnew testvalue_{arg1}.pro
testvalue_{arg1}.pro
EOF
我想从命令行运行for循环,其中arg1可以采用不同的名称。到目前为止我所拥有的是,
for arg1 in testvalue.sh; do arg1={'value1', 'value2'}; done
我认为我的逻辑是正确的。我错过了什么?
答案 0 :(得分:0)
首先,你需要在变量名之前放置$
,以便bash知道它被替换了
您还需要提供testvalue.sh
值,因为它已从$1
复制到$arg1
但为什么我不建议创建新变量,只需使用$1
两次
所以testvalue.sh
是:
idl << EOF
.rnew testvalue_$1.pro
testvalue_$1.pro
循环:
for arg in 'value1' 'value2'; do ./testvalue.sh $arg; done
答案 1 :(得分:0)
我对这个问题的具体细节有些模糊,但听起来你想要把价值放在第一位。和&#39; value2&#39;在for循环迭代的值列表中:
for arg1 in value1 value2
do
idl <<EOF
.rnew testvalue_${arg1}.pro
testvalue_${arg1}.pro
EOF
done
请注意,我还将{arg1}更改为$ {arg1},因为展开变量需要美元符号。
shell脚本中的for
循环将遍历in
关键字后的每个值。在上面的示例中,它会将arg1
设置为value1
,然后执行循环的内容,然后继续并将arg1
设置为value2
并再次执行。
您还可以将值存储在变量中:
values_to_test="value1 value2"
for arg1 in $values_to_test
do
idl <<EOF
.rnew testvalue_${arg1}.pro
testvalue_${arg1}.pro
EOF
done
请记住,这会将单词拆分和路径扩展应用于values_to_test
,因此您需要确保所有值都不包含问号,方括号,星号,空格,制表符或换行符。
如果它让您担心,您可以通过在循环运行之前在脚本中运行set -f
来禁用路径扩展(从而允许使用问号,方括号和星号)。