ウェブサイト検索

シェル スクリプトでの「Linux 変数」の理解と記述 - パート 10


Linux シェル スクリプト言語は常にホットなトピックであり、今後も常にホットなトピックとなるでしょう。シェル スクリプト言語は魔法のようなもので、他の言語と同様にスクリプト言語でプログラムを実行するのが非常に簡単です。ただし、何を行っているのか、どのような結果が期待されるのかについての深い知識が必要です。

最後の記事「Linux 変数の洞察」を含め、私たちが読者のために書いたシェル スクリプトに関する記事はすべて高く評価されています。前回の記事を新しいレベルに拡張します。

変数の属性

Linux 環境の各変数には特定のオプションがあり、それらは「属性」と呼ばれます。これらのオプションや属性は、状況に応じて「declare」 コマンドを使用してオンオフを切り替えることができます。

変数属性の例は、対応する変数の整数属性をオンにするスイッチ「-i」を使用することです。数値以外の値がスイッチ「-i」に渡された場合でも、エラー メッセージはスローされず、整数解釈として「0」が出力されます。ここで、以下の例からさらに明らかになります。

変数 Integer を宣言します (bill=121)

avi@localhost:~$ declare -i bill=121

変数 bill の値を出力します。

avi@localhost:~$ printf "%d\n" "$bill" 

121

変数値を文字列とします。変動請求書はすでに宣言されているため、再度宣言する必要はありません。変数の値を次のように変更するだけです。

avi@localhost:~$ bill=tecmint

ここで、変数 bill の値を再度出力します。

avi@localhost:~$ printf "%d\n" "$bill" 

0

エラー メッセージの代わりに「0」があることに注意してください。

さて、問題は、すでに宣言されている変数の属性をどうやって知るかということです。
avi@localhost:~$ declare -p bill 

declare -i bill="121"

ここでは、-p (print の略) スイッチが役に立ちます。

繰り返しになりますが、変数の属性をオフにするにはどうすればよいでしょうか?

変数の属性をオフに切り替えるには、スイッチの直前に + (プラス) 記号を置くだけです。ここで、以下の例を見るとより明らかです。

上記の変数の整数属性をオフに切り替えます。

avi@localhost:~$ declare +i bill

変数の値を確認してください。

avi@localhost:~$ printf "%d\n" "$bill" 

bash: printf: bill: invalid number
0

次に、スイッチ文字列を使用して変数の値を出力します。

avi@localhost:~$ printf "%s\n" "$bill" 

tecmint

上記の例では、bash は数値以外の値をエラーとして判断できませんでしたが、printf は何が数値であり何が数値でないかを解釈しています。

読み取り専用変数

読み取り専用メモリ (ROM) という言葉を聞いたことがあるかもしれませんが、読み取り専用変数とは何ですか? ROMとの類似点はありますか?

読み取り専用メモリのような読み取り専用変数は、一度割り当てられると値を変更できないものです。したがって、これは読み取り専用と呼ばれます。その変数の新しい値を書き込んだり、編集したり、変更したりすることはできません。例を使用した図を次に示します。

読み取り専用 (-r) 変数名を宣言します。その値は「linux-console.net 」です。

avi@localhost:~$ declare -r name="linux-console.net"

上記で宣言された変数の値を出力します。

avi@localhost:~$ printf "%s\n" "$name" 

linux-console.net

変数の値を変更してみてください。

avi@localhost:~$ declare -r name="Avishek" 

bash: declare: name: readonly variable

上で説明したように、読み取り専用変数の属性は「+」記号を使用して変更できます。

Linux での変数のエクスポート

シェル スクリプトで宣言されたすべてのシェル変数は、スクリプトが実行されるまで使用できます。スクリプトの外では、スクリプトの変数は存在しません。スクリプトの外部で変数を使用できるようにするプロセスは、変数のエクスポートと呼ばれます。

変数は、スイッチ declare -x (エクスポート) を使用してシェルの外にエクスポートできます。これにより、エクスポートしたい内容がシェルに認識されます。宣言エクスポート スイッチは次のように使用できます。

avi@localhost:~$ declare -x variable=”Constant_Value”

スクリプトの実行中に変数に加えられたすべての変更は、変数がスクリプトの外にエクスポートされると失われます。シェルスクリプトでは変数のエクスポートが非常に重要です。

読み取り専用でスクリプトの外部で使用できる変数が必要です。スイッチ -r とスイッチ -x を同時に使用する必要があります。

avi@localhost:~$ declare -rx variable=”Constant_Value”

環境変数

プログラムとそれを実行するプログラム間で共有される変数。環境変数はエクスポートできますが、属性を割り当てることはできません。

上記の理論を実践的に理解する。ここには 2 つのスクリプト 0.sh1.sh があります。

0.sh
#!/bin/bash 
declare -rx name=Tecmint 
bash 0.sh 
exit 0

そして2番目のスクリプトは次のとおりです。

1.sh
#!/bin/bash 
printf "%s\n" "$name" 
name=linux-console.net 
printf "%s\n" "$name"
exit 0

ここで何が起こっているのかというと、変数 (名前) が読み取り専用として宣言されてエクスポートされ、その直後に 2 番目のスクリプトが呼び出されます。

2 番目のスクリプトは、最初の printf ステートメントでエクスポートされた最初のスクリプトの変数を出力するだけです。 2 番目の printf ステートメントでは、変数 ‘name‘ に割り当てられた新しい値が表示されます。

変数が読み取り専用だったとしても、どうすれば再割り当てできるのかを心配する必要はありません。 「スクリプトの実行中に変数に加えられたすべての変更は、変数がスクリプトの外にエクスポートされると失われます。」ということを覚えていますか。 」

参考文献

declare コマンドでは、以下のすべてのスイッチとその組み合わせが許可されます。

  1. -a : 配列を宣言します。
  2. -f : 関数と定義を表示します。
  3. -F : 関数名を表示します。
  4. -r : 変数を読み取り専用として宣言します。
  5. -x : 変数をエクスポート可能として宣言します。
  6. -I : 変数を整数として宣言します。

それは今のところすべてです。次回の記事では、このトピックを閉じる前に、「eval」コマンドと bash ですでに定義されている変数を使用して変数を置換する方法について説明します。皆さんがスクリプト作成の詳細への旅を楽しんでいることを願っています。それまでは、linux-console.net にアクセスして注目してください。