English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Shell 変数

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

your_name="w"3codebox.com"

注意してください。変数名と等号の間にはスペースを置かないことができます。これはおなじみのすべてのプログラミング言語とは異なります。また、変数名の命名は以下の規則に従う必要があります:

  •             命名は英文字母、数字、下線のみを使用し、最初の文字は数字で始められません。

  •             中間にはスペースは置かないことができますが、下線(_)を使用できます。

  •             記号を使用することはできません。

  •             bash内のキーワードは使用できません(helpコマンドで保留中のキーワードを確認できます)。

有効なShell変数名の例は以下の通りです:

w3codebox
LD_LIBRARY_PATH
_var
var2

無効な変数名です:

?var=123
user*name=w3codebox

明示的に直接代入する以外に、以下の文を使用して変数に値を代入できます:

for file in `ls /etc`
または
for file in $(ls /etc)

以下の文は、 /etc下のディレクトリのファイル名をループで取得します。

変数の使用

既に定義された変数を使用する場合、変数名の前にドル記号を付けるだけで良いです。例えば:

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

変数名の外側の括弧は任意です。括弧を付けるかどうかは自由ですが、括弧を付けることで解釈器が変数の境界を識別する助けになります。例えば以下のようになります:

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

skill変数に括弧を付けない場合、echo "I am good at $skillScript"と書くと、解釈器は$skillScriptを変数(空の値)と認識し、コードの実行結果は期待とは異なります。

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

既に定義された変数は再定義可能です。例えば:

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://ja.oldtoolbag.com"

スクリプトを実行すると、以下の結果が得られます:

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

変数の削除

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

unset variable_name

変数が削除された後は再び使用できません。unsetコマンドは読み取り専用の変数を削除できません。

#!/bin/sh
myUrl="https://ja.oldtoolbag.com"
unset myUrl
echo $myUrl

以上の例を実行すると、何も出力されません。

変数の種類

shellを実行するとき、3つの種類の変数が同時に存在します:

  • 1) ローカル変数ローカル変数はスクリプトやコマンドで定義され、現在のshellセッション内でのみ有効で、shellが起動した他のプログラムではアクセスできません。

  • 2) 環境変数すべてのプログラム、shellが起動したプログラムも含め、環境変数にアクセスできます。一部のプログラムは環境変数を使用して正常動作を保証する必要があります。必要に応じて、shellスクリプトも環境変数を定義できます。

  • 3) shell変数shell変数はshellプログラムによって設定された特別な変数です。shell変数には環境変数とローカル変数がありますが、これらの変数はshellの正常動作を保証します

Shell 文字列

文字列はshellプログラミングで最もよく使用され、最も役立つデータタイプです(数字や文字列以外に使用できるデータタイプはほとんどありません)、文字列はシングルクォート、ダブルクォート、またはクォートを使用できます。

シングルクォート

str='this is a string'

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

  •             シングルクォート内の全ての文字はそのまま出力されます、シングルクォートの文字列内の変数は無効です;

  •             シングルクォートの文字列では、単独のシングルクォートは使用できません(エスケープシーケンスを使用しても同じです)、しかし、対で使用して文字列の結合に使用できます。

ダブルクォート

your_name='w3codebox'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

出力結果は:

Hello, I know you are "w3codebox"!

ダブルクォートの利点:

  •             ダブルクォート内には変数が使用できます

  •             ダブルクォート内にはエスケープシーケンスが使用できます

文字列を結合

your_name="w"3codebox"
# ダブルクォートで結合
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, w3codebox ! hello, w3codebox !
hello, w3codebox ! hello, ${your_name} !

文字列の長さを取得します

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

部分文字列を抽出します

以下の例では、文字列の第 2 文字から切り取ります 4 文字:

string="w3codebox is a great site"
echo ${string:1:4} # 出力 unoo

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

部分文字列の検索

文字の検索 i または o の位置(どの文字が先に出現するかによって計算されます):

string="w3codebox is a great site"
echo `expr index "$string" io` # 出力 4

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

Shell 配列

bashは一つの次元の配列をサポートしています(複数の次元の配列をサポートしていません)そして配列のサイズに制限はありません。

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[*]}
# 配列の単一要素の長さを取得
lengthn=${#array_name[n]}

Shell コメント

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

各行に # コメントを設定するには、以下のように行います:

#--------------------------------------------
# これはコメントです
# author:基础教程网
# site:ja.oldtoolbag.com
# slogan:基礎を学ぶことができれば、もっと遠くへ行ける!
#--------------------------------------------
##### ユーザー設定エリア 開始 #####
#
#
# ここにスクリプトの説明情報を追加できます
# 
#
##### ユーザー設定エリア 終了  #####

開発中に、一時的にコメントアウトする必要がある大規模なコードがあれば、その後コメントを解除する方法はどうすればいいですか?

各行に # シンボルを追加するのは手間がかかるので、コメントを追加する必要があるコードを一对の括弧で囲んで、関数として定義することができます。この関数はどこにも呼び出されないため、コードは実行されず、コメントと同じ効果が得られます。

マルチラインコメント

マルチラインコメントは以下の形式でも使用できます:

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

EOF は他のシンボルでも使用できます:

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