開発中のスクリプトには2つのパラメータと3番目のオプションのパラメータを使用したいと思います。私はbashに初めて触れたので、私が望むことをする次のコードをコピーして理解しようとしました。
while [[ $# -gt 0 ]]; do
case $1 in
-f1|-fasta1)
FASTA1=$2
shift
;;
-f1=*|-fasta1=*)
FASTA1=${1#*=}
;;
-d|-directory)
DIRECTORY=$2
shift
;;
-d=*|-directory=*)
DIRECTORY=${1#*=}
;;
-f2|fasta2)
FASTA2=$2
shift
;;
-f2=*|-fasta2=*)
FASTA2=${1#*=}
;;
-*)
echo "Invalid option: $1" >&2
exit 1
;;
--)
# Do FILES+=("${@:2}") maybe
break
;;
*)
# TODO
# Do FILES+=("$1") maybe
;;
esac
shift
done
問題は、このコードには、コードが何であるかを理解していない部分が多いことです。たとえば、 -gt
各1#*=
パラメータを最初の行に2回書き込む必要があるのはなぜですか?
-f1|-fasta1)
FASTA1=$2
shift
そして2つ
-f1=*|-fasta1=*)
FASTA1=${1#*=}
誰かがその説明をどこで見つけることができるか教えてもらえますか?私はチュートリアルを読みましたが、より簡単な例ではこれを理解することはできません。
答え1
公開したコードは、実際にコマンドライン引数を解析する非常に「手動」の方法です。一般に、この目的のために使用getopt
および/または提供するgetopt_long
ことは良い慣行と見なされます。また、-fasta1
1つのダッシュに「長いオプション」(例:)を導入すると、通常は2つのダッシュが前に来ると予想されます。この問題コマンドラインパラメータフォーマット情報)
つまり、あなたが見るほとんどの内容はデフォルトのシェル構文です。文字列演算、case
氏名そしてテスト構造。
このステートメントは特別な引数、つまりコマンドライン引数の数を取り、その値が0より大きいかどうかを確認する[[ $# -gt 0 ]]
テストです。引数処理ルーチンは、処理後の最初のコマンドライン引数を削除して引数の数を減らすステートメントを使用するため、これはループの条件として使用されます。すべてのパラメーターが処理されたら、オプションの処理ループを完了する必要があります。$#
-gt
while
shift
他の質問について:プログラムは、ユーザーが可能な構文変数で最初のFASTAファイルを指定できるようにしようとします。つまり:
-f1 <filename>
-fasta1 <filename>
-f1=<filename>
-fasta1=<filename>
プログラムはコマンドライン引数を「手動で」繰り返してこれを行います。つまり、常に「現在の最初の」引数($1
)が何であるかを確認し、それを解釈してから、shift
コマンドを使用してそれを削除します(ここですべてのコマンドライン引数は「上に移動します」)。 1"ビット")。
「短い」および「長い」オプション名を許可するために、ステートメントはand(スペースで区切られた構文の場合)とand( - 区切られた構文の場合)を現在の引数としてcase
受け入れます。ただし、構文によってオプションの「値」部分を異なる方法で処理する必要があります。-f1
-fasta1
-f1=*
-fasta1=*
=
- スペースで区切られた構文の場合、最初のFASTAファイルのステートメントはまたは
$1
で-f1
識別されます-fasta1
。プログラムは、オプションの「値」が次のコマンドライン引数にあることを知っているので、その内容を変数に$2
割り当てます。この繰り返しですでに処理されているので、次のコマンドライン引数を削除するには追加の引数が必要です。$2
FASTA1
shift
- -separated構文の場合、
=
最初のFASTAファイルの文は$1
または一致として-f1=*
識別されます-fasta1=*
。これは、オプションの「値」が現在の値の一部であり、$1
文字列操作によって抽出する必要があることを意味します。声明
「値を返します${variablename#pattern}
$variablename
が、最も短い一致文字列を削除することを意味します。pattern
最初から価値」。だから、
「値を返しますが、${1#*=}
$1
最初から最短の一致文字列を削除」を意味し、値からまたはを効果的に削除します。今残っているのはファイル名だけです。*=
-f1=
-fasta1=
シェルプログラミングについてさらに詳しく知りたい場合は、以下をお勧めします。GreyCat&Lhunathのバッシュガイドさらなる読書のため。