サーチ…
前書き
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
nota = 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