目的
- bashでevalを使って変数内の文字列を評価して実行する
- bashでevalを使って変数内の文字列を連結して実行する
環境
- bash
evalの使用例
同ディレクトリ内に、以下2つのtxtファイルを格納した状態とします。
hoge.txt
hoge hoge
fuga.txt
fuga fuga
evalを使って、単純な文字列ではなく、文字列を評価・連結します。
evalの基本的な機能の説明は割愛します。
example.sh
#!/bin/bash
value='hoge'
#文字列としてコマンドを変数に格納
#bash内の関数に文字列としてコマンドを与えるケースや、
#ファイルから文字列としてコマンドを読み込むケースを想定
cmd='grep $value hoge.txt'
echo $cmd
#出力 -> grep $value hoge.txt
#echoの場合、コマンドは実行されない. 変数は展開されずに、文字列として出力される
eval $cmd
#出力 -> hoge hoge
#evalの場合、変数が展開され、コマンド実行される
実行結果
$ ./example.sh
grep $value hoge.txt
hoge hoge
文字列内の変数を評価してechoで出力
success.sh
#!/bin/bash
#同ディレクトリ内のtxtファイルにgrepを実行し,検索パターンが見つかった場合,メッセージを出力する関数.
#第一引数に検索パターン,第二引数に出力するメッセージを渡す
grep_text() {
for txt_file in $(ls . | grep ".txt$"); do
grep_result=$(grep $1 $txt_file)
if [ $? -eq 0 ]; then
eval echo $2
fi
done
}
query='hoge'
#関数内で使用している変数を出力メッセージに含める
message='検索対象が見つかりました. 見つかったファイル名:$txt_file'
grep_text $query "${message}"
query='fuga'
message='検索対象が見つかりました. 見つかった文:$grep_result'
grep_text $query "${message}"
実行結果
$ ./success.sh
検索対象が見つかりました. 見つかったファイル名:hoge.txt
検索対象が見つかりました. 見つかった文:fuga fuga
以下のように、evalを使わない場合、文字列内の変数が評価されません。
failed.sh
#!/bin/bash
grep_text() {
for txt_file in $(ls . | grep ".txt$"); do
grep_result=$(grep $1 $txt_file)
if [ $? -eq 0 ]; then
#evalを使わない場合
echo $2
fi
done
}
query='hoge'
message='検索対象が見つかりました. 見つかったファイル名:$txt_file'
grep_text $query "${message}"
query='fuga'
message='検索対象が見つかりました. 見つかった文:$grep_result'
grep_text $query "${message}"
実行結果
$ ./fail.sh
検索対象が見つかりました. 見つかったファイル名:$txt_file
検索対象が見つかりました. 見つかった文:$grep_result
文字列内のコマンドを評価して実行
cmd.sh
#!/bin/bash
grep_text() {
for txt_file in $(ls | grep ".txt$"); do
#引数で渡されたgrepを実行
grep_result=$(eval $1)
#検索パターンが見つかった場合,メッセージを出力
if [ -n "$grep_result" ]; then
echo "検索対象が見つかりました. 見つかった文:$grep_result"
fi
done
}
cmd='grep "hoge" $txt_file'
echo $cmd
grep_text "$cmd"
cmd='grep "fuga" $txt_file'
echo $cmd
grep_text "$cmd"
実行結果
$ ./cmd.sh
grep "hoge" $txt_file
検索対象が見つかりました. 見つかった文:hoge hoge
grep "fuga" $txt_file
検索対象が見つかりました. 見つかった文:fuga fuga