if-then在for循环内部不会对所有数组条目执行cmds

时间:2013-11-15 22:47:27

标签: arrays bash loops if-statement for-loop

为回显文本行运行以下返回值,但实际只触及数组中的第一个应用程序:

#!/bin/sh

path=/Applications

app[0]="Microsoft Communicator.app"
app[1]="Microsoft Lync.app"
app[2]="Microsoft Messenger.app"
app[3]="Remote Desktop Connection"

IFS=""

for i in ${app[*]}
do
        if [[ -a $path/$app ]];
        then
            chflags hidden $path/$app;
            echo "Hiding $app"
        fi;
done

exit

2 个答案:

答案 0 :(得分:2)

除了Artur R. Czechowski指出的基本问题之外,你真的应该引用所有变量引用(并使用[@]而不是[*])。这是使用空格处理变量的正确方法;设置IFS会有一些工作,但可以破坏其他东西。此外,bash中的行末尾不需要分号。这是我建议的重写:

for i in "${app[@]}"
do
    if [[ -a "$path/$i" ]]  # Double-quotes not strictly needed here, but I consider it a good habit
    then
        chflags hidden "$path/$i"
        echo "Hiding $i"
    fi
done

答案 1 :(得分:1)

在循环中使用$ i而不是$ app,如下所示:

for i in ${app[*]}
do
        if [[ -a $path/$i ]];
        then
            chflags hidden $path/$i;
            echo "Hiding $i"
        fi;
done