この文脈で$ {1:0:2}はどういう意味ですか?


19

以下に表示されているコードを調べています。行/列の引数が-rまたはで始まる場合、入力をチェックします-c${1:0:2}この文脈ではどういう意味ですか?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi

7
使用しているシェルを質問に含める必要があります。これはおそらくbashです。
ラファエルアーレンス

2
これは、コマンドライン引数を解析するために行われたようです。おそらく、あなたはあなたの人生(またはこれをした人の人生)を知りたい、getoptまたはgetoptsもっと簡単にしたいと思うでしょう。
カルロスキャンデロス

回答:


31

これは、シェルのサブストリング拡張(パラメーター拡張のサブクラス)パターンです。

形式は次のとおりです。

${parameter:offset:length}

インデックスは0から始まります。

たとえば、変数がある場合foo${foo:0:2}最初の2文字(位置0から次の2文字)が得られます。

例:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

あなたの場合、最初の数字、1は変数名を指します$1。これは、コマンドライン(メインプログラム内)を介して渡される最初の引数、または関数に渡される最初の引数です。

したがって、あなたの場合、次の"${1:0:2}"ようになります:

  • インデックス0から始まる部分文字列、つまり最初の文字の抽出を開始します

  • 次の2文字まで続行します

そのため、操作後、入力文字列の最初の2文字(0と1でインデックス付け)を取得します。

[ "${1:0:2}" != $rowArgName ]そして[ "${1:0:2}" != $colArgName ]、出力subtringは、いくつかの他の文字列と等しいかどうかをチェックされています。


1
基本的に、それはかどうか、ユーザーのためにチェックされて$ 1提供-c-r、おそらくより良いで実装されているgetopts
Sergiy Kolodyazhnyy

15

以下からの小さな抜粋man bash

$ {parameter:offset:length}

サブストリング拡張。で指定した文字から始まるlength値の文字 まで展開しparameterますoffset。パラメータがある場合@、添字によってインデックス配列@または*、あるいは連想配列名以下に説明するように、結果は異なります。lengthが省略された場合、値でparameter指定された文字で始まり、値のoffset 最後まで拡張される値のサブストリングに展開されます。 length および offset は算術式です(下記の算術評価を参照)。


5

これは、変数からの単純な部分文字列抽出です。問題の変数は、スクリプトの最初のパラメーターです(これは1)です。

変数FOOがある場合、その値の最初の2文字はで確認できます${FOO:0:2}。同じことが、最初の引数を使用した例で行われています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.