私は初心者の Linux ユーザーで、この問題に遭遇しました。
以下のコマンドを実行した場合
set 10 20 30 40 50
shift
shift
の値をどのように見つけます$*
か?
の値を見つける最も簡単な方法$*
は、エコーすることです。
echo $*
示されている 3 つの手順を考えると、次のようにエコーされます。
30 40 50
引用符なしの値は$*
、引用符なしの値と同じであり$@
、シェルスクリプトへのすべての位置引数、またはset
示したようなコマンドによって設定された値 (後続のshift
コマンドによって変更されたもの) で構成されます。それらを二重引用符で囲む"$*"
と、すべての位置パラメーターを含む単一の文字列を表しますが"$@"
、それぞれが位置パラメーターと同一の多数の文字列を表します。より一般的に正しいフォームです。
printf
次のコマンドを使用して、これらの形式の違いを確認できます。
printf "%s\n" $*
printf "%s\n" "$*"
printf "%s\n" $@
printf "%s\n" "$@"
以下を使用すると、それらについてより多くの洞察が得られます。
set -- 10 '20 30' ' 40 50 '
シフトなしで、4 つのprintf
コマンドを使用しました。
printf "X%sX\n" $*
printf "X%sX\n" "$*"
printf "X%sX\n" $@
printf "X%sX\n" "$@"
X は、出力される値の開始と終了をマークするのに役立ちます。出力は次のとおりです。
X10X
X20X
X30X
X40X
X50X
X10 20 30 40 50 X
X10X
X20X
X30X
X40X
X50X
X10X
X20 30X
X 40 50 X
Bash マニュアルの関連セクションは、特殊なパラメーターです。
その少し奇妙です ..... 質問は、 $* の値 ...... まあ、それはコマンドに入れられたすべてのものを表し、したがって位置パラメータに渡されました。
シフトコマンドは、元のコマンドラインにあったすべてのものを1つ左にプッシュします....したがって、10 20 30 40 50 ..... 2回のサシフト(左に2回押す)の後、30 40 50になります$1 ... $2 のような $ で位置/出現を指定することでアクセスできるようになりました
$ set 10 20 30 40 50
$ shift 2
$ echo $*
30 40 50
簡単に言えば ....
個々の値にアクセスしたい場合.... $1 、 $2 .... を使用するだけです。ここでは、$1 は 30 になり、$2 は 40 になります。
$# を使用しているパラメーターの数を知りたい
$ echo $#
3
これは役に立ちますか?
bash
マニュアルページから:
set
: オプションが処理された後に残っている引数は、位置パラメータの値として扱われ、$1
、$2
、 ... に順番に割り当てられます$n
。
と:
shift [n]
: The positional parameters fromn+1 ...
are renamed to$1 ....
Parameters associated by the numbers$#
down to$#-n+1
are unset...n
が指定されていない場合は、1 と見なされます。
だからあなたのset
セット:
$1 = 10
$2 = 20
$3 = 30
$4 = 40
$5 = 50
そして、shift
コマンドは他の変数を 1 つずつ破棄し$1
てシャッフルします。$n
これを 2 回行うと、次のようになります。
$1 = 30
$2 = 40
$3 = 50
echo $*
次を使用して、出力を確認できます。
30 40 50