Bash eval command

`eval` コマンドはbashでシェルコマンドのように引数を実行するために使用されます。 引数は文字列で結合され、シェルコマンドの入力として受け取られ、コマンドを実行する。 eval` は現在のシェルでコマンドを実行します。 このコマンドは特殊な演算子や予約されたキーワードを含むコマンドを実行する必要がある場合に便利です。 このコマンドは、スクリプトを実行するまで変数名がわからないようなスクリプトでも使うことができます。

構文:

eval

ここで、引数は解析され、シェルが実行する文字列に結合されます。 eval` はコマンド実行後に終了ステータスコードを返す。

Example-1: `eval` を使って `wc` コマンドを実行する

department.txt という名前のテキストファイルに、次のようなテキストが含まれているとします. このファイルの総行数は `wc` コマンドで数えることができます。

department.txt

CSE
EEE
ETE
ENGLISH
BBA
PHARMACY

以下のコマンドは、ファイル department.txt の行数を数える `wc` コマンドを変数 $mycommand に格納します。

$ mycommand=”wc -l department.txt”

department.txt の行数を数えるコマンドを変数に格納し、その行を `wc` コマンドと呼びます。txt”

次の `eval` コマンドは `wc` コマンドを実行し、総行数を表示します。

$ eval $mycommand

出力:

出力では、department.txt の行数が表示されています。

例2:`eval`を使って`expr`コマンドを実行する

bash ファイル evaltest.sh を作成し、以下のスクリプトを追加してください。 このスクリプトは、変数 $x と $y に2つの整数値を代入する。 expr`コマンドと`echo`コマンドは、$c1と$c2という二つの変数に代入され、後で`eval`コマンドを使って実行されます。

evaltest.sh

#!/bin/bash
#変数 x と y を初期化する
x=5
y=15
#最初のコマンド変数は $x と $y を足す `expr` コマンドに使われる
c1=”`expr $x + $y`”
#2 番目のコマンドは $x と $y の値を足すコマンドに使われる
c1=”`expr $x + $y`”
#bin/bash##2 つの変数が初期値として使われる。 変数には `echo` コマンドを代入します
c2=”echo”
#eval` は $c1
と $c2 変数のコマンドを実行して $x と $y の合計を計算して表示します
eval $c2 $c1

スクリプトを実行します。

$ bash evaltest.sh

5と15の和は出力に示される20です。

例3:別の変数に代入した値を表示する

以下のスクリプトで evaltest2.sh というbashスクリプトを作ってみてください。 ここでは、ある変数に、文字列データを格納した別の変数の名前を代入しています。 eval`コマンドを実行すると、別の変数名を含む変数の値がcontentとして表示されます。

evaltest2.sh

#!/bin/bash
# 変数に文字列の値を代入 $str1
str1=”Shell Script”
# 変数に変数名「str1」を代入 $str2
str2=str1
# コマンドを変数に格納する。 $command
command=”echo”
# `eval` コマンドを実行すると、`echo` コマンドを実行して、その値を含む変数
を別の変数に表示します
eval $command \${$str2}

スクリプトを実行します。

$ bash evaltest2.sh

変数 $str1 の値が表示されます。

別の変数名を持つ値にアクセスする方法がもう一つあります。 このタイプの変数の値には、「!」記号を使ってアクセスすることができる。

$ str1=”Shell Script”; str2=str1; command=”echo”; eval $command ${!str2}

$ str1=”Shell Script”; str2=str1; command=”echo”; echo ${!

例4:値を持つ一連の変数を作り、`eval`コマンドで値の合計を計算する

evaltest3.shというbashスクリプトを作り、次のスクリプトを追加します。 このスクリプトは一連の変数を作成し、`eval`コマンドを使用して変数に値を格納します。 変数の値は加算され、$sumという変数に格納されます。 次に、文字列の値を持つ `echo` コマンドを変数に代入し、`eval` コマンドで変数 $sum の値を表示します。

evaltest3.sh

#!/bin/bash
# 値 0
sum=0
# 4回反復する for ループを宣言
for n in {1….4}
do
# evalコマンドで4つの変数を作成
eval x$n=$n
#変数の値を$sumで加算
sum=$(($sum+$x$n))
done
# `echo`コマンドを代入done
# 変数の値は$sum=$(($sum+$x$n))。 という文字列を変数に格納
command=”echo ‘The result of sum='”
# `eval`コマンドで変数を使って合計値を表示
eval $command $sum

スクリプトを実行します。

$ bash evaltest3.sh

4つの変数の合計は、1+2+3+4=10と出力されます。

Example-5: `eval`コマンドを使ってファイルのリストを削除

bashファイルに以下のスクリプトを作って、evaltest4.shと呼びましょう。 このスクリプトは、3つのコマンドライン引数を削除するファイル名として読み取り、引数の値を配列変数$fnに格納します。 コマンド`rm’は変数$commandに格納される。 ここでは、各ファイル名を取得し、ファイルが存在すれば `eval` コマンドでファイルを削除するための For ループが宣言されています。

evaltest4.sh

#!/bin/bash
#Declare an array
declare -.fn
# 3つのコマンドライン引数を読み、配列の3つのインデックスに格納
fn=$1
fn=$2
fn=$3
# removeコマンドを変数に格納
command=”rm”
# forループは3回繰り返し、配列要素を読み込む
for index in 0 1 2
do
# check file exists or not exist
if }. ]]; then
# If file exists then remove file
eval $command ${fn}
# File is removed
echo “${fn} is deleted.”
Else
#Information that is not exist
echo “${fn} not exist.” #ファイル不在を知らせる。”
fi
done

スクリプトを実行する。

$ bash evaltest4.sh marks.docx item.txt product.docx

ここでは、実行時に三つのファイル名が指定されています。

まとめ

bash のコマンドは文字列で宣言すれば `eval` コマンドで実行可能です. このチュートリアルでは、`eval`コマンドを使って、bashのさまざまな組み込みコマンドを実行し、一連の変数を作成します。 このチュートリアルを読めば、`eval`コマンドの使い方がわかり、様々な用途にこのコマンドを使うことができるようになるはずです。

コメントを残す

メールアドレスが公開されることはありません。