2012-05-16 5 views
2

В настоящее время я пытаюсь создать сценарий bash, который будет проверять внутри каждой папки users/Library/Mail, чтобы узнать, существует ли папка с именем V2. Сценарий должен создать массив с каждым элементом в массиве, являющимся пользователем, а затем повторить через каждого из этих пользователей, проверяя их домашнюю папку для вышеуказанного содержимого с субтитрами. Это то, что я до сих пор:Looping через массив в bash

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

Работал отлично. Спасибо! –