在bash中循环遍历数组

时间:2012-05-16 20:23:46

标签: arrays macos bash loops if-statement

我目前正在尝试创建一个bash脚本,该脚本将检查每个users / Library / Mail文件夹的内部,以查看是否存在名为V2的文件夹。该脚本应创建一个数组,其中数组中的每个项目都是用户,然后遍历每个用户,检查其主文件夹中是否有上述标题内容。这就是我到目前为止所做的:

#!/bin/bash

cd /Users

array=($(ls))

for i in ${array[@]}
do

if [ -d /$i/Library/Mail/V2 ]

then
    echo "$i mail has been upgraded."
else 
    echo "$i FAIL"

fi

done

1 个答案:

答案 0 :(得分:5)

当您拥有带空格的用户名时,从ls的输出填充数组会导致严重问题。请改用glob表达式。此外,使用[ -d $i/... ]同样会破坏带空格的名称 - 使用[[ -d $i/... ]][[ ]]构造具有自己的语法规则且不需要引用)或[ -d "$i/..." ] (带引号)。

类似地,您需要双引号"${array[@]}"以避免字符串拆分与使用两个空格拆分名称,如下所示:

cd /Users
array=(*)
for i in "${array[@]}"; do
  if [[ -d $i/Library/Mail/V2 ]]; then
    echo "$i mail has been upgraded."
  else 
    echo "$i FAIL"
  fi
done

那就是说,你根本不需要一个数组:

for i in *; do
  ...check for $i/Library/Mail/V2...
done