小编Oka*_*key的帖子

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

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

#!/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)

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

command-line bash scripts

6
推荐指数
1
解决办法
895
查看次数

bash shell脚本,在makefile中搜索复杂行(shell参数扩展问题)

我有一个烦人的问题,我想要一个脚本来搜索生成文件(使用 grep)以查找特定烦人的行。最好具体说明这个问题:

someMakefile(最小的 Makefile):

#!/usr/bin/env bash
echo bla bla
OBJ_DIR='something'
EXE_FILE='my_exe'
cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
echo 'doing something else now'
Run Code Online (Sandbox Code Playgroud)

testScript.sh(测试是否存在困难线):

cat testScript.sh

#!/usr/bin/env bash
set -x
foundNumLines = $(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
echo "foundNumLines = $foundNumLines"
set +x
Run Code Online (Sandbox Code Playgroud)

从命令行(这确实有效):

$ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
5:cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
Run Code Online (Sandbox Code Playgroud)

从脚本(这不起作用,我无法弄清楚如何使其工作):

$ ./testScript.sh 
++ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
+ foundNumLines = 5:cp '$(OBJ_DIR)/$(EXE_FILE)' ../bin/.
./testScript.sh: line 4: foundNumLines: command not found
+ echo 'foundNumLines = '
foundNumLines …
Run Code Online (Sandbox Code Playgroud)

command-line bash scripts

3
推荐指数
1
解决办法
400
查看次数

标签 统计

bash ×2

command-line ×2

scripts ×2