12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

目的

  • 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
12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?