【问题标题】:How to read spaces in FOR loop [duplicate]如何在 FOR 循环中读取空格 [重复]
【发布时间】:2016-09-12 19:55:56
【问题描述】:

我是新来的。我正在尝试为 Android 编写一个去膨胀脚本。 下面是我的代码:-

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

【问题讨论】:

  • 这个问题的重点是存储整个命令行,而不仅仅是参数。

标签: linux bash loops


【解决方案1】:

如果您确实需要使用/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

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2015-10-01
    • 2020-06-17
    • 2020-10-18
    • 2017-05-02
    • 2011-12-04
    相关资源
    最近更新 更多