シェルスクリプト言語における Linux の「変数」についての洞察 - パート 9
私たちはすでにLinux シェル スクリプトに関する一連の記事を書いていますが、これは当時大歓迎され、現在でも非常に重要な内容でした。ここに、シェル スクリプトに関する記事のコレクションへのリンクがあります。
- Linux シェル スクリプトを学ぶ
この記事では変数とその実行、シェルスクリプトでの実装について見ていきます。
出力の保存
コマンドの出力は標準出力またはファイルにリダイレクトでき、変数に保存することもできます。コマンドの出力が画面に収まらないほど大きい場合は、出力を変数にファイルに保存するオプションしか残されていません。出力を変数に保存する利点の 1 つは、検査速度が速いことです。変数はメモリに保存されるため、ファイルからの取得に比べて高速になる傾向があります。
スクリプト言語の変数
変数はシェル スクリプトで使用される重要なコンポーネントであり、bash コマンド「宣言」を使用して宣言されます。変数「レベル」を宣言するには、以下のコマンドを実行する必要があります。
declare LEVEL
注: Korn シェルの互換性のための組み込みステートメントである「typecast 」を使用する必要があります。 「declare」はより高度であり、すべての機能が含まれているため、BASH を使用する場合は推奨されます。
ルール
- 変数名は、スクリプト内での変数の使用を正当化する必要があります。
- プログラム全体で同じ変数名を使用することを強くお勧めします。
- 変数名は小文字だけでなく大文字も使用できますが、慣例によりシェルコマンドは小文字で使用されるため、混乱を避けるために変数名は大文字で使用する必要があります。例: TOTAL_BILLED_AMOUNT、SELL_REPORT、ORDER_RECEIPT など。
実装
等号 (=) を使用して変数に値を割り当てることができます。空の文字列を変数に割り当てるには、等号の後に値を指定しないでください。
LEVEL =
変数「LEVEL」に格納されている値を確認します。
printf "%i" $LEVEL
printf は、'C' プログラマのほとんどが知っているコマンドで、データを出力します。 %i – 整数を表します。必要に応じて、文字の場合は %c または文字列の場合は %c に置き換えることができます。
$LEVEL: 変数「LEVEL」の値置換として機能する「$」に注意してください。
サンプル出力
printf "%i" $LEVEL
0
変数に値を代入します。
LEVEL=0
変数に格納されているデータを確認します。
printf "%i" $LEVEL
0
注: 変数に値を割り当てなかった場合と、値 '0< を割り当てた場合の両方の場合に注目するのは興味深いことです。' を変数 'LEVEL' に代入すると、0 が出力されます。どちらの場合も出力は同じですが、シェル スクリプトは両方の変数宣言を異なる方法で処理します。
変数に新しい値を代入します。
LEVEL=121
変数に格納されているデータを確認します。
printf "%i" $LEVEL
121
変数の設定を解除する
宣言 は BASH コマンドであり、実行時にのみ変数を作成します。このように作成された変数は、スクリプトが停止するか変数が破棄されるまでメモリ内に残ります。
unset LEVEL
BASH の事前定義変数
BASH には50 を超える変数が事前定義されています。これらの変数の中には、BASH に特別な意味を持つものもあります。たとえば、 変数 RANDOM は乱数を出力します。設定を解除してから再度定義すると、元の変数値は永久に失われます。したがって、システム定義変数は使用しないことをお勧めします。
以下に、いくつかの便利な BASH 変数のリストを示します。
- BASH - Bash の完全パス名。
- BASH_ENV - シェル スクリプトにおいて、スクリプトが開始される前に実行されるプロファイル ファイルの名前。
- BASH_VERSION:Bash のバージョン(たとえば、2.04.0(1) リリース)。
- COLUMNS - ディスプレイ上の 1 行あたりの文字数 (たとえば、80)。
- HOSTNAME - コンピュータの名前。 Linux の一部のバージョンでは、これがマシン名になることがあります。その他の場合は、完全修飾ドメイン名にすることができます。
- HOSTTYPE - コンピュータのタイプ。
- HOME - ホーム ディレクトリの名前。
- OSTYPE - オペレーティング システムの名前。
- PATH - 実行するコマンドを見つけるための検索パスのコロンで区切られたリスト。
- PPID - シェルの親プロセスのプロセス ID。
- PROMPT_COMMAND - PS1 プライマリ プロンプト文字列を設定する前に実行するコマンド。
- PWD - 現在の作業ディレクトリ (cd コマンドで設定)。
- RANDOM - 参照されるたびに 0 ~ 32767 の範囲の乱数を返します。
- SHELL - 使用する優先シェル。シェルを起動するプログラムの場合。
- TERM - 端末エミュレーションのタイプ (コンソールなど)。
単語分割の法則。
LEVEL=0
printf "%i" $LEVEL
0
AND
LEVEL=”0”
printf "%i" $LEVEL
0
どちらの場合も、出力は同じままです。それでは、引用を使用した場合の結果の違いは何でしょうか?
異なる変数データでも同じことを確認してみましょう。
LEVEL=0 ; 1 ; 2 ; 3 ; 4 ; 5
bash: 1: command not found
bash: 2: command not found
bash: 3: command not found
bash: 4: command not found
bash: 5: command not found
printf "%i" $LEVEL
0
言うまでもなく、出力は正しくありません。 BASH は、「0」の後のスペースを終了として認識するため、変数の値は「0」に設定されます。ここで、以下のように変数に引用符を使用してみます。
LEVEL=”0 ; 1 ; 2 ; 3 ; 4 ; 5”
printf "%s" $LEVEL
0;1;2;3;4;5
それでも結果は正しくありません。 BASH は変数値を取得し、それらの間のスペースをすべて削除しました。したがって、printf は 0、1、2、3、4、5 を個別の値として解釈しませんでした。それで、解決策は何でしょうか?
printf "%s" "$LEVEL"
0 ; 1 ; 2 ; 3 ; 4 ; 5
うん!変数置換を引用符で囲むことが解決策です。引用符はシェル内の文字をグループ化し、特殊文字を意味のある方法で解釈します。
引用符は連続して使用でき、変数置換を引用符で囲むことをお勧めします。さらに、テキスト全体を引用から分離するために使用することもできます。ここに一例を示します。
LEVEL=5
FLAG_MESSAGE="I HAVE CLEARED LEVEL""$LEVEL"". I Deserve appreciation."
printf “%s” “$FLAG_MESSAGE”
“I HAVE CLEARED LEVEL5. I Deserve appreciation.”
引用されたテキストのチャンクをスペースで区切ると、上で説明したのと同じ問題が発生します。 bash は空白スペースを終了として扱います。変数置換の別の方法は次のとおりです。
LEVEL=5
FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
printf “%s” "$FLAG_MESSAGE"
“I HAVE CLEARED LEVEL 5. I Deserve appreciation.”
一重引用符は、BASH による特殊文字の出力を制限します。
printf “%s” '$FLAG_MESSAGE'
“$FLAG_MESSAGE”
バックスラッシュ (/)
バックスラッシュは、1 文字に対する一重引用符のように機能します。 (「)」をどのように印刷するか考えたことがありますか?
printf "%c" "\""
%q を printf でグループ化すると、単語の間隔を確保するためにすべての単語の後にバックスラッシュが追加されます。
LEVEL=5
FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
printf “%q” "$FLAG_MESSAGE"
“I\ HAVE\ CLEARED\ LEVEL\ 5.\ I\ Deserve\ appreciation.”
それは今のところすべてです。私たちは常に読者に有益な記事を随時提供するよう努めています。上記で取り上げた記事は膨大であるため、例を含む残りのトピックは、「変数の属性」、「変数のエクスポート」などを含む次の記事で作成されます。
それまではlinux-console.net にアクセスしてお待ちください。以下のコメントセクションに貴重なフィードバックをお寄せください。