【问题标题】:Unwanted double quotes around members of Array in Shell script [duplicate]Shell脚本中Array成员周围不需要的双引号[重复]
【发布时间】:2020-07-21 20:13:08
【问题描述】:

我编写了这段代码来创建一个包含我的图像的数组:

listOfImages=(`find . -iname "*.png" 2>/dev/null`)

但是路径中可能有空格,所以我必须用双引号将每个元素括起来:

listOfImages=(`find . -iname "*.png" 2>/dev/null | sed -E -e 's/(.*)/"\1"/'`)

通常当我们打印一个数组的元素时,它不应该打印双引号,例如:

x=("a" "b")
for i in ${x[@]}
do
echo "$i"
done

然后打印出来:

a
b

但是在我的图像数组上,它会打印双引号,这会导致我脚本中的以下代码出现问题。

演示:

for i in ${listOfImages[@]}
do
echo $i
done

然后打印出来:

"blocks/glass.png"
"blocks/glass_black.png"

【问题讨论】:

  • mapfile -t -d '' listOfImages < <(find . -iname '*.png' -type f print0),也引用你的变量,"${listOfImages[@]}" 不是${listOfImages[@]}
  • 您还需要引用数组用途 (for i in "${x[@]}")
  • @Shayan :但是当您在sed 命令1 中执行"\1" 时,您自己已将双引号放在那里
  • @user1934428 我还在这一行加上了双引号:x=("a" "b") 但它们没有被打印出来,明白吗?
  • 这完全不同。您的 sed 命令已用单引号括起来,但在这里您没有。如果您写了x=('"a"' "b"),您会看到a 周围的双引号,但不会看到b

标签: bash shell


【解决方案1】:

sed 命令输出中的双引号没有语法意义,即它们不分隔文件名的开头和结尾。它们只是进入数组的字符串中的文字引号。它们以任何方式保护您免受像 my image.png 这样的文件名成为数组中的两个元素。

在让事情变得更复杂之前,我想知道您是否可以使用globstar 进行递归扩展并获取所有以.png 结尾的文件:

shopt -s globstar # enable recursive expansion of **
listOfImages=( **/*.png )

您几乎总是应该遍历一个数组,例如:

for img in "${listOfImages[@]}" # quotes around the expansion

这些引号具有句法含义,可防止数组中的元素发生分词,因此my image.png 被视为列表中的单个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2019-08-10
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多