より大きなbashスクリプトを書いていますが、ディレクトリが存在するかどうかをテストするためにこのコードを見つけました。大文字と小文字を区別しない
subsというディレクトリがある場合、このスクリプトはパスを印刷し、ディレクトリが2つ以上の場合はそのパスも印刷します。
ところで、印刷機能が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は引数の数だけこの形式を使用します。だからループが組み込まれています。
文字列に3つの%文字列がある場合は、一度に3つのパラメータを使用してください。最後のラウンドでは、必要に応じて1つまたは両方のパラメータが空白/ 0にデフォルト設定されます。
"$@" は $1, $2, ... 現在の引数をすべて引用符で囲んだ文字列に拡張します。
印刷形式(最初のパラメータ)
\ t(エスケープt)はタブ文字で、8行のインデントです。
%sは次の未使用引数を取得し、文字列として挿入します。
\ n(エスケープされたn)は、次の行が列の下で始まるようにする改行文字です。
man bash
printf の複数ページを含むすべての組み込みコマンドを表示するコマンドです。
man -s 1 printf
外部コマンド /bin/printf の効果を表示するコマンドです。 bash組み込みと非常によく似ていますが(同じではありませんが)、見つけるのは簡単です。