\r\n\r\n

bashで変数を使用する方法

スクリプトを書き、ウェブからカット&ペーストするコードのlinuxのコンピュータへの影響を理解したい場合は、変数は不可欠です。スタートさせます! ...

スクリプトを書き、ウェブからカット&ペーストされるコードのLinuxコンピュータへの影響を理解したい場合は、変数は不可欠です。スタートさせます!

変数 101

変数とは、文字列や値を表す名前付きのシンボルです。コマンドや式の中で使用する場合は、変数名ではなく、その中に含まれる値を入力したものとして扱われます。

変数を作るには、名前と値を与えるだけでよい。変数名は、説明的で、それらが持つ値を思い起こさせるものでなければなりません。変数名は数字で始めることはできず、スペースを含むことはできません。ただし、アンダースコアで始めることは可能です。これに加えて、大文字と小文字の英数字を自由に組み合わせて使用することができます。

ここでは、5つの変数を作成します。名前、イコール記号、値を入力する形式です。等号の前後にスペースがないことに注意してください。変数に値を代入することは、しばしば「変数に値を代入する」と呼ばれる。

今回は、文字列変数を4つ、数値変数を1つ作成します。

me=Dave my_boost=Linux him=Popeye his_boost=Spinach this_year=2019

変数に格納されている値を見るには、echoコマンドを使用します。変数名に含まれる値を引用する場合は、次のように変数名の前にドル記号$を付けなければならない。

echo $my_name echo $my_boost echo $this_year

すべての変数を同時に使ってみよう。

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

変数の値が名前の代わりになります。また、変数の値を変更することも可能です。変数 myu boost に値を代入するには、次のように、値を代入するときの動作を繰り返すだけです。

my_boost=Tequila

前のコマンドを再実行すると、今度は違う結果が得られます。

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

そのため、同じ変数を参照する同じコマンドを使っても、変数の値を変えれば異なる結果が得られる可能性がある。

参照変数については後述しますが、とりあえず、以下の点に注意してください。

  • 一重引用符で囲まれた変数は、変数としてではなく、テキスト文字列として扱われます。
  • "逆カンマ "内の変数は、変数とみなされます。
  • 変数内の値を取得するには、ドル記号 $ を指定する必要があります。
  • ドル記号$を持たない変数は、変数名のみを提供します。

また、既存の変数や複数の変数から値を取得する変数を作成することも可能です。次のコマンドは、drinku of \u The \u Year という新しい変数を定義し、my_gu boost と this_gu Year 変数の合計値を代入します。

drink_of-the_Year="$my_boost $this_year" echo drink_of_the-Year

スクリプトで変数を使う方法

変数がなければ、スクリプトはまったく機能しない。変数は、スクリプトを特定のものではなく、汎用的なソリューションとするための柔軟性を提供します。違いを説明するために、/devディレクトリにあるファイルを数えるスクリプトを紹介します。

これをテキストファイルに入力し、fcnt.sh("ファイル数 "の意)という名前で保存してください。

#!/bin/bash folder_to_count=/dev file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count

スクリプトを実行する前に、以下のように実行可能な状態にする必要があります。

chmod +x fcnt.sh

次のように入力すると、スクリプトが実行されます。

./fcnt.sh

これは、/devディレクトリにあるファイルの数を表示します。これは、次のように動作します。

  • folder to\ count という変数を定義し、"/dev" という文字列を保存するように設定する。
  • もう一つ、fileu countという変数が定義されている。この変数の値は、コマンドの代入から来る。これは、$()で囲まれたコマンドフレーズです。最初の括弧の前にドル記号$があることに注意してください。この$()という構文は、大括弧内のコマンドを計算し、その最終値を返します。この例では、変数file-taku countに値を代入しています。fileu count 変数の場合、保存する値を渡すだけで、その値がどのように取得されたかは問わない。
  • コマンド代入で計算されるコマンドは、「/dev」に設定されている「♪」から「♪」までのカウント変数にあるディレクトリ上のlsファイルのリストを実行します。そのため、スクリプトでは、"ls/dev "というコマンドを実行します。
  • l (line count) オプションは,wc に ls コマンドの出力中の行数をカウントさせます.各ファイルは別々の行に記載されるため、これは「/dev」ディレクトリ内のファイルとサブディレクトリの数になります。この値を fileu count 変数に代入する。
  • 最後の行は、echoを使って結果を出力しています。

しかし、これは「/dev」ディレクトリにしか適用されません。このスクリプトを任意のディレクトリで動作させるにはどうすればよいのでしょうか? ちょっと変更するだけです。

スクリプトでコマンドライン引数を使用する方法

多くのコマンド(lsやwcなど)は、コマンドライン引数を取ります。コマンドに情報を提供することで、コマンドに何をさせたいのかがわかるようになります。lsをホームディレクトリで動作させ、隠しファイルを表示させたい場合は、以下のコマンドを使用します。チルダ〜と-a(all)オプションはコマンドライン引数です。

ls ~ -a

私たちのスクリプトは、コマンドライン引数を受け取ることができます。第1引数は$1、第2引数は$2、以下同様、第9引数は$9と参照される(実際には$0もあるが、これはスクリプトが常に保存されるように予約されている)。

コマンドライン引数は、通常の変数を参照するのと同じように、スクリプト内で参照することができます。以下のようにスクリプトを修正し、新しい名前 fcnt2.sh で保存してみましょう。

#!/bin/bash folder_to_count=$1 file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count

このとき、変数folder_to_countには、コマンドラインの第1引数$1の値が代入される。

それ以外のスクリプトは、これまでとまったく同じです。スクリプトは一般的なものであり、ソリューションに特化したものではありません。ハードコーディングされていないため、どのディレクトリでも使用でき、「/dev」でのみ使用可能です。

ここでは、スクリプトを実行可能にする方法を説明します。

chmod +x fcnt2.sh

今度は、いくつかのディレクトリで試してみてください。まず、"/dev "を実行して、前と同じ結果が得られることを確認します。

./fnct2.sh /dev ./fnct2.sh /etc ./fnct2.sh /bin

dev」ディレクトリの場合は、先ほどと同じ結果(207ファイル)になります。他のすべてのコマンドライン引数に対して、ディレクトリ固有の結果を得ることができるので、これは心強い。

スクリプトを短くするために、以下のように変数folderu Toacheu countを省略し、全体を通して$1だけを参照することができます。

#!/bin/bash file_count=$(ls $1 wc -l) echo $file_count files in $1

特殊変数の使用

先ほど$0と書きましたが、これは常にスクリプトのファイル名に設定されています。これにより、スクリプトを使用して、名前が変更された場合でも、その名前を正しく印刷するなどのアクションを実行することができます。これは、ログを取る場合に、そのエントリーが追加されたプロセスの名前を知る必要がある場合に有効である。

その他、特殊な事前定義変数を以下に示します。

  • $#: スクリプトに渡すコマンドライン引数の数です。
  • スクリプトに渡されるすべてのコマンドライン引数。
  • 最後に実行されたプロセスの終了状態。
  • $$: 現在のスクリプトのプロセスID(PID)。
  • USER: スクリプトを実行するユーザーのユーザー名。
  • $HOSTNAME: スクリプトを実行するコンピュータのホスト名。
  • $SECONDS: スクリプトが実行されている秒数です。
  • $RANDOM: 乱数を返します。
  • $LINENO: スクリプトの現在の行番号を返します。

これを1つのスクリプトにまとめて見たいと思いませんか? できます!以下の内容をspecial.shというファイル名で保存してください。

#!/bin/bash echo "There were $# command line parameters" echo "They are: $@" echo "Parameter 1 is: $1" echo "The script is called: $0" # any old process so that we can report on the exit status pwd echo "pwd returned $?" echo "This script has Process ID $$" echo "The script was started by $USER" echo "It is running on $HOSTNAME" sleep 3 echo "It has been running for $SECONDS seconds" echo "Random number: $RANDOM" echo "This is line number $LINENO of the script"

次のように入力して、実行可能な状態にします。

chmod +x special.sh

以下のように、さまざまなコマンドラインパラメータを指定して実行することができるようになりました。

環境変数

Bashは、起動時に作成する環境のプロパティを定義し、記録するために環境変数を使用します。これらは、ユーザー名、地域の設定、履歴ファイルに保存できるコマンドの数、デフォルトのエディタなど、Bashがいつでもアクセスできる情報を保存します。

Bashセッションでアクティブな環境変数を表示するには、次のコマンドを使用します。

env | less

リストをスクロールすると、有用なスクリプトのリファレンスが見つかるかもしれません。

変数のエクスポート方法

スクリプトが実行されると、そのスクリプトは独自のプロセスの中にあり、使用する変数はそのプロセスの外からは見えません。スクリプトで起動した別のスクリプトと変数を共有したい場合は、その変数をエクスポートする必要があります。その方法を2つのスクリプトで紹介します。

まず、以下をファイル名スクリプト_a.shで保存します。

#!/bin/bash first_var=alpha second_var=bravo # check their values echo "$0: first_var=$first_var, second_var=$second_var" export first_var export second_var ./script_two.sh # check their values again echo "$0: first_var=$first_var, second_var=$second_var"

これは、最初の変数と2番目の変数の2つを作成し、それらにいくつかの値を代入しています。script_two.sh が終了し、このスクリプトに戻ると、再び変数をターミナルウィンドウに出力する。その後、変更されたかどうかを確認することができます。

2番目に使用するスクリプトはscript_two.shです。 これはそのscript_one_callです。 次のように入力します。

#!/bin/bash # check their values echo "$0: first_var=$first_var, second_var=$second_var" # set new values first_var=charlie second_var=delta # check their values again echo "$0: first_var=$first_var, second_var=$second_var"

2番目のスクリプトは、2つの変数の値を表示し、新しい値を代入して、再び表示します。

これらのスクリプトを実行するには、次のようにタイプして実行可能な状態にする必要があります。

chmod +x script_one.sh chmod +x script_two.sh

ここで、以下のコマンドを入力し、_a.shスクリプトを起動します。

./script_one.sh

これが出力からわかることです。

  • script_a.sh は、変数 alpha と bravo の値を表示します。
  • スクリプト_two.shは、変数(alphaとbravo)の値を受信したときに表示します。
  • Script_two.shはCharlieとDeltaに置き換えています。
  • Script_a.shは変数の値を表示しますが、これはまだアルファとブラボーのままです。

2つ目のスクリプトで起こったことは、2つ目のスクリプトに残ります。これは、2番目のスクリプトに送られる変数のコピーのようなものですが、スクリプトが終了するときに破棄されます。最初のスクリプトの元の変数は、2番目のスクリプトのコピーに何が起こっても、何ら変わることはありません。

変数の参照方法

スクリプトが変数を参照するとき、逆カンマで書かれていることにお気づきでしょうか。これにより、変数が正しく参照され、スクリプト内の行を実行する際にその値が使用されるようになります。

変数に代入される値にスペースが含まれる場合、変数に代入する際にはスペースを逆カンマで囲む必要があります。これは、Bashがデフォルトで空白をセパレータとして使用するためです。

一例として

site_name=How-To Geek

Bashは、"Geek "の前にスペースがあると、新しいコマンドが開始されたと判断します。そのようなコマンドはないと報告し、その行を削除します。 echo は、siteu name 変数に何も含まれていないこと、「How To」のテキストも含まれていないことを教えてくれます。

値を逆カンマで囲み、次のように再試行してください。

site_name="How-To Geek"

今回は1つの値として認識され、正しくsiteu name変数に代入されます。

エコーはあなたの友達です

コマンドの置換、変数の参照、ドル記号を含むタイミングを覚えるなど、慣れるまで少し時間がかかるかもしれません。

Enterキーを押してBashコマンドの行を実行する前に、その前にechoを使用してみてください。そうすることで、次に起こることがあなたの望むことだと確信できるのです。また、構文の間違いも発見することができます。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ