特別なドル記号シェル変数とは何ですか?


782

Bashでは、一貫して意味のある特別な値を保持するいくつかの変数があるようです。例えば、

./myprogram &; echo $!

バックグラウンドのプロセスのPIDを返しますmyprogram$?現在のTTYだと思うような他のものを知っています。他にありますか?


15
それらのいくつかはBashのみではありません。これらは他のBourne関連のシェルでも使用されており、実際にはPOSIXで指定されています。
追って通知があるまで一時停止。

1
何について:IFS = $ '\ n'を参照してください:stackoverflow.com/questions/4128235/...
SGU

1
@sguこれはパラメータではありません。それは特別なタイプの引用です。$'\n'有向グラフの交換から生じるリテラルの改行文字である\nASCII 10で
chepner

あなたが探してここに来た場合${1}${*}など、中括弧はただ曖昧さ回避のためのもの、そして多くの場合、冗長。単独で${x}は、とまったく同じ$xです。
Tripleee

どういう$!意味ですか?私は承知していますが!$、そうではありません。
Sridhar Sarnobat

回答:


1359
  • $1$2$3、...ある位置パラメータ
  • "$@"すべての位置パラメータの配列のような構成です{$1, $2, $3 ...}
  • "$*"すべての定位置パラメーターのIFS拡張です$1 $2 $3 ...
  • $# 位置パラメータの数です。
  • $- シェルに設定されている現在のオプション。
  • $$ 現在のシェルのpid(サブシェルではない)。
  • $_ 最新のパラメーター(または、起動直後に現在のシェルを起動するコマンドのabsパス)。
  • $IFS (入力)フィールド区切り文字です。
  • $? 最新のフォアグラウンドパイプラインの終了ステータスです。
  • $! 最新のバックグラウンドコマンドのPIDです。
  • $0 シェルまたはシェルスクリプトの名前です。

上記のほとんどは、Bash Reference ManualのSpecial Parametersにあります。シェルによって設定されるすべての環境変数があります

包括的なインデックスについては、リファレンスマニュアルの変数インデックスを参照してください。


2
それらはすべてbashmanページに記載されています。唯一の奇妙な点$_は、MAILPATH変数での使用に関してのみ言及されていることです。
chepner

4
@chepner は、の残りの定義について、特別なパラメーターのman(1) bash下を調べます。$_
kojiro

8
後者が時々失敗するので、私はbashスクリプトの!$代わりに使用し$_ます。
amc

ニースリスト小次郎。この構文に遭遇しました$ {1 + "$ @"}どういう意味ですか?
user178047 2014年

3
@amc:参照してくださいunix.stackexchange.com/questions/271659/...間の違いのために!$$_
トリカス2017

44
  • $_ 最後のコマンドの最後の引数
  • $# 現在のスクリプトに渡された引数の数
  • $*/ $@文字列としてスクリプトに渡される引数のリスト/区切りリスト

私の頭の上から。Google for bash特殊変数。


124
「私はそうしました。彼らは私をここに送りました。」-Bookshopスキット(公式ドキュメント:gnu.org/software/bash/manual/bashref.html#Special-Parameters
greggo

1
$@は文字列で$*あり、区切られたリストだと思います(とにかく、上記の受け入れられた回答によると)。
ラスタジェダイ2016

1
@RastaJedi:"$@"リストに"$*"展開し、単一の文字列に展開します。の特殊な動作は、$@二重引用符内にある場合に適用されます。
キース・トンプソン、

6
これは非常に完全または有用な回答ではないため、反対票が投じられました。「グーグル・イット」と言うことは、特に大多数の人々がここでグーグル検索から来ることを考えると、努力の欠如を示しています。私ができることは、公式ドキュメントへのリンクを追加することです。TBH、私が削除のフラグを立てなかった唯一の理由は、それが質問に対する少なくとも部分的な回答であるためでした。古いことはわかっていますが、編集して詳細を確認してください。
Sean the Bean

15

助けるために何をすべきかを理解し$#$0そして$1、...、$n私はこのスクリプトを使用して、実行します。

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

これを実行すると、代表的な出力が返されます。

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

4
forループで!iはどういう意味ですか?それが実際に私がここにいる理由であり、私はそれを何と呼ぶべきかわからないのでどこにも答えを見つけることができません。
Anthony

7
@Anthonyこれは可変インダイレクションと呼ばれます。あなたは彼の使用法の良い説明をbashで見つけることができます:間接拡張、説明してください?
fedorqui「SO害をやめる」

3

いくつかの例に注意してください。$ 0には、プログラムの名前だけでなく、先頭のパスが含まれている場合があります。たとえば、この2行のスクリプトを./mytry.shとして保存して実行します。

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

出力:

parameter 0 --> ./mytry.sh

これは、Slackware 14.2経由のBashの現在(2016年)バージョンです。


5
$ 0にパスが含まれているかどうかは、そもそもスクリプトの実行方法によって異なります。「./mytry.sh」を実行すると、$ 0に表示されます。「〜/ mytry.sh」と入力すると、フルパスが表示されます(シェルが〜を展開しているため)。「.mytry.sh」を実行すると、「bash」が表示されます。
スティーブフォリー2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.