Bash スクリプトで変数内のコマンドを実行する

Naila Saad Siddiqui 2024年2月15日
  1. Bash スクリプト変数
  2. Eval コマンドを使用して、Bash スクリプトで変数内のコマンドを実行する
  3. -c フラグを指定して bash を使用して、Bash スクリプトで変数内のコマンドを実行する
  4. コマンド置換 $() を使用して、Bash スクリプトで変数内のコマンドを実行する
Bash スクリプトで変数内のコマンドを実行する

このガイドでは、Bash コマンドを変数に格納し、後でこの変数から直接実行する方法について説明します。 最初に、変数に含まれるコマンドを実行する複数の方法について説明し、その後にいくつかのスクリプト例を示します。

始めましょう。

Bash スクリプト変数

変数は、Bash が提供する重要な機能です。 これらを if 制御構造、case 構造、または単純にスクリプト内で使用するかどうかに関係なく、これらはスクリプトを整理するだけでなく、スクリプトの理解を非常に容易にします。

それらをスクリプトとして実行することもできるため、多くのコマンドをパイプ処理していてコマンドが非常に長い場合に特に作業が楽になります。 これにより、100 語の長さのスクリプトの長さが 1 に短縮され、12 語にも満たない場合があります。

100 ワードの長さのスクリプトと、10 ワードにも満たないスクリプトのデバッグを想像してみてください。 節約できる時間を考えてください。

場合によっては、ユーザーからコマンドを受け取り、それらを変数に格納し、いくつかのビジネス ロジック (一連の if-else 決定など) を適用した後にそれらの一部を条件付きで実行する Bash ラッパーを作成する必要があります。 さて、これらのシナリオでは、変数に格納されたコマンドを解析および解釈して Bash コマンドとして実行するのに役立つメソッドを確認する必要があります。

ここでは、変数に含まれるコマンドを実行する最も効率的な方法をいくつか説明します。

Eval コマンドを使用して、Bash スクリプトで変数内のコマンドを実行する

一部の Bash スクリプトでは、入力値または変数 (たとえば) を使用して文字列を作成し、最後にコマンドとして実行する必要があります。 eval コマンドは、これらの状況での答えです。

シェル コマンドのようにパラメーターを評価するには、Bash の eval コマンドを使用します。

シェル コマンドは引数の文字列を受け取り、その文字列を使用してコマンドを実行します。 次に、コマンドは現在のシェルで eval によって実行されます。

このコマンドは、特定の演算子または予約語を使用するコマンドを実行する場合に役立ちます。

構文:

eval [arguments...]

引数はこのコマンドに渡され、文字列リテラルとして結合されてから、実行のために Bash に送信されます。 このコマンドは、コマンドの実行後に終了ステータスを返します。

このコマンドに引数が渡されないか、null が渡された場合、終了ステータスとして 0 が返されます。

例 1: ファイル内の単語数を数えます。

数行のテキストを含むファイル mysample.txt があるとします。 そのファイル内の単語数をカウントする必要がある場合は、wc -w コマンドを使用できます。

eval コマンドを使用してこのタスクを実行します。 Bash スクリプトは次のようになります。

#!/bin/bash
wordcount="wc -w mysample.txt"
eval $wordcount

その出力を見てみましょう:

eval コマンド出力

例 2: 複数の変数を使用してコマンドを作成します。

Welcome to Eval Command ステートメントを出力する必要があるとします。 これは、eval コマンドを使用して実行できます。

#!/bin/bash
var1="Welcome to Eval Command"
comm1="echo"

eval $comm2 $var1

このスクリプトでは、2つの変数を作成しました。1つは出力するメッセージを含み、もう 1つは echo コマンドを含みます。 これら 2つの変数を eval コマンドに渡すと、それに応じてコマンド全体が構築されます。

このスクリプトを実行すると、次の出力が得られます。

複数の変数を含む eval コマンドの出力

例 3: 変数の値を出力します。

次の例では、別の変数を含む変数の値を出力します。

#!/bin/bash
str1="my script"
str2= str1
comm="echo "
eval $comm '$str2'

上記のスクリプトの出力は次のようになります。

eval ネスト変数出力

例 4: 数値の合計を出力します。

次の例では、スクリプトで for ループを使用して、1 から 4 までの範囲の数値の合計を出力します。 次に、eval コマンドを使用してその合計を出力します。

この問題のスクリプトは次のとおりです。

#!/bin/bash
sum=0
for n in {1..4}
do
sum=$(($sum+$n))
done
comm="echo 'The result of sum from 1-4 is: '"
eval $comm $sum

上記のスクリプトの出力は次のようになります。

数値の合計出力

-c フラグを指定して bash を使用して、Bash スクリプトで変数内のコマンドを実行する

デフォルトでは、bash コマンド インタープリターは標準入力またはファイルからコマンドを読み取り、実行します。 ただし、-c フラグが設定されている場合、bash インタープリターは最初の文字列パラメーター (オプションではない引数である必要があります) からコマンドを読み取ります。

したがって、これを使用して、Bash 文字列変数に格納されたコマンドを実行できます。

たとえば、次のスクリプトは最初に ls コマンド文字列を COMMAND 変数に割り当てます。 次に、bash インタープリターと -c コマンドを使用して、COMMAND 変数を入力として使用します。

#!/bin/bash
COMMAND="ls"
bash -c $COMMAND

上記のコマンドは、スクリプト ファイルの現在の作業ディレクトリにあるすべてのディレクトリとファイルを一覧表示します。

コマンド置換 $() を使用して、Bash スクリプトで変数内のコマンドを実行する

コマンド置換メソッドを使用して、変数に格納されたコマンドを次のように実行できます。

#!/bin/bash
COMMAND="ls"
$(echo $COMMAND)

関連記事 - Bash Variable