重要なポイント
- 変数は、文字列または数値を表す名前付きシンボルです。これらは、コマンドや式で使用される場合、その値として扱われます。
- 変数名はわかりやすいものにする必要があり、数字で始めたり、スペースを含めたりすることはできません。アンダースコアで始めることも、英数字を使用することもできます。
- 変数を使用して、値を保存したり参照したりできます。変数の値は変更でき、変数名の前にドル記号 $ を使用して参照できます。
スクリプトを作成し、Web から切り取って貼り付けようとしているコードが Linux コンピューターにどのような影響を与えるかを理解したい場合、変数は不可欠です。始めましょう!
変数101
変数は、文字列または数値を表す名前付きシンボルです。これらをコマンドや式で使用すると、変数の名前ではなく、保持する値を入力したものとして扱われます。
変数を作成するには、名前と値を指定するだけです。変数名は説明的で、変数が保持する値を思い出させるものにする必要があります。変数名を数字で始めたり、スペースを含めたりすることはできません。ただし、アンダースコアで始めることもできます。それとは別に、大文字と小文字の英数字を任意に組み合わせて使用できます。
Bash 変数の例
ここでは、5 つの変数を作成します。形式は、名前、等号
=
、および値を入力することです。等号の前後にスペースがないことに注意してください。変数に値を与えることは、変数に値を割り当てることとよく呼ばれます。
4 つの文字列変数と 1 つの数値変数を作成します。
my_name=デイブ
my_boost=Linux
彼=ポパイ
his_boost=ほうれん草
今年=2019年
変数に保持されている
値を確認する
には、
echo
コマンドを使用します。以下に示すように、変数に含まれる値を参照する場合は常に、変数名の前にドル記号
$
を付ける必要があります。
$my_name をエコーする
$my_boostをエコーする
エコー $this_year
すべての変数を一度に使用してみましょう。
echo "$my_boost は $me に対して、$his_boost は $him に対して行われます (c) $this_year"
変数の値は名前を置き換えます。変数の値を変更することもできます。変数
my_boost
に新しい値を割り当てるには、最初の値を割り当てたときに行ったことを次のように繰り返すだけです。
my_boost=テキーラ
前のコマンドを再実行すると、異なる結果が得られます。
echo "$my_boost は $me に対して、$his_boost は $him に対して行われます (c) $this_year"
したがって、同じ変数を参照する同じコマンドを使用しても、変数に保持されている値を変更すると異なる結果が得られます。
変数の引用符については後で説明します。現時点では、覚えておくべきことがいくつかあります。
-
一重引用符
'で囲まれた変数は、変数ではなくリテラル文字列として扱われます。 -
引用符
"で囲まれた変数は変数として扱われます。 -
変数に保持されている値を取得するには、ドル記号
$を指定する必要があります。 -
ドル記号
$のない変数は、変数の名前のみを提供します。
既存の変数または複数の変数から値を取得する変数を作成することもできます。次のコマンドは、
drink_of_the_Year,
それに
my_boost
変数と
this_year
変数を組み合わせた値を割り当てます。
Drink_of-the_year="$my_boost $this_year"
エコー今年のドリンク
スクリプトで Bash 変数を使用する方法
変数がないとスクリプトは完全に機能不全に陥ります。変数は、スクリプトを特定のソリューションではなく一般的なソリューションにする柔軟性を提供します。違いを説明するために、
/dev
ディレクトリ内のファイルを数えるスクリプトを次に示します。
これをテキスト ファイルに入力し、
fcnt.sh
(「ファイル数」) として保存します。
#!/bin/bashfolder_to_count=/devfile_count=$(ls $folder_to_count | wc -l)$folder_to_count 内の $file_count ファイルをエコー
スクリプトを実行する前に、以下に示すようにスクリプトを実行可能にする必要があります。
chmod +x fcnt.sh
次のように入力してスクリプトを実行します。
./fcnt.sh
これにより、
/dev
ディレクトリ内のファイルの数が出力されます。仕組みは次のとおりです。
-
folder_to_countという変数が定義されており、文字列「/dev」を保持するように設定されています。 -
file_countという別の変数が定義されています。この変数はコマンド置換から値を取得します。これは括弧$( )で囲まれたコマンド フレーズです。最初のかっこの前にドル記号$があることに注意してください。この構成体$( )括弧内のコマンドを評価し、その最終値を返します。この例では、その値がfile_count変数に割り当てられます。file_count変数に関する限り、保持する値が渡されます。値がどのように取得されたかは関係ありません。 -
コマンド置換で評価されるコマンドは、「/dev」に設定されている、
folder_to_count変数内のディレクトリでlsファイルのリストを実行します。したがって、スクリプトはコマンド「ls /dev」を実行します。 -
このコマンドからの出力は、
wcコマンド にパイプ処理されます 。-l(行数) オプションを使用すると、wclsコマンドからの出力の 行数をカウント します。各ファイルは個別の行にリストされているため、これは「/dev」ディレクトリ内のファイルとサブディレクトリの数です。この値はfile_count変数に割り当てられます。 - 最後の行では、echo を使用して結果を出力します。
ただし、これは「/dev」ディレクトリでのみ機能します。スクリプトを任意のディレクトリで動作させるにはどうすればよいでしょうか?必要なのは、たった 1 つの小さな変更だけです。
スクリプトでコマンドラインパラメータを使用する方法
ls
や
wc
などの多くのコマンドは、コマンド ライン パラメーターを受け取ります。これらはコマンドに情報を提供するため、コマンドは何を実行したいかを認識します。
ls
をホーム ディレクトリ上で動作させ、
隠しファイルも表示したい
場合は、次のコマンドを使用できます。チルダ
~
と
-a
(all) オプションはコマンド ライン パラメーターです。
ls ~ -a
私たちのスクリプトはコマンドラインパラメータを受け入れることができます。最初のパラメータは
$1
番目は
$2
というように、9 番目のパラメータは
$9
まで参照されます。 (実際には
$0
もありますが、これは常にスクリプトを保持するために予約されています。)
通常の変数と同じように、
スクリプト
内でコマンド ライン パラメーターを参照できます。以下に示すようにスクリプトを変更し、新しい名前
fcnt2.sh
で保存しましょう。
#!/bin/bashfolder_to_count=$1file_count=$(ls $folder_to_count | wc -l)$folder_to_count 内の $file_count ファイルをエコーします
今回は、
folder_to_count
変数に最初のコマンド ライン パラメーター
$1
の値が割り当てられます。
スクリプトの残りの部分は、以前とまったく同じように機能します。スクリプトは特定の解決策ではなく、一般的なものになりました。 「/dev」でのみ動作するようにハードコーディングされていないため、任意のディレクトリで使用できます。
スクリプトを実行可能にする方法は次のとおりです。
chmod +x fcnt2.sh
次に、いくつかのディレクトリで試してみましょう。最初に「/dev」を実行すると、前と同じ結果が得られることを確認できます。次のように入力します。
./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin
「/dev」ディレクトリについては、前と同じ結果 (207 ファイル) が得られます。これは心強いもので、他のコマンド ライン パラメーターごとにディレクトリ固有の結果が得られます。
スクリプトを短縮するには、次のように、変数
folder_to_count
完全に省略し、全体で
$1
を参照することができます。
#!/bin/bash file_count=$(ls $1 wc -l) $1 の $file_count ファイルをエコーします
特殊な変数の操作
$0
については説明しましたが、これは常にスクリプトのファイル名に設定されます。これにより、名前が変更された場合でも、スクリプトを使用してその名前を正しく出力するなどの処理を行うことができます。これは、エントリを追加したプロセスの名前を知りたいログ記録の場合に便利です。
その他の特別なプリセット変数は次のとおりです。
- $# : スクリプトに渡されたコマンド ライン パラメーターの数。
- $@ : スクリプトに渡されるすべてのコマンドラインパラメータ。
- $? : 最後に実行したプロセスの終了ステータス。
- $$ : 現在のスクリプトのプロセス ID (PID)。
- $USER : スクリプトを実行するユーザーのユーザー名。
- $HOSTNAME : スクリプトを実行しているコンピューターのホスト名。
- $SECONDS : スクリプトが実行されている秒数。
- $RANDOM : 乱数を返します。
- $LINENO : スクリプトの現在の行番号を返します。
それらすべてを 1 つのスクリプトで確認したいと思いませんか?あなたはできる!以下を、
special.sh
という名前のテキスト ファイルとして保存します。
#!/bin/bashcho "$# コマンドライン パラメータがありました"echo "それらは次のとおりです: $@"echo "パラメータ 1 は: $1"echo "スクリプトが呼び出されます: $0"# レポートできるようにするための古いプロセス終了ステータスpwdecho "pwd returns $?"echo "このスクリプトのプロセス ID $$"echo "スクリプトは $USER によって開始されました"echo "$HOSTNAME で実行されています"sleep 3echo "$SECONDS 秒間実行されています" echo "乱数: $RANDOM"echo "これはスクリプトの行番号$LINENOです"
次のように入力して実行可能にします。
chmod +x スペシャル.sh
これで、以下に示すように、さまざまなコマンド ライン パラメーターを使用して実行できるようになります。
環境変数
Bash は環境変数を使用して、起動時に作成する環境のプロパティを定義および記録します。これらの保持情報には、ユーザー名、ロケール、履歴ファイルに保持できるコマンドの数、デフォルトのエディターなど、Bash がすぐにアクセスできる情報が含まれます。
Bash セッションで アクティブな環境変数を確認する には、次のコマンドを使用します。
環境 |少ない
リストをスクロールすると、スクリプトでの参照に役立つものが見つかるかもしれません。
変数をエクスポートする方法
スクリプトが実行されるとき、スクリプトは独自のプロセス内にあり、スクリプトが使用する変数はそのプロセスの外では見ることができません。スクリプトが起動する別のスクリプトと変数を共有したい場合は、その変数をエクスポートする必要があります。 2 つのスクリプトを使用してこれを行う方法を示します。
まず、次の内容を
script_one.sh
ファイル名で保存します。
#!/bin/bashfirst_var=alphasecond_var=bravo# 値を確認してくださいecho "$0: first_var=$first_var, Second_var=$second_var"export first_varexport Second_var./script_two.sh# 値を再度確認してくださいecho "$0: first_var=$first_var, Second_var= $sec_var"
これにより、
first_var
と
second_var
という 2 つの変数が作成され、いくつかの値が割り当てられます。これらを端末ウィンドウに出力し、変数をエクスポートして、
script_two.sh
を呼び出します。
script_two.sh
が終了し、プロセス フローがこのスクリプトに戻ると、変数が再び端末ウィンドウに出力されます。その後、変更があったかどうかを確認できます。
使用する 2 番目のスクリプトは
script_two.sh
です。これは、
script_one.sh
が呼び出すスクリプトです。次のように入力します。
#!/bin/bash# 値を確認してくださいecho "$0: first_var=$first_var, Second_var=$second_var"# 新しい値を設定first_var=charlienext_var=delta# 値を再度確認してくださいecho "$0: first_var=$first_var, Second_var=$second_var"
この 2 番目のスクリプトは、2 つの変数の値を出力し、それらに新しい値を割り当てて、再度出力します。
これらのスクリプトを実行するには、次のように入力して実行可能にする必要があります。
chmod +x script_one.shchmod +x script_two.sh
次に、次のように入力して
script_one.sh
を起動します。
./script_one.sh
出力からは次のことがわかります。
- script_one.sh は 、変数の値 (alpha と bravo) を出力します。
- script_two.sh は 、受け取った変数 (alpha と bravo) の値を出力します。
- script_two.sh は それらをチャーリーとデルタに変更します。
- script_one.sh は 変数の値を出力しますが、まだアルファとブラボーです。
2 番目のスクリプトで起こったことは、2 番目のスクリプトに残ります。これは、変数のコピーが 2 番目のスクリプトに送信されるのと似ていますが、そのスクリプトが終了すると破棄されます。最初のスクリプトの元の変数は、2 番目のスクリプトのコピーに何が起こっても変更されません。
変数を引用符で囲む方法
スクリプトが変数を参照するとき、変数は引用符
"
で囲まれていることにお気づきかもしれません。これにより、変数が正しく参照されるようになり、スクリプト内で行が実行されるときに変数の値が使用されます。
変数に割り当てる値にスペースが含まれている場合は、変数に割り当てるときにスペースを引用符で囲む必要があります。これは、Bash がデフォルトで区切り文字としてスペースを使用するためです。
以下に例を示します。
site_name=ハウツーオタク
Bash は、「Geek」の前のスペースを、新しいコマンドが開始されていることを示すものとして認識します。そのようなコマンドは存在しないと報告し、回線を放棄します。
echo
、
site_name
変数には何も保持されていないこと、つまり「ハウツー」テキストさえも保持していないことを示しています。
以下に示すように、値を引用符で囲んで再試行してください。
site_name="ハウツーオタク"
今回は、単一の値として認識され、
site_name
変数に正しく割り当てられます。
エコーはあなたの友達です
コマンドの置換、変数の引用符の付け方、ドル記号をいつ含めるかを覚えるのに慣れるまでには時間がかかる場合があります。
Enter キーを押して Bash コマンドの行を実行する前に、コマンドの前に
echo
を付けて実行してみてください。こうすることで、何が起こるかがあなたが望むものであることを確認できます。構文内で犯した可能性のある間違いを見つけることもできます。





