【问题标题】:Command Line for Loop to Change Variables in File用于循环更改文件变量的命令行
【发布时间】:2016-01-15 00:10:48
【问题描述】:

我有一个脚本可以编译和运行一段 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

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

【问题讨论】:

    标签: linux loops for-loop idl


    【解决方案1】:

    首先,您需要在变量名之前放置$,以便 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
    

    【讨论】:

    • @user3093032 在 stackoverflow 我们通过接受回答说“谢谢”)
    【解决方案2】:

    我对这个问题的具体细节有点模糊,但听起来你想将“value1”和“value2”放在 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 来禁用路径扩展(从而允许使用问号、方括号和星号)。

    【讨论】:

    • 非常感谢!并进行详细解释。我现在已经开始工作了。
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2017-09-16
    • 2019-07-05
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多