eat*_*ter 6 bash shell scripting shopt
如果 glob 模式不匹配任何文件,bash将只返回文字模式:
bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#
Run Code Online (Sandbox Code Playgroud)
您可以通过设置nullglobshell 选项来修改默认行为,因此如果没有匹配项,您将获得一个空字符串:
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)
nullglob对于没有 ash 和 dash 的外壳:
IFS="`printf '\n\t'`" # Remove 'space', so filenames with spaces work well.
# Correct glob use: always use "for" loop, prefix glob, check for existence:
for file in ./* ; do # Use "./*", NEVER bare "*"
if [ -e "$file" ] ; then # Make sure it isn't an empty match
COMMAND ... "$file" ...
fi
done
Run Code Online (Sandbox Code Playgroud)
小智 5
此方法比每次迭代检查是否存在更高效:
set q-*
[ -e "$1" ] || shift
for z; do echo "$z"
done
Run Code Online (Sandbox Code Playgroud)
我们用来set将通配符扩展到 shell 的参数列表中。如果参数列表的第一个元素不是有效文件,则 glob 不匹配任何内容。(与一些常见的尝试不同,即使 glob 的第一个匹配项位于名称与 glob 模式相同的文件上,这也能正常工作。)
如果不匹配,则参数列表包含单个元素,我们将其移走,以便参数列表现在为空。那么for循环将根本不会执行任何迭代。
否则,我们循环遍历 glob 扩展成的参数列表(这是没有in elementsafter时的隐式行为for variable)。