Bash 変数

導入

Bash 変数は、環境変数とカスタム変数の 2 つのカテゴリに分類されます。

環境変数

環境変数は、Bash 環境に付属する変数で、シェルに入るときに定義されており、直接使用できます。通常、これらはシステム定義であるか、ユーザーが親シェルから子シェルに渡すことができます。

env コマンドまたは printenv コマンドは、すべての環境変数を表示できます。

$環境
# または
$printenv

以下に、一般的な環境変数をいくつか示します。

  • BASHPID: Bash プロセスのプロセス ID。
  • BASHOPTS: 現在のシェルのパラメータは shopt コマンドで変更できます。
  • DISPLAY: グラフィック環境の表示名。通常は :0 で、X サーバーの最初の表示を表します。
  • EDITOR: デフォルトのテキストエディター。
  • HOME: ユーザーのホーム ディレクトリ。
  • HOST: 現在のホストの名前。
  • IFS: 単語間の区切り文字。デフォルトはスペースです。
  • LANG: 文字セットと言語エンコーディング (zh_CN.UTF-8 など)。
  • PATH: 実行可能プログラム名を入力したときに検索される、コロンで区切られたディレクトリのリスト。
  • PS1: シェルプロンプト。
  • PS2: 複数行のコマンドを入力するときのセカンダリ シェル プロンプト。
  • PWD: 現在の作業ディレクトリ。
  • RANDOM: 0 ~ 32767 の範囲の乱数を返します。
  • SHELL: シェルの名前。
  • SHELLOPTS: 現在のシェルを開始する set コマンドのパラメータ。「set コマンド」の章を参照。
  • TERM: 端末タイプの名前、つまり端末エミュレータによって使用されるプロトコル。
  • UID: 現在のユーザーの ID 番号。
  • USER: 現在のユーザーのユーザー名。

多くの環境変数はほとんど変更されず、読み取り専用であり、定数として扱うことができます。変数名はすべて大文字であるため、ユーザーが自分で定数を定義したい場合は、伝統的にすべて大文字の変数名を使用します。

Bash 変数名では大文字と小文字が区別され、「HOME」と「home」は 2 つの異なる変数であることに注意してください。

単一の環境変数の値を表示するには、printenv コマンドまたは echo コマンドを使用できます。

$ printenv パス
# または
$ エコー $PATH

printenv コマンドの後の変数名には、接頭辞として $ を付ける必要がないことに注意してください。

カスタム変数

カスタム変数は、現在のシェルでユーザーによって定義される変数であり、現在のシェルでのみ使用できます。現在のシェルを終了すると、この変数は存在しなくなります。

set コマンドは、すべての Bash 関数だけでなく、すべての変数 (環境変数やカスタム変数を含む) を表示できます。

$セット

変数を作成する

ユーザーが変数を作成する場合、変数名は次の規則に従う必要があります。

  • 文字、数字、アンダースコア文字で構成されます。
  • 最初の文字は数字ではなく、文字またはアンダースコアである必要があります。
  • スペースと句読点は使用できません。

変数宣言の構文は次のとおりです。

変数=値

上記のコマンドでは、等号の左側が変数名、右側が変数です。等号の両側にスペースを入れることはできないことに注意してください。

変数の値にスペースが含まれる場合は、値を引用符で囲む必要があります。

myvar="ハローワールド"

Bash にはデータ型の概念がなく、すべての変数値は文字列です。

以下にカスタム変数の例をいくつか示します。

a=z # 変数 a には文字列 z の値が代入されます
b="a string" # 変数値にスペースが含まれる場合は、引用符で囲む必要があります。
c="a string and $b" #変数値は他の変数の値を参照できます
d="\t\ta string\n" # 変数値にはエスケープ文字を使用できます
e=$(ls -l foo.txt) # 変数の値はコマンドの実行結果になります
f=$((5 * 7)) # 変数値は数学演算の結果である場合があります

変数には繰り返し値を割り当てることができ、後続の割り当てによって以前の割り当てが上書きされます。

$foo=1
$foo=2
$エコー$foo
2

上の例では、変数 foo への 2 番目の代入により、最初の代入が上書きされます。

複数の変数を同じ行で定義する場合は、セミコロン (;) で区切る必要があります。

$ foo=1;bar=2

上の例では、2 つの変数 foobar が同じ行で定義されています。

変数の読み取り

変数を読み取るときは、変数名の前に「$」を追加するだけです。

$foo=バー
$エコー$foo
バー

シェルは「$」で始まる単語を見つけるたびに、その変数名に対応する値を読み取ろうとします。

変数が存在しない場合、Bash はエラーを報告しませんが、null 文字を出力します。

Bash では「$」は特別な意味を持っているため、ドル記号として使用する場合は十分に注意する必要があります。

$ echo 合計は $100.00
合計は00.00です

上記のコマンドの本来の目的は $100 を入力することですが、Bash は $1 を空の変数として解釈するため、入力は 00.00 になります。したがって、$ の本来の意味を使用したい場合は、$ の前にバックスラッシュを入れてエスケープする必要があります。

$ echo 合計は \$100.00 です
合計は $100.00

変数を読み取る場合、変数名を中括弧 {} で囲むこともできます。たとえば、$a${a} と記述することもできます。この書き方は、変数名に他の文字を組み合わせる場合に使用できます。

$a=foo
$ echo $a_file

$ echo ${a}_file
foo_file

上記のコードでは、変数名 a_file は出力を生成しません。これは、Bash が変数名を解釈し、この変数が存在しないためです。 Bash は、中括弧を使用して区切った場合にのみ $a を正しく解釈できます。

実際、変数 $foo を読み取るための構文は、${foo} の短縮形とみなすことができます。

変数の値自体も変数である場合は、${!varname} 構文を使用して最終値を読み取ることができます。

$myvar=ユーザー
$ エコー ${!myvar}
ルアニフ

上記の例では、変数 myvar の値は USER であり、${!myvar} を記述することで最終的な値に展開されます。

変数値に連続したスペース (またはタブと改行) が含まれている場合は、二重引用符で囲んで読むことをお勧めします。

$ a="1 2 3"
$ エコー $a
1 2 3
$ エコー "$a"
1 2 3

上の例では、変数 a の値に 2 つの連続するスペースが含まれています。直接読み取った場合、シェルは連続するスペースを 1 つに結合します。二重引用符内で読み取る場合のみ、元の形式を維持できます。

変数を削除する

「unset」コマンドは変数を削除するために使用されます。

NAMEの設定を解除

このコマンドはあまり役に立ちません。存在しない Bash 変数は常に空の文字列と等しいため、変数が unset コマンドによって削除された場合でも、変数は引き続き読み取ることができ、値は空の文字列になります。

したがって、変数を削除するには、変数を空の文字列に設定することもできます。

$ foo=''
$foo=

上記 2 つの書き方はどちらも変数 foo を削除します。存在しない値はデフォルトで空文字列となるため、後者の書き方では等号の右側に値を書かなくても大丈夫です。

出力変数、export コマンド

ユーザーが作成した変数は、現在のシェルでのみ使用できます。デフォルトでは、サブシェルは親シェルで定義された変数を読み取ることができません。変数をサブシェルに渡すには、「export」コマンドを使用する必要があります。このようにして出力された変数がサブシェルの環境変数となります。

「export」コマンドは、変数をサブシェルにエクスポートするために使用されます。

名前=ふー
エクスポート名

上記のコマンドは変数 NAME を出力します。変数の代入と出力もワンステップで行うことができます。

エクスポート名=値

上記のコマンドが実行されると、現在のシェルとその後に作成されるサブシェルは変数 $NAME を読み取ることができます。

子シェルが継承された変数を変更しても、親シェルには影響しません。

# 出力変数 $foo
$export foo=bar

# 新しいサブシェルを作成する
$バッシュ

# $foo を読み込む
$エコー$foo
バー

# 継承した変数を変更する
$ foo=バズ

# サブシェルを終了する
$exit

# $foo を読み込む
$エコー$foo
バー

上の例では、子シェルは継承された変数 $foo を変更しますが、これは親シェルには影響しません。

特殊変数

Bash には、いくつかの特別な変数が用意されています。これらの変数の値はシェルによって提供され、ユーザーが割り当てることはできません。

(1)「$?」

$? は前のコマンドの終了コードで、前のコマンドが正常に実行されたかどうかを判断するために使用されます。戻り値は「0」です。これは、前のコマンドが正常に実行されたことを意味します。それがゼロでない場合は、前のコマンドが失敗したことを意味します。

$ ls は存在しません
ls: Doesnotexist: そのようなファイルまたはディレクトリはありません

$エコー$?
1

上の例では、「ls」コマンドは存在しないファイルを参照するため、エラーが発生します。 $? は 1 で、前のコマンドの実行が失敗したことを示します。

(2)「$$」

$$ は現在のシェルのプロセス ID です。

$ エコー $$
10662

この特別な変数は、一時ファイルに名前を付けるために使用できます。

LOGFILE=/tmp/output_log.$$

(3)「$_」

$_ は前のコマンドの最後のパラメータです。

$ grep 辞書 /usr/share/dict/words
辞書

$ エコー $_
/usr/share/dict/words

(4)「$!」

$! は、バックグラウンドで実行された最新の非同期コマンドのプロセス ID です。

$ Firefox&
[1] 11064

$エコー$!
11064

上記の例では、firefox はバックグラウンドで実行されているコマンドであり、$! はコマンドのプロセス ID を返します。

(5)「$0」

$0 は、現在のシェルの名前 (コマンドラインから直接実行される場合) またはスクリプト名 (スクリプト内で実行される場合) です。

$エコー$0
バッシュ

上の例では、$0 は Bash が現在実行中であることを返します。

(6)$-

$- は現在のシェルの起動パラメータです。

$ エコー $-
彼BHs

(7) $@$#

$# はスクリプトのパラメータの数を表し、$@ はスクリプトのパラメータ値を表します。スクリプトの章を参照してください。

##変数のデフォルト値

Bash には、変数が空でないことを保証するために、変数のデフォルト値に関連する 4 つの特別な構文が用意されています。

${変数名:-単語}

上記の構文の意味は、変数 varname が存在し、空でない場合はその値を返し、それ以外の場合は word を返すことです。その目的は、デフォルト値を返すことです。たとえば、${count:-0} は、変数 count が存在しない場合に 0 を返すことを意味します。

${変数名:=単語}

上記の構文の意味は、変数 varname が存在し、空でない場合はその値が返され、それ以外の場合は word に設定され、word が返されるということです。その目的は、変数のデフォルト値を設定することです。たとえば、${count:=0} は、変数 count が存在しない場合に 0 を返し、count0 に設定することを意味します。 。

${変数名:+単語}

上記の構文の意味は、変数名が存在し、空でない場合は word を返し、それ以外の場合は null 値を返すということです。その目的は、変数が存在するかどうかをテストすることです。たとえば、${count:+1} は、変数 count が存在する場合は '1' (つまり 'true') を返し、それ以外の場合は null 値を返すことを意味します。

${変数名:?メッセージ}

上記の構文の意味は、変数 varname が存在し、空でない場合はその値を返し、それ以外の場合は varname: message を出力してスクリプトの実行を中断することです。 message を省略した場合は、デフォルトのメッセージ「parameter null or not set.」が出力されます。その目的は、変数が未定義になるのを防ぐことです。たとえば、${count:?"unknown!"} は、変数 count が定義されていない場合、実行が中断され、エラーがスローされ、指定されたエラー メッセージ「unknown!」が返されます。

上記の 4 つの構文をスクリプト内で使用する場合、変数名の部分には、スクリプトのパラメーターを表すために '1' から '9' までの数字を使用できます。

filename=${1:?"ファイル名がありません。"}

上記のコードはスクリプト内に表示され、「1」はスクリプトの最初のパラメータを表します。パラメータが存在しない場合、スクリプトはエラーで終了します。

コマンドを宣言する

declare コマンドは、いくつかの特殊なタイプの変数を宣言し、読み取り専用タイプの変数や整数タイプの変数の宣言など、変数にいくつかの制限を設定できます。

その文法形式は次のとおりです。

OPTION VARIABLE=値を宣言します

declareコマンドの主なパラメータ(OPTION)は以下の通りです。

  • -a: 配列変数を宣言します。
  • -f: すべての関数定義を出力します。
  • -F: すべての関数名を出力します。
  • -i: 整数変数を宣言します。
  • -l: 変数を小文字で宣言します。
  • -p: 変数情報を表示します。
  • -r: 読み取り専用変数を宣言します。
  • -u: 変数を大文字で宣言します。
  • -x: この変数は環境変数として出力されます。

declare コマンドが関数内で使用される場合、宣言された変数は関数内でのみ有効であり、これは local コマンドと同等です。

パラメータを指定しない場合、declare コマンドは関数を含む現在の環境のすべての変数を出力します。これはパラメータを指定しない set コマンドと同等です。

$宣言

(1)-iパラメータ

-i パラメータで整数変数を宣言した後、数学演算を直接実行できます。

$ 宣言 -i val1=12 val2=5
$ 宣言 -i 結果
$ 結果=val1*val2
$エコー$結果
60

上記の例では、変数 result が整数として宣言されていない場合、val1*val2 はリテラルとして扱われ、整数演算は実行されません。さらに、「val1」と「val2」を実際に整数として宣言する必要はありません。「result」が整数として宣言されている限り、その代入は自動的に整数演算として解釈されるからです。

変数が整数として宣言された後も、文字列として書き換えることができることに注意してください。

$ 宣言 -i var=12
$var=foo
$エコー$var
0

上記の例では、変数 var は整数として宣言されていますが、上書き後、Bash はエラーを報告しませんが、不確実な値を出力する可能性があります。

(2)-xパラメータ

-x パラメータは、変数をサブシェルの環境変数として出力できる export コマンドと同等です。

$ 宣言 -x foo
# に相当
$ エクスポート foo

(3)-rパラメータ

-r パラメータは読み取り専用変数を宣言できますが、変数値を変更したり、変数を unset することはできません。

$ 宣言 -r bar=1

$バー=2
bash: bar: 読み取り専用変数
$エコー$?
1

$バーの設定を解除
bash: bar: 読み取り専用変数
$エコー$?
1

上記の例では、最後の 2 つの代入ステートメントでエラーが報告され、コマンドの実行は失敗します。

(4)-uパラメータ

-u パラメータは変数を大文字として宣言し、変数値を自動的に大文字に変換できます。

$ 宣言 -u foo
$ foo=アッパー
$エコー$foo
アッパー

(5)-lパラメータ

-l パラメータは変数を小文字として宣言し、変数値を自動的に小文字に変換できます。

$ 宣言 -l バー
$bar=下位
$エコー$バー
より低い

(6)-pパラメータ

-p パラメータは変数情報を出力します。

$foo=こんにちは
$ 宣言 -p foo
宣言 -- foo="こんにちは"
$ 宣言 -p バー
バー: 見つかりません

上記の例では、「declare -p」は定義された変数の値を出力できます。未定義の変数の場合は、変数が見つからないことを示すメッセージが表示されます。

変数名が指定されていない場合、「declare -p」はすべての変数に関する情報を出力します。

$ 宣言 -p

(7)-fパラメータ

-f パラメータは、現在の環境のすべての関数 (その定義を含む) を出力します。

$ 宣言 -f

(8)-Fパラメータ

-F パラメータは、関数定義を除く、現在の環境内のすべての関数名を出力します。

$ 宣言 -F

読み取り専用コマンド

readonly コマンドは、読み取り専用変数を宣言するために使用される declare -r と同等であり、変数値を変更したり、変数を unset したりすることはできません。

$ readonly foo=1
$foo=2
bash: foo: 読み取り専用変数
$エコー$?
1

上記の例では、読み取り専用変数 foo を変更するとエラーが発生し、コマンドの実行は失敗します。

「readonly」コマンドには 3 つのパラメータがあります。

  • -f: 宣言された変数は関数名です。
  • -p: すべての読み取り専用変数を出力します。
  • -a: 宣言された変数は配列です。

let コマンド

let コマンドで変数を宣言すると、算術式を直接実行できます。

$ let foo=1+2
$エコー$foo
3

上の例では、「let」コマンドで「1 + 2」を直接計算できます。

「let」コマンドのパラメータ式にスペースが含まれる場合は、引用符を使用する必要があります。

$ "foo = 1 + 2" にしましょう

「let」は複数の変数に同時に値を代入でき、スペースを使用して代入式を区切ります。

$ let "v1 = 1" "v2 = v1++"
$ エコー $v1,$v2
2,1

上の例では、let は 2 つの変数 v1v2 を宣言します。ここで、v2v1++ と等しくなります。これは、v1 の値が最初に返され、次に v1 がインクリメントされることを意味します。 。

この構文でサポートされる演算子については、「Bash 算術演算」の章を参照してください。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0