我有一个问题,这个简单的脚本(选择一个随机文件):
#!/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)
这会导致“没有这样的文件或目录”-消息,非常非常烦人......我不明白,为什么它会插入这些单引号,我想改用双引号,就像在命令行上一样......谁能解释一下,我会很高兴的,谢谢!
我有一个烦人的问题,我想要一个脚本来搜索生成文件(使用 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)