如何在FOR循环中读取空格

时间:2016-09-12 19:55:57

标签: linux bash loops

我是新来的。我正在尝试为Android编写一个de-bloat脚本。 以下是我的代码: -

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

如果我尝试

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

谢谢。

P.S:我不想用

rm -rf /sdcard/$f*

1 个答案:

答案 0 :(得分:2)

如果您确实需要使用/bin/sh(可能是不支持数组的shell)运行脚本,则需要使用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