【问题标题】:Looping through an Array in bash在bash中循环遍历数组
【发布时间】:2012-05-24 11:08:21
【问题描述】:

我目前正在尝试创建一个 bash 脚本,该脚本将检查每个用户 /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

【问题讨论】:

  • 在未来,请描述为什么以及如何您正在做的事情不起作用,或者为什么您在这里询问它。

标签: arrays macos bash loops if-statement


【解决方案1】:

当您的用户名带有空格时,从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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多