【问题标题】:if-then inside a for loop doesn't execute cmds to all array entriesif-then 在 for 循环中不会对所有数组条目执行 cmd
【发布时间】:2013-11-29 11:43:54
【问题描述】:

运行以下命令会返回回显文本行,但实际上只有数组中的第一个应用程序会被触及:

#!/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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 做到了 - 谢谢。尝试学习“真正”的脚本编写方式。
    • @da4 在这种情况下,您可能会发现ShellCheck 很有用。通过它运行您的脚本时,它说“我似乎未使用。验证它或导出它。”
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2019-08-09
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多