Shell 変数

Shell プログラミングにおいて、変数はデータ値を格納するための名前です。

変数を定義するとき、変数名にはドル記号を付けません($。PHP 言語では変数に必要)。例:

your_name="サンプル"

注意:変数名と等号の間にスペースを入れることはできません。これは、あなたが慣れ親しんでいるすべてのプログラミング言語とは異なるかもしれません。また、変数名の命名は次のルールに従う必要があります:

  • 文字、数字、アンダースコアのみを含む:変数名には文字(大文字小文字を区別)、数字、アンダースコアを含めることができます_。その他の特殊文字を含めることはできません。
  • 数字で始めることはできません:変数名は数字で始めることはできませんが、数字を含めることはできます。
  • Shell キーワードの使用を避ける:Shell のキーワード(例:if、then、else、fi、for、while など)を変数名として使用しないでください。混乱を避けるためです。
  • 定数を表すのに大文字を使用する:慣例的に、定数の変数名は通常大文字を使用します。例えばPI=3.14。
  • 特殊記号の使用を避ける:変数名に特殊記号を使用することはできるだけ避けてください。Shell の構文と競合する可能性があるためです。
  • スペースの使用を避ける:変数名にスペースを含めるべきではありません。スペースは通常、コマンドと引数を区切るために使用されるからです。

有効な Shell 変数名の例は次のとおりです:

サンプル="www.example.com"
LD_LIBRARY_PATH="/bin/"
_var="123"
var2="abc"

無効な変数名:

# 避免使用if作为变量名
if="some_value"
# 避免使用 $ 等特殊符号
variable_with_$=42
?var=123
user*name=サンプル
# 避免空格
variable with space="value"

等号の両側にスペースを入れないようにする:

# 正确的赋值
variable_name=value

# 有可能会导致错误
variable_name = value

明示的に直接代入する以外にも、ステートメントを使用して変数に代入できます。例:

for file in `ls /etc`
或
for file in $(ls /etc)

上記のステートメントは、/etc ディレクトリ内のファイル名をループ処理で出力します。


変数の使用

定義済みの変数を使用するには、変数名の前にドル記号を付けるだけです。例:

例

your_name="qinjx"
echo $your_name
echo ${your_name}

変数名の外側の中括弧は省略可能で、付けても付けなくても構いません。中括弧を付けるのは、インタープリタが変数の境界を認識するのを助けるためです。例えば次のような場合です:

例

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

skill 変数に中括弧を付けずに echo "I am good at $skillScript" と書くと、インタープリタは $skillScript を1つの変数(値は空)として扱います。そのため、コードの実行結果は期待どおりにはなりません。

すべての変数に中括弧を付けることをお勧めします。これは良いプログラミング習慣です。

定義済みの変数は再定義できます。例:

例

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

このように書くことは正しいですが、注意してください。2回目の代入時に $your_name="alibaba" と書くことはできません。変数を使用するときだけドル記号($)を付けます。

読み取り専用変数

readonly コマンドを使用すると、変数を読み取り専用変数として定義できます。読み取り専用変数の値は変更できません。

次の例では、読み取り専用変数を変更しようとして、エラーが発生します:

例

#!/bin/bash

myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.example.com"

スクリプトを実行すると、結果は次のようになります:

/bin/sh: NAME: This variable is read only.

変数の削除

unset コマンドを使用すると変数を削除できます。構文:

unset variable_name

変数は削除された後、再度使用することはできません。unset コマンドは読み取り専用変数を削除できません。

例

例

#!/bin/sh

myUrl="https://www.example.com"
unset myUrl
echo $myUrl

上記の例を実行しても、何も出力されません。

変数の型

Shell はさまざまな型の変数をサポートしています。主な型には次のものがあります:

文字列変数:Shell では、変数は通常文字列として扱われます。

シングルクォートを使うことができ'またはダブルクォート"で文字列を定義できます。例:

my_string='Hello, World!'

或者

my_string="Hello, World!"

整数変数:一部の Shell では、declare 或 typesetコマンドを使用して整数変数を宣言できます。

このような変数は整数値のみを含みます。例:

declare -i my_integer=42

このような宣言は、Shell に my_integer を整数として扱うことを指示します。非整数値を代入しようとすると、Shell はそれを整数に変換しようとします。

配列変数:Shell は配列もサポートしており、1つの変数に複数の値を格納できます。

配列は整数インデックス配列または連想配列にできます。以下は単純な整数インデックス配列の例です:

my_array=(1 2 3 4 5)

または連想配列:

declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30

環境変数:これらはオペレーティングシステムまたはユーザーによって設定される特別な変数で、Shell の動作を構成し、その実行環境に影響を与えるために使用されます。

例えば、PATH 変数には、オペレーティングシステムが実行可能ファイルを検索するパスが含まれています:

echo $PATH

特殊変数:Shell には特別な意味を持つ特殊変数がいくつかあります。例えば$0はスクリプトの名前を示し、$1, $2、などはスクリプトの引数を示します。

$#はスクリプトに渡された引数の数を示し、$?は直前のコマンドの終了ステータスなどを示します。


Shell 文字列

文字列は、Shell プログラミングで最も一般的で最も有用なデータ型です(数字と文字列以外に、他に使える型もあまりありません)。文字列はシングルクォート、ダブルクォート、またはクォートなしで定義できます。

シングルクォート

str='this is a string'

シングルクォート文字列の制限:

  • シングルクォート内の任意の文字はそのまま出力され、シングルクォート文字列内の変数は無効です;
  • シングルクォート文字列内に単独のシングルクォートは出現できません(シングルクォートにエスケープ文字を使用しても不可)。ただし、ペアで出現することは可能で、文字列の連結として使用されます。

ダブルクォート

例

your_name="サンプル"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

出力結果は次のとおりです:

Hello, I know you are "サンプル"! 

ダブルクォートの利点:

  • ダブルクォート内では変数を使用できます
  • ダブルクォート内ではエスケープ文字を使用できます

文字列の連結

例

your_name="サンプル"
# ダブルクォートを使用して連結
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# シングルクォートを使用して連結
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

出力結果は次のとおりです:

hello, サンプル ! hello, サンプル !
hello, サンプル ! hello, ${your_name} !

文字列の長さを取得

例

string="abcd"
echo ${#string}   # 4 を出力

変数が文字列の場合、${#string}は次と同等です${#string[0]}:

例

string="abcd"
echo ${#string[0]}   # 4 を出力

部分文字列の抽出

次の例では、文字列の2文字目から4文字を抽出します:

例

string="サンプル is a great site"
echo ${string:1:4} # unoo を出力

注意:最初の文字のインデックス値は0。

部分文字列の検索

文字を検索し、そのi 或 o位置(どの文字が先に出現するかで計算します):

例

string="サンプル is a great site"
echo `expr index "$string" io`  # 4 を出力

注意:上記のスクリプト内の`はバッククォートであり、シングルクォートではありません'。見間違えないでくださいね。


Shell 配列

bash は1次元配列をサポートしています(多次元配列はサポートされていません)。また、配列のサイズは制限されていません。

C 言語と同様に、配列要素のインデックスは 0 から始まります。配列内の要素を取得するにはインデックスを使用します。インデックスは整数または算術式にでき、その値は 0 以上である必要があります。

配列の定義

Shell では、括弧を使用して配列を表します。配列要素は「スペース」記号で区切ります。配列を定義する一般的な形式は次のとおりです:

数组名=(值1 值2 ... 值n)

例:

array_name=(value0 value1 value2 value3)

または

array_name=(
value0
value1
value2
value3
)

配列の各要素を個別に定義することもできます:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

連続したインデックスを使用する必要はなく、インデックスの範囲にも制限はありません。

配列の読み取り

配列要素の値を読み取る一般的な形式は次のとおりです:

${配列名[添字]}

例:

valuen=${array_name[n]}

使用@記号を使用すると、配列内のすべての要素を取得できます。例:

echo ${array_name[@]}

配列の長さを取得

配列の長さを取得する方法は、文字列の長さを取得する方法と同じです。例:

例

# 配列の要素の数を取得する
length=${#array_name[@]}
# または
length=${#array_name[*]}
# 配列の単一要素の長さを取得する
length=${#array_name[n]}

Shell コメント

以 #行頭に # が付いている行はコメントであり、インタープリターによって無視されます。

各行の先頭に1つ追加することで## を付けて複数行のコメントを設定します。例:

例

#--------------------------------------------
# これはコメントです
# author:サンプル
# site:www.example.com
# slogan:学ぶのは技術だけでなく、夢でもある!
#--------------------------------------------
##### ユーザー設定領域 開始 #####
#
#
# ここにスクリプトの説明情報を追加できます
#
#
##### ユーザー設定領域 終了 #####

開発中に、大きなコードの塊を一時的にコメントアウトして、しばらくしてからコメントを解除する必要がある場合はどうすればよいでしょうか?

各行に # 記号を追加するのは面倒です。コメントアウトしたいコードの塊を中括弧で囲んで関数として定義すれば、その関数を呼び出す場所がないため、そのコードは実行されず、コメントと同じ効果が得られます。

複数行コメント

Here ドキュメントを使用する

複数行コメントは次の形式も使用できます。

:<<EOF
コメント内容...
コメント内容...
コメント内容...
EOF

上記の例では、:は空コマンドで、後続のヒアドキュメントを実行するために使用されます。<<'EOF'はヒアドキュメントの開始を示します。COMMENT はヒアドキュメントの識別子であり、この2つの識別子の間の内容はすべてコメントとして扱われ、実行されません。

EOF の代わりに他の記号を使用することもできます:

例

: <<'COMMENT'
これはコメントの部分です。
複数行の内容を含めることができます。
COMMENT


:<<'
コメント内容...
コメント内容...
コメント内容...
'


:<<!
コメント内容...
コメント内容...
コメント内容...
!

直接 : 記号を使用する

コロンを使用することもできます。:コマンドを使用し、シングルクォートで'複数行の内容を囲みます。コロンは空コマンドであるため、これらの内容は実行されません。

形式は次のとおりです。: + スペース + シングルクォート。

例

: '
これはコメントの部分です。
複数行の内容を含めることができます。
'

その他の拡張