我正在编写一个更大的 bash 脚本,并且我找到了这个代码片段来测试目录是否存在不区分大小写
现在,如果我现在有一个名为 subs 的目录,此脚本将打印路径,如果我有两个(或更多)目录,它也会打印这些路径。
但我真的不明白怎么做,因为只有 1 个打印函数,而且没有循环?
我想这与'\t%s\n' "$@"代码...有人可以向我解释一下吗? (试图理解)
dir=~/test1
shopt -s nullglob nocaseglob
set -- $dir/[s]ubs/
if [ "$#" -gt 0 ]; then
echo 'There is at least one directory called "subs" (case ignored):'
printf '\t%s\n' "$@"
fi
答案1
Shell printf 使用该格式的次数与它具有参数的次数一样多。所以它有一个内置循环。
如果字符串中有三个 % 字符串,则它将一次使用三个参数。最后一轮,如果需要,它会将一个或两个参数默认为空白/零。
“$@”扩展所有 $1、$2、... 当前参数以分隔带引号的字符串。
在打印格式中(第一个参数)
\t(转义的 t)是一个制表符,将缩进 8 个空格。
%s 获取下一个未使用的参数并将其作为字符串插入。
\n(转义的 n)是一个换行符,将使下一行在列下方开始。
man bash
是一个显示所有内置命令的命令,包括几页有关 printf 的内容。
man -s 1 printf
是一个命令,显示外部命令 /bin/printf 的作用。它与内置的 bash 非常相似(但不完全相同),但更容易找到。