t0mmy

2020年12月30日に参加

学習履歴詳細

Shell Script 基礎

やったこと

書籍「新しいシェルプログラミングの教科書」

  • Bash 関数 変数の有効範囲
  • 組み込みコマンド

学んだこと

Bash 関数 変数の有効範囲

特に指定がない場合、たとえ関数内で宣言した変数でも、グローバル変数となる。

#!/bin/bash

update_hoge()
{
  hoge="hoge"
  echo $hoge /*hoeg*/
}

update_hoge

echo $hoge /*hoeg*/

local 修飾子を付与することで、宣言したブロック内でのみ有効な、いわゆるローカル変数となる。

#!/bin/bash

update_hoge()
{
  local hoge="hoge"
  echo $hoge /*hoge*/
}

update_hoge

echo $hoge /*何も表示されない*/

local 修飾子は、関数内でのみ使用可能。
グローバル領域で使用すると、以下のエラーが発生する。

line 18: local: can only be used in a function

ただし、ネストされた関数内までであれば、有効。

#!/bin/bash

func2()
{
  echo $hoge /*hoge*/
  hoge="fuga"
}

func1()
{
  local hoge="hoge"
  func2
  echo $hoge /*fuga*/
}

func1

echo $hoge /*何も表示されない*/

呼び出し先(上記の例だと、func2())でも local を付与すると、上書きされない。

#!/bin/bash

func2()
{
  echo $hoge /*hoge*/
  local hoge="fuga"
}

func1()
{
  local hoge="hoge"
  func2
  echo $hoge /*hoge*/
}

func1

echo $hoge /*何も表示されない*/

FUNCNAME

関数内でのみ使用できる変数。
関数名を取得できる。

#!/bin/bash

hoge()
{
  for name in ${FUNCNAME[@]}
  do
    echo $name
  done
}

hoge
hoge
main

デバッグ等で使用する。

組み込みコマンド

: ヌルコマンド

常に終了ステータス0を返すコマンド。
これを活用することで、無限ループを表現できる。

while :
do 
  処理
done

printf -v オプション

printf の結果を、指定した変数に格納できる。

感想

local 修飾子は、typescriptの const 並みに必須となりそうな予感がする。

ShellScript

2022年06月19日(日)

2.0時間