サーチ…


前書き

Bashの内部変数の概要。どこで、どのように、いつ使用するか。

Bash内部変数の概要

変数詳細
$* / $@ 関数/スクリプト位置パラメータ(引数)。次のように展開します。

$*$@$1 $2 ...と同じ$1 $2 ... (ただし、引用符を付けないでおくのは一般的に意味がありません)
"$*""$1 $2 ..."と同じ"$1 $2 ..." 1
"$@""$1" "$2" ...と同じ"$1" "$2" ...
引数は$ IFSの最初の文字で区切られていますが、スペースである必要はありません。
$# スクリプトまたは関数に渡される位置パラメータの数
$! バックグラウンドに置かれた最後のジョブの最後の(パイプラインの場合は一番大きい)コマンドのプロセスID(ジョブ制御が有効な場合、ジョブのプロセスグループIDと必ずしも同じではないことに注意してください)
$$ bashを実行したプロセスのID
$? 最後のコマンドの終了ステータス
$n 位置パラメータ(n = 1,2,3、...、9)
${n} 位置パラメータ(上記と同じですが、nは9を超えることができます)
$0 スクリプトでは、スクリプトが呼び出されたパス。 bash -c 'printf "%s\n" "$0"' name args'name (インラインスクリプトの後の最初の引数)、それ以外の場合、 bash受け取ったargv[0]
$_ 最後のコマンドの最後のフィールド
$IFS 内部フィールドセパレータ
$PATH 実行可能ファイルのルックアップに使用されるPATH環境変数
$OLDPWD 以前の作業ディレクトリ
$PWD 現在の作業ディレクトリ
$FUNCNAME 実行呼び出しスタック内の関数名の配列
$BASH_SOURCE FUNCNAME配列内の要素のソースパスを含む配列。スクリプトパスを取得するために使用できます。
$BASH_ALIASES 現在定義されているすべての別名を含む連想配列
$BASH_REMATCH 最後の正規表現のマッチの配列
$BASH_VERSION バッシュバージョン文字列
$BASH_VERSINFO Bashバージョン情報を持つ6つの要素の配列
$BASH 現在実行中のBashシェル自体への絶対パス( argv[0]$PATHの値に基づいたbashによって経験則的に決定されました;コーナーケースでは間違っているかもしれません)
$BASH_SUBSHELL Bashのサブシェルレベル
$UID 実数(異なる場合は有効ではありません) bash実行しているプロセスのユーザーID
$PS1 プライマリコマンドラインプロンプト。 PS *変数の使用を参照してください。
$PS2 セカンダリコマンドラインプロンプト(追加入力用)
$PS3 第3次コマンドラインプロンプト(selectループで使用)
$PS4 第4のコマンドラインプロンプト(冗長出力で情報を追加するために使用)
$RANDOM 0〜32767の擬似ランダム整数
$REPLY 変数が指定されていない場合、デフォルトでreadによって使用される変数。また、ユーザ指定の値を返すためにselectによって使用されselect
$PIPESTATUS 最後に実行されたフォアグラウンドパイプラインの各コマンドの終了ステータス値を保持する配列変数。

変数代入は前後にスペースを入れてはいけません。 a=123 not a = 123 。後者(スペースで囲まれた等号)は、コマンドaを引数=123で実行することを意味しますが、文字列比較演算子(構文的には[または[[を使用して)。

$ BASHPID

Bashの現行インスタンスのプロセスID(pid)。これは$$変数と同じではありませんが、同じ結果が得られることがよくあります。これはBash 4では新しく、Bash 3では動作しません。

~> $ echo "\$\$ pid = $$  BASHPID = $BASHPID"
$$ pid = 9265  BASHPID = 9265

$ BASH_ENV

スクリプトが呼び出されたときに読み込まれるBashスタートアップファイルを指す環境変数。

$ BASH_VERSINFO

要素に分割された完全なバージョン情報を含む配列。主なバージョンを探している場合は$BASH_VERSIONよりもはるかに便利です:

~> $ for ((i=0; i<=5; i++)); do echo "BASH_VERSINFO[$i] = ${BASH_VERSINFO[$i]}"; done
BASH_VERSINFO[0] = 3
BASH_VERSINFO[1] = 2
BASH_VERSINFO[2] = 25
BASH_VERSINFO[3] = 1
BASH_VERSINFO[4] = release
BASH_VERSINFO[5] = x86_64-redhat-linux-gnu

$ BASH_VERSION

実行中のbashのバージョンを表示します。これにより、高度な機能を使用できるかどうかを判断できます。

~> $ echo $BASH_VERSION
4.1.2(1)-release

$ EDITOR

任意のスクリプトやプログラム(通常はviやemacs)に組み込まれるデフォルトのエディタ。

~> $ echo $EDITOR
vi

$ FUNCNAME

現在の関数の名前を取得するには、次のように入力します。

my_function()
{
    echo "This function is $FUNCNAME"    # This will output "This function is my_function"
}

この命令は、関数の外に入力すると何も返しません。

my_function

echo "This function is $FUNCNAME"    # This will output "This function is"

$ HOME

ユーザーのホームディレクトリ

~> $ echo $HOME
/home/user

$ HOSTNAME

起動時にシステムに割り当てられたホスト名。

~> $ echo $HOSTNAME
mybox.mydomain.com

$ HOSTTYPE

この変数はハードウェアを識別し、どのバイナリを実行するかを決定するのに役立ちます:

~> $ echo $HOSTTYPE
x86_64

$ GROUPS

ユーザーがいるグループの数を含む配列。

#!/usr/bin/env bash
echo You are assigned to the following groups:
for group in ${GROUPS[@]}; do
   IFS=: read -r name dummy number members < <(getent group $group )
   printf "name: %-10s number: %-15s members: %s\n" "$name" "$number" "$members" 
done

$ IFS

ループ時などにbashが文字列を分割するために使用する内部フィールドセパレータ文字列を含みます。デフォルトでは、空白文字: \n (改行)、 \t (タブ)およびスペースです。これを別のものに変更すると、異なる文字を使用して文字列を分割できます。

IFS=","
INPUTSTR="a,b,c,d"
for field in ${INPUTSTR}; do
    echo $field
done 

上記の出力は次のとおりです。

a
b
c
d

ノート:

$ LINENO

現在のスクリプトの行番号を出力します。スクリプトをデバッグするときに大抵役立ちます。

#!/bin/bash
# this is line 2
echo something  # this is line 3
echo $LINENO # Will output 4

$ MACHTYPE

上記の$HOSTTYPEと同様に、これにはOSとハードウェアに関する情報も含まれています

~> $ echo $MACHTYPE
x86_64-redhat-linux-gnu

$ OLDPWD

OLDPWD(OLDP RINT Wの orking Dの irectory)は、最後の前に、ディレクトリが含まれているcdコマンドを実行します。

~> $ cd directory
directory> $ echo $OLDPWD
/home/user

$ OSTYPE

マシン上で実行されているOSのタイプに関する情報を返します。

~> $ echo $OSTYPE
linux-gnu

$ PATH

コマンドのバイナリを検索するための検索パス。一般的な例には、 /usr/bin/usr/local/binます。

ユーザーまたはスクリプトがコマンドを実行しようとすると、 $PATHが検索され、実行権限を持つ一致するファイルが検索されます。

$PATH内のディレクトリは:文字で区切られてい:

~> $ echo "$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin

たとえば、上記の$PATH指定すると、プロンプトでlssと入力すると、シェルは/usr/kerberos/bin/lss 、次に/usr/local/bin/lss 、次に/bin/lss/usr/bin/lssをこの順に実行してから、そのようなコマンドがないと判断します。

$ PPID

スクリプトまたはシェルの親のプロセスID(pid)。つまり、現在のスクリプトまたはシェルを呼び出すよりもプロセスを意味します。

~> $ echo $$
13016
~> $ echo $PPID
13015

$ PWD

PWD(P RINTのW orkingのDの irectory)あなたは、現時点ではである現在の作業ディレクトリ:

~> $ echo $PWD
/home/user
~> $ cd directory
directory> $ echo $PWD
/home/user/directory

$ SECONDS

スクリプトが実行されている秒数。これはシェルに表示されているとかなり大きくなることがあります:

~> $ echo $SECONDS
98834

$ SHELLOPTS

bashのオプションの読み取り専用リストは起動時に提供され、その動作を制御します:

~> $ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

$ SHLVL

bashコマンドが実行されると、新しいシェルが開かれます。 $ SHLVL環境変数は、 現在のシェルが実行されているシェルレベルの数を保持します。

新しいターミナルウィンドウで、次のコマンドを実行すると、使用しているLinuxディストリビューションに基づいて異なる結果が生成されます。

echo $SHLVL

Fedora 25を使用すると、出力は「3」になります。これは、新しいシェルを開くときに、最初のbashコマンドが実行され、タスクを実行することを示します。最初のbashコマンドは、子プロセス(別のbashコマンド)を実行し、最終的なbashコマンドを実行して新しいシェルを開きます。新しいシェルが開くと、他の2つのシェルプロセスの子プロセスとして実行されているため、 "3"の出力が表示されます。

次の例(ユーザーがFedora 25を実行している場合)では、新しいシェルの$ SHLVLの出力は "3"に設定されます。各bashコマンドが実行されると、$ SHLVLは1ずつ増加します。

~> $ echo $SHLVL
3
~> $ bash
~> $ echo $SHLVL
4
~> $ bash
~> $ echo $SHLVL
5

'bash'コマンドを実行する(またはbashスクリプトを実行する)と、新しいシェルが開かれることがわかります。これと比較して、スクリプトのソースは現在のシェルでコードを実行します。

test1.sh

#!/usr/bin/env bash
echo "Hello from test1.sh. My shell level is $SHLVL"
source "test2.sh"

test2.sh

#!/usr/bin/env bash
echo "Hello from test2.sh. My shell level is $SHLVL"

run.sh

#!/usr/bin/env bash
echo "Hello from run.sh. My shell level is $SHLVL"
./test1.sh

実行:

chmod +x test1.sh && chmod +x run.sh
./run.sh

出力:

Hello from run.sh. My shell level is 4
Hello from test1.sh. My shell level is 5
Hello from test2.sh. My shell level is 5

$ UID

ユーザーのID番号を格納する読み取り専用変数:

~> $ echo $UID
12345

$ 1 $ 2 $ 3など...

コマンドラインまたは関数からスクリプトに渡される位置パラメータ:

#!/bin/bash
# $n is the n'th positional parameter
echo "$1"
echo "$2"
echo "$3"

上記の出力は次のとおりです。

~> $ ./testscript.sh firstarg secondarg thirdarg
firstarg
secondarg
thirdarg

位置引数の数が9より大きい場合は、中括弧を使用する必要があります。

#  "set -- " sets positional parameters
set -- 1 2 3 4 5 6 7 8 nine ten eleven twelve
# the following line will output 10 not 1 as the value of $1 the digit 1
# will be concatenated with the following 0
echo $10   # outputs 1
echo ${10} # outputs ten
# to show this clearly:
set -- arg{1..12}
echo $10 
echo ${10}

$#

コマンドライン引数または位置パラメータの数を取得するには、次のように入力します。

#!/bin/bash
echo "$#"

3つの引数を指定して実行すると、上記の出力結果が出力されます。

~> $ ./testscript.sh firstarg secondarg thirdarg
3

$ *

すべての位置パラメータを単一の文字列に返します。

testscript.sh:

#!/bin/bash
echo "$*"

引数を指定してスクリプトを実行します。

./testscript.sh firstarg secondarg thirdarg 

出力:

firstarg secondarg thirdarg

$!

バックグラウンドで実行された最後のジョブのプロセスID(pid)

~> $ ls &
testfile1 testfile2
[1]+  Done                    ls
~> $ echo $!
21715

$ _

実行された最後のコマンドの最後のフィールドを出力し、何かを別のコマンドに渡すのに便利です:

 ~> $ ls *.sh;echo $_
testscript1.sh  testscript2.sh
testscript2.sh

他のコマンドの前に使用されている場合は、スクリプトパスを指定します。

test.sh:

#!/bin/bash
echo "$_"

出力:

~> $ ./test.sh # running test.sh
./test.sh

注:これは、スクリプトのパスを取得する簡単な方法ではありません

$?

最後に実行された関数またはコマンドの終了ステータス。通常0はOKを意味します。それ以外の場合は失敗を示します。

~> $ ls *.blah;echo $?
ls: cannot access *.blah: No such file or directory
2
~> $ ls;echo $?
testfile1 testfile2
0

$$

現在のプロセスのプロセスID(pid):

~> $ echo $$
13246

$ @

"$@"はすべてのコマンドライン引数を別々の単語として展開します。これは、すべての引数を単一の単語として展開する"$*"とは異なります。

"$@"は、引数をループしたり、引数をスペースで処理したりする場合に特に便利です。

次のように2つの引数を指定してスクリプトを実行したとします。

$ ./script.sh "␣1␣2␣" "␣3␣␣4␣"

変数$*または$@$1␣$2に展開され、次に1␣2␣3␣4に展開さ1␣2␣3␣4ので、以下のループを実行します。

for var in $*; do # same for var in $@; do
    echo \<"$var"\>
done

両方のために印刷されます

<1>
<2>
<3>
<4>

"$*""$1␣$2"に展開され、 "␣1␣2␣␣␣3␣␣4␣"展開されますので、ループは次のようになります。

for var in "$*"; do
    echo \<"$var"\>   
done

echo 1回だけ起動して印刷します

<␣1␣2␣␣␣3␣␣4␣>

最後に"$@""$1" "$2"に展開され、 "␣1␣2␣" "␣3␣␣4␣"展開されるので、ループ

for var in "$@"; do
    echo \<"$var"\>
done

印刷する

<␣1␣2␣>
<␣3␣␣4␣>

それによって引数の内部間隔と引数の分離の両方を保持する。 for var in "$@"; do ...の構築に注意してくださいfor var in "$@"; do ...は非常に一般的で慣用であり、forループのデフォルトであり、 for var; do ...短縮することができますfor var; do ...

$ HISTSIZE

記憶されたコマンドの最大数:

~> $ echo $HISTSIZE
1000

$ RANDOM

このパラメータが参照されるたびに、0〜32767の間のランダムな整数が生成されます。この変数に値を代入すると、乱数ジェネレータ( ソース )がシードされます。

~> $ echo $RANDOM 
27119
~> $ echo $RANDOM 
1349


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow