循环命令行更改文件中的变量

时间:2016-01-14 15:57:28

标签: linux loops for-loop idl

我有一个编译并运行一段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

我认为我的逻辑是正确的。我错过了什么?

2 个答案:

答案 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来禁用路径扩展(从而允许使用问号,方括号和星号)。