Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2911

bashでevalを使って変数内の文字列を評価・連結して実行する

$
0
0

目的

  • 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

Viewing all articles
Browse latest Browse all 2911

Trending Articles