🕷️

shell のlocal宣言 注意事項 ⚠️

2021/12/08に公開

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