hollyさんのwiki

仕事でよく使いそうな変数の使い方をいろいろと。

変数のグローバル化

export使う。定番なので省略

変数のローカル化。自分で関数を定義した場合などでその関数の中のみ有効な変数にしたい場合

hogehoge () {
  local i=1
  expr $i + 1
  return 0
}
$iはhogehogeの中でのみ有効となる。外部からは参照できない

計算

exprでもいいけど
echo $((1 + 1))
2
でも可能。$[]で囲んで計算も可能

配列

宣言

代入の方法で普通の変数になるか配列になるか区別される
fruits=(melon banana apple)
()で括弧でくくる。もしくは
fruits[0]=melon
fruits[1]=banana
fruits[2]=apple
のように一つずつ代入も可*1

値を取得する

melonを取得する場合は
echo ${fruits[0]}
とする*2

値を全取得する

index指定を@にする
echo ${fruits[@]}
@の代わりに*でもよいがこっちの場合は予約変数IFSの影響を受ける

ちょっとした応用

コマンドの実行結果も配列にいれることが可能。たとえば
logs=($(find /var/log/ -depth -maxdepth 1 -type f))
とすると/var/log以下のログファイルリストがlogs変数に配列として格納される

よく使う特殊変数

変数説明
$#引数の数
$?直前のコマンドの終了コード
$$プロセスID
$0実行スクリプトの絶対パス
$*引数全てをスペースで区切って返す。IFSの値を変えれば区切り文字をスペース以外に変更することも可能
$@引数全てをスペースで区切って返すがIFSの影響を受けない

コロン

その1

echo ${name:-holly}
これは
if [ -z $name ]; then
    echo holly
fi 
と等価となる

その2

echo ${name:+holly}
これは
if [ ! -z $name ]; then
    echo holly
fi 
と等価となる

ファイル名、拡張子など

basename

basenameと同じ
path="/path/to/foo.tar.gz"
basename=${path##*/}

ファイル名

拡張子を除いた値
path="/path/to/foo.tar.gz"
filename=${basename%.*}

拡張子

extension=${basename##*.}
echo "extension: $extension"

substrのような使い方

str="i love nirvana"
echo ${str:7:7}
cutを使えばいけるかも。とも思った。変数展開だけでやったほうが直感的
echo $str | cut -b 8-14
タグ

Wiki内検索

Menu

ここは自由に編集できるエリアです。

管理人/副管理人のみ編集できます