shellスクリプトではまったところ

まとまったshellscriptを書いて最近はまったところ
忘れることが多いのでメモ

trapは記述した以降の処理しかtrapできない

時間がかかる処理なんだけど、
外からkillされた時でもbackupしてほしいとかいう時に使うんですが、
スクリプトの中にtrapが出る前にkillされたりすると、発動しない
あたり前といえば当たり前。

#!/bin/sh

#処理A 
#ここで exit 1としてもtrapに行かない

trap backup 0 1 9

#処理B ここで exit 1とかやるとtrapされる

複数行のものを引数に与える時は”で囲む

これも久々に思い出しったって感じ。
そういえばそーだなーって。

#!/bin/sh

list=`ls -la ./`

func $list   #これだと初めの1行しか持って行かれない
func "$list" #全部を処理したい場合はこうする

グローバル、ローカル変数を意識する

負債的な感じのながーいshellscriptとかを分割するんだけど
関数内であっても同じ変数名だとスコープが同じ。

#########
#mainA.sh
#!/bin/sh

. ./func.sh

val="test"

funcA val 
echo val #この結果は "A"

#########
#mainB.sh
#!/bin/sh

. ./func.sh

val="test"

funcB val 
echo val #この結果は "test"


##########
#func.sh
#!/bin/sh
funcA(){
  val=$1        #これだとvalを変更すると全部のvalが変更されてしまう。
  val="A"
}

funcB(){
  local val=$1  #localをつけるとスコープが変わる
  val="B"
}
connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

Jp, Tokyo https://connvoi.com