web-dev-qa-db-ja.com

bash- VAR = $ {[number]:-default}で変数を定義する

私は使用するスクリプトに出くわしました

VAR1=${1:-8}

VAR2=${2:-4}

私は 他のいくつかの質問 から見ることができ、いくつかのコードで遊んでいます

VAR1=${VAR2:-8}

存在する場合は、VAR1VAR2の値で作成されます。 VAR2が未設定の場合、VAR1はデフォルトで値8になり、VAR2は未設定のままになります。つまり、このコマンドの後、echo VAR2は何も返しません。

それで、私の質問はコードの最初の行が何をするかです。変数名を数字で始めることはできないため、VAR1が1または1という名前の変数に設定されていないことは明らかです。確かにこれには理由があり、それは単なる無意味な難読化ではありませんか?

2
barriboy

${1:-8}および${2:-4}で使用される変数は、位置パラメータ$1および$2です。これらは、コマンドラインでスクリプト(またはシェル関数)に渡された値を保持します。それらが設定されていない場合、言及する変数置換では、代わりにデフォルト値の8および4(それぞれ)が使用されます。

スクリプトまたはシェル関数は任意の(?)数の引数を取ることができ、これらはスクリプト/関数で$1$2、...を使用することで取得できます。 9を超える位置パラメータの値を取得するには、${10}${11}などを書き込む必要があります。

これは、(少なくとも)2つのコマンドライン引数をとるシェルスクリプトまたはシェル関数で使用される可能性があります。これらの引数にデフォルト値が指定されていない場合は、それらを指定します。

この場合のもう1つの便利な変数置換は${parameter:?word}で、Wordが設定されていない場合はparameterをエラーとして表示します(そしてスクリプトを終了します)。

$ cat script.sh
#!/bin/bash
var1="${1:?Must provide command line argument}"
printf 'I got "%s"\n' "$var1"

$ ./script.sh
script.sh: line 3: 1: Must provide command line argument

$ ./script.sh "Hello world"
I got "Hello world"
5
Kusalananda

位置パラメータ$1 ... $nを参照します。

${1:-default}は、「パラメーター1が未設定または空の場合は、代わりにdefaultを使用する」ことを意味します。

警告:${1:-2}${1: -2}を混同しないでください。 bashでは、後者は$1の最後の2文字で置き換えられます。

例:

$ set --
$ echo "${1:-2}"
2

$ set 345 678
$ echo "${1:-2}"
345

$ echo "${1: -2}"
45
1
xhienne