2016-09-12 5 views
0

Я здесь новый. Я пытаюсь написать сценарий de-bloat для Android. Ниже мой код: -Как читать пробелы в цикле FOR

#/system/bin/sh 
clear 
list=$(cat <<'EOF' 
Beauty\ Plus 
blackmart 
Cam\ Scanner 
Tencent 
EOF 
) 

for f in $(echo "$list"); 
do 
if [ -e /sdcard/$f* ]; 
    then 
    rm -rf /sdcard/$f* 
    echo -e "Deleted /sdcard/$f*." 
else 
    echo -e "/sdcard/$f* not found." 
fi 
done 

Теперь вот вопрос, он считывает и вхождение с космическими как различными записями. Я убедился, что использую эхо с переменными, заключенными в кавычки.

Если я просто пытаюсь

echo "$list" 

Затем она дает желаемый результат. Я также пробовал использовать

echo "$list" | while read f 
do 
echo $f 
done 

Но он также дает тот же результат. Пожалуйста, помогите мне с этим. Вывод должен быть таким: -

Beauty\ Circle 
Cam\ Scanner 

так, что я пишу мой дальнейший код, как: -

for f in $(echo "list"); 
do 
rm -rf /sdcard/$f 
echo -e "Removed \/sdcard\/$f" 
done 

Спасибо.

PS: Я не хочу использовать

rm -rf /sdcard/$f* 
+0

Этот вопрос имеет особое значение для хранения целых команд, а не только аргументов. – chepner

ответ

2

Если вам действительно нужно, чтобы запустить сценарий с /bin/sh (который может быть оболочка, которая не поддерживает массивы), вам нужно использовать while цикл вместо for цикла:

while IFS= read -r f; do 
    rm -rf /sdcard/"$f" 
    printf 'Removed /sdcard/%s\n' "$f" 
done <<EOF 
Beauty Plus 
blackmart 
Cam Scanner 
Tencent 
EOF 

Если вы можете использовать #!/bin/bash, то вы можете использовать for цикл для перебора массива вместо обычного параметра.

list=("Beauty Plus" 
blackmart 
"Cam Scanner" 
Tencent 
) 
for f in "${list[@]}"; do 
    rm -rf /sdcard/"$f" 
    printf 'Removed /sdcard/%s\n' "$f" 
done