LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-11

バッククオート便利

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

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を参照しちゃうんでしょうか?

1
1
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
1
1