您好我的脚本如下:
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值
你有任何线索吗?
答案 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);
})