目的
- bashでevalを使って変数内の文字列を評価して実行する
- bashでevalを使って変数内の文字列を連結して実行する
環境
- bash
evalの使用例
同ディレクトリ内に、以下2つのtxtファイルを格納した状態とします。
hoge.txt
hoge hoge
fuga.txt
fuga fuga
evalを使って、単純な文字列ではなく、文字列を評価・連結します。
evalの基本的な機能の説明は割愛します。
example.sh
#!/bin/bashvalue='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$2fi
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$2fi
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