ShellScript
Bash
shell

関数のバッククオート実行と変数のスコープ

More than 3 years have passed since last update.


バッククオート便利

変数にコマンドの実行結果を代入するには、以下のようにバッククオート (もしくは $()) を使う。


hello.sh

#! /bin/sh

function hello() {
echo 'こんにちは'
}

reply=`hello`
echo $reply



危険な香り

多用したくなりがちなバッククオートだが、グローバル変数の操作に関しては注意が必要。


global_variable_test.sh

#! /bin/sh

# グローバル変数
C=""

# グローバル変数を変更する関数
function changeC() {
C='変更しました'
}

C="変更してません"
changeC # 普通に呼び出す。
echo 'changeC 実行'
echo "C=$C" # 変わるはず

echo '--------------------------------'

C="変更してません"
TEMP=`changeC` # バッククオートで呼び出す。
echo 'changeC バッククオート実行'
echo "C=$C" # 変わるはず


なんとなく結果が予想できそうな気もするが、後者の方法ではCが変更されない。


text

$ ./test.sh

changeC 実行
C=変更しました
--------------------------------
changeC バッククオート実行
C=変更してません

サブシェルとして実行されて、別アドレスのCを参照しちゃうんでしょうか?