前提・実現したいこと
あるシェルスクリプトを見ていて,分からないことが出てまいりまして
どうしても理解できず,質問させて頂くことにしました.
シェルはzshです.
処理としては,
zparseopts
コマンドで,コマンドラインオプションのチェックを行っています.
= = =
コードは後述「該当のソースコード」のセクションに書くとしまして,
該当のコードの箇所を記述しながら進めさせていただきたいと思います.
質問は,大きく2つです.
1) --
とは?
sh
1zparseopts -D -A opthash -- i
オプション -i
の解析を行っていると思います.
上述コードで良く分かっていないのが,--
の箇所です.
これは,必ず必要なものなのでしょうか.
そして,必ず最初に指定するべきものなのでしょうか.
この --
の位置づけが,いまひとつ飲み込めておりません.
この --
の意味についてご教示頂ければと思っております.
2) 条件文,そして,どうして,${:--}
なのか
該当の箇所になります.;
sh
1for optionCheck in "$@"; 2do 3 if [ ${optionCheck[(i)${:--}]} -eq 1 ]; then 4 ... 5 fi 6done
まず,if
文の条件でして,これが何を評価しているのかが,良く理解できていません.
確かにコマンドラインオプションですと,1
,そうでない,普通の引数だと2
を返しています.
[${配列名[(i)条件]
,または,[${連想配列名[(i)キー名]}]
のどちらかと思ったのですが,どうもいずれでもないようです.
この if
文は,何を評価しているのでしょうか.
c.f.:
» zsh の配列操作の基本から応用まで - Qiita
» zshの連想配列の使い方まとめ - Qiita
そして,ここではもう一つあります.
条件文にある ${:--}
についてです.
これは,${name:-word}
の形式のパラメータ展開で,
オプションのハイフン -
があるか,で見ているのでしょうが,
${:--}
と ${name:-word}
で言いますとname
の部分を省略したスタイルで行っているのが
どうしても理解できないでおります.
if [ ${optionCheck[(i)-]} -eq 1 ]; then
でも良いのではないか,と思ってしまうのです.
どうして,${:--}
のスタイルで評価するのでしょうか.
c.f.
» zshexpn(1): zsh expansion/substitution - Linux man page
発生している問題・エラーメッセージ
上述の通りです.
該当のソースコード
sh
1#!/bin/zsh -eu 2 3local -A opthash 4zparseopts -D -A opthash -- i 5 6if [ -n "${opthash[(i)-i]}" ]; then 7 readonly HAS_OPTIONS="Yes" 8else 9 readonly HAS_OPTIONS="No" 10fi 11 12for optionCheck in "$@"; 13do 14 if [ ${optionCheck[(i)${:--}]} -eq 1 ]; then 15 echo "Specified option is incorrect." 16 exit 1 17 fi 18done
試したこと
- について
» zsh: 22 Zsh Modules. 'zparseopts'
» zshで簡単にコマンドライン オプションを解析する - Qiita
- について
» zshexpn(1): zsh expansion/substitution - Linux man page 'Parameter Expansion'
sh
1% printf '%s\n' ${:--} 2-
補足情報(FW/ツールのバージョンなど)
sh
1% sw_vers 2sw_vers 3ProductName: Mac OS X 4ProductVersion: 10.15.7 5BuildVersion: 19H15 6% zsh --version 7zsh --version 8zsh 5.8 (x86_64-apple-darwin19.3.0)
稚拙な内容で大変恐縮ではありますが,
ご教示のほど,何卒,よろしくお願いします.
以上です.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。