🕷️
shell のlocal宣言 注意事項 ⚠️
shell力が足りなくて、関数内の変数がglobalであることを知らなかった...
#!/bin/sh
do_something() {
name=$1
echo "Hello, " "$name"
}
name="Mario"
echo "Before:" "$name"
do_something "Peach"
echo "After:" "$name"
実行結果
$ bash sample.sh
Before: Mario
Hello, Peach
After: Peach
これを回避するためにlocal宣言をする必要がある
do_something() {
local name=$2
echo "Hello, " "$name"
}
$ bash sample.sh
Before: Mario
Hello,
After: Mario
ただ普通にPOSIXのshellではlocal宣言をすると、shellcheckのSC2039 のwarningsが出る.
bashとかならlocalは定義済みでwarningsは消える
#!/bin/bash
ここで下記のようにコマンドの実行値をlocalで受ける場合は、さらに SC2155 でwarnings.
local name=$(echo "$1")
どうやらlocalは上記で言うechoのコマンドのexit codeを上書きしてしまうのでダメっぽい。
local name
name=$(echo "$1")
のように2行に分けて宣言する必要がある.
Discussion