bash 脚本:{dir1,dir2,dir3} 扩展未按预期从变量中工作,用于选择随机文件

Oka*_*key 6 command-line bash scripts

我有一个问题,这个简单的脚本(选择一个随机文件):

#!/usr/bin/env bash
set -x
srcDir="/home/user/Desktop/wallPapers/{dir1,dir2,dir3}"
randomFile=$(find "$srcDir" -type f -iname "*.jpg" | shuf -n 1)
printf '[%s]\n' $randomFile
set +x
Run Code Online (Sandbox Code Playgroud)

问题是,虽然我可以在命令行输入这个(并且工作得很好):

find /home/user/Desktop/wallPapers/{dir1,dir2,dir3} -type f -iname "*.jpg"
Run Code Online (Sandbox Code Playgroud)

然后 bash 调试设置命令(set -x 和 +x)告诉我,由于某种原因,bash 既用单引号将目录字符串括起来,又用单引号替换了双引号?

./script.sh
+ srcDir='/home/user/Desktop/wallPapers/{dir1,dir2,dir3}'
++ find '/home/user/Desktop/wallPapers/{dir1,dir2,dir3}' -type f -iname '"*.jpg"'
find: ‘/home/user/Desktop/wallPapers/{dir1,dir2,dir3}’: No such file or directory
+ randomFile=
+ printf '[%s]\n'
[]
+ set +x
Run Code Online (Sandbox Code Playgroud)

我明白,这就是 bash 在脚本运行时看到的:

find '/home/user/Desktop/wallPapers/{dir1,dir2,dir3}' -type -iname '*.jpg'
Run Code Online (Sandbox Code Playgroud)

这会导致“没有这样的文件或目录”-消息,非常非常烦人......我不明白,为什么它会插入这些单引号,我想改用双引号,就像在命令行上一样......谁能解释一下,我会很高兴的,谢谢!

ste*_*ver 11

大括号扩展不会发生在变量赋值中,如下所述:

为什么波浪号前缀在赋值之前扩展,但大括号不会

在其他情况下,引号也会阻止大括号扩展。

即使您确实设法srcDir扩展到目录列表,在find命令中再次引用它也会导致它被视为单个参数而不是 3 个单独的路径。

在 bash 中执行此操作的正确方法可能是使用数组:

#!/usr/bin/env bash
set -x
srcDir=("/home/user/Desktop/wallPapers/"{dir1,dir2,dir3})
randomFile=$(find "${srcDir[@]}" -type f -iname "*.jpg" | shuf -n 1)
printf '[%s]\n' "$randomFile"
set +x
Run Code Online (Sandbox Code Playgroud)