bash执行变量(使用包含在if语句中创建的变量的命令)

时间:2016-01-18 12:56:36

标签: bash variables if-statement command local-variables

您好我的脚本如下:

mode= loop1 or loop2
command1="screen -dm -S $name feh *.jpg"

if [ "$(screen -S loop1 -X select . ; echo $?)" != 0 ] && [[ $mode != "loop1" ]];then 
name="loop1"
eval "$command1"
elif [ "$(screen -S loop2 -X select . ; echo $?)" != 0 ] && [[ $mode != "loop2" ]] ;then
name="loop2"
eval "$command1"
else 
echo "error"
fi

基本上检查是否有名为loop1的屏幕会话或loop2如果没有,它会评估变量$ command1里面有另一个变量$ name,当bash进入循环时它应该有变化。问题是变量$ command1在if语句开始之前全局初始化,并且在那个时间内没有变量$ date。

当循环计算$ command1时,它不会在循环语句之前使用变量$ name setted line。

我需要传递给变量名的变量command1值

你有任何线索吗?

3 个答案:

答案 0 :(得分:2)

正如评论中已经指出的那样,这是一个FAQ:http://mywiki.wooledge.org/BashFAQ/050

一个明智的解决方法是将命令重构为参数化函数。条件也应该清除椒盐卷饼逻辑 - 打印命令的退出代码并将其与字符串零进行比较是重新实现内置if条件的基本功能的笨拙方式!

mode=loop1 # or loop2
run_feh (} {
    screen -dm -S "$1" feh *.jpg
}

no_screen_of_loop () {
    ! screen -S "$1" -X select . && [[ "$2" != "$1" ]]
}

if no_screen_of_loop "loop1" "$mode"; then
    run_feh "loop1"
elif no_screen_of_loop "loop2" "$mode"; then
    run_feh "loop2"
else 
    echo "error" >&2    # note stderr
fi

如果在有条件之后有$name的值,则需要稍微额外的重构。

答案 1 :(得分:1)

虽然chepner 完全正确,但您会遇到Bash FAQ 050问题而且您不应该尝试这样做。

此处更直接的问题是评估订单问题。

当shell运行此行command1="screen -dm -S $name feh *.jpg"时,它正在展开$name(正如您所注意到的那样 之前 为名称变量赋值())。

切换这些(行组)行的顺序可以解决此问题,但不会对其他 Bash FAQ 050问题执行任何操作。

此外,[ "$(screen -S loop1 -X select . ; echo $?)" != 0 ]是一种低效且不必要的方法来测试命令以获得成功的返回码。

[是一个命令(也称为test)。它不是if语句语法的组成部分。

shell中if语句的语法是if <command>; then ... fi,其中<command>可以是适当返回返回码的任何内容。 [恰好是该空间中常用的命令。

但是如果您的命令(在这种情况下为screen -S loop1 -X select .已经正确地返回成功/失败,那么您可以完全避免[并且只使用您的命令。

if ! screen -S loop1 -X select . && [[ $mode != "loop1" ]];then 
    name="loop1"
elif ! screen -S loop2 -X select . && [[ $mode != "loop2" ]] ;then
    name="loop2"
else 
    echo "error"
fi

答案 2 :(得分:0)

应该有效:

function action1(){
    //some code for action 1
}
function action2(){
    //some code for action 2
}
function action3(){
    //some code for action 3
}

Function loopingAround(count, action){   
    for( a = 0; a < count; a++ ) {
        action();    
    }

}

google.maps.event.addDomListener( div, 'click mouseover mouseout', function( event ) {

    if(event == 'click'){
        action = action1;
    }
    if(event == 'mouseover'){
        action = action2;
    }
    if(event == 'mouseout'){
        action = action3;
    }

    loopingAround(count, action);
})