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)
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |