如果 glob 模式不匹配任何文件,bash
将只返回文字模式:
bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#
Run Code Online (Sandbox Code Playgroud)
您可以通过设置nullglob
shell 选项来修改默认行为,因此如果没有匹配项,您将获得一个空字符串:
bash-4.1# shopt -s nullglob
bash-4.1# echo nonexistent-file-*
bash-4.1#
Run Code Online (Sandbox Code Playgroud)
那么在 中有一个等效的选项ash
吗?
bash-4.1# ash
~ # echo nonexistent-file-*
nonexistent-file-*
~ # shopt -s nullglob
ash: shopt: not found
~ #
Run Code Online (Sandbox Code Playgroud) 我发现这shopt -s nullglob
显然禁用了文件和目录的制表符完成,并shopt -u nullglob
恢复了它。为什么目录的制表符完成显然依赖于nullglob
未设置?
我4.2.37(1)-release
在 Debian 7 上使用 Bash 。
我需要使用随源提供的 build.sh 构建一个库。它包含一个 globstar 路径 ( src/**/*.java
)。我启用了 globstarshopt -s globstar
并且所有工作都很好地从终端但是从 bash 文件:
#!/bin/bash
ls **/*.java
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ls: cannot access **/*.java: No such file or directory
Run Code Online (Sandbox Code Playgroud) 当我循环浏览所有文件时,foo
我会这样做
for f in foo* ; do echo "result = $f" ; done
Run Code Online (Sandbox Code Playgroud)
问题是当我没有文件开始时foo
:
result = foo*
Run Code Online (Sandbox Code Playgroud)
意味着循环执行一次,即使没有文件开始foo
.
这怎么可能?如何循环遍历所有文件(如果没有文件则不循环)?
当我在 bash 中设置 nullglob 时:
shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)
然后声明一个关联数组:
declare -A arr=( [x]=y )
Run Code Online (Sandbox Code Playgroud)
我无法取消设置数组中的特定键:
unset arr[x]
echo ${#arr[@]} # still 1
Run Code Online (Sandbox Code Playgroud)
但是,取消设置nullglob
使此操作像我期望的那样工作:
shopt -u nullglob
unset arr[x]
echo ${#arr[@]} # now it's 0; x has been removed
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我不明白 shell globbing 如何与这种情况相关。我已经在 bash 4.4.19 和 5.0.0 上测试过了。
我在 shell 脚本中有一行如下所示:
java -jar "$dir/"*.jar
Run Code Online (Sandbox Code Playgroud)
,因为我只想执行该文件夹中碰巧命名的任何 jar 文件。但这并不像我预期的那样工作。我收到错误消息:
Error: Unable to access jarfile [folder-name]/*.jar
Run Code Online (Sandbox Code Playgroud)
它按字面意思使用“*”字符,而不是进行我想要的替换。我该如何解决?
编辑:它现在正在工作。我只是有错误的文件夹前缀:/对于任何想知道的人,这是正确的方法。