shellのTips

初期値設定

引数が設定されていなかったら、指定した初期値を設定して処理を続ける

func(){
  local arg1=${1:-default1}
  echo $arg1
}

変数を指定した場合

$ func test
test

指定していない場合

$ func
default1

文字列から指定した文字を削除する

先頭、もしくは末尾からであれば、sedperlを使うまでもない。
先頭の場合には、「#」末尾の場合には「%」を使う

target="1234567890"

先頭の123を削除

echo ${target#123}

末尾の890を削除

echo ${target%890}

先頭の3文字を削除

echo ${target#???}

末尾の3文字を削除

echo ${target%???}

先頭の4までを削除

echo ${target#*4}

末尾の7までを削除

echo ${target%7*}

ファイル target.txt の各行から先頭の3文字をなくしたものを result.txt に保存

cat target.txt | while read n
do
  echo ${n#???}
done > result.txt

sedの場合

cat target.txt | sed -e 's/^...//' > result.txt

perlの場合

cat target.txt | perl -nlpe 's/^...//' > result.txt

パス区切り文字列の場合

ディレクトリのパスを取得するなら

dirname $filepath

ファイル名だけ取りだすなら

basename $filepath

拡張子を切りとるなら

basename $filepath .txt

NSDateの件

文字列からNSDateを生成

NSDateFormatter *f = [[[NSDateFormatter alloc] init] autorelease];
[f setDateFormat:@"yyyy-MM-dd"];
return [f dateFromString:string];	

NSDateから曜日を取得

NSCalendarからNSDateComponentsを取得する

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *c = [calendar components:NSWeekdayCalendarUnit fromDate:date];
return [c weekday];

weekdayは1から7までの数値。それぞれ、日曜日から土曜日に対応している。
上記例では、compontensにNSWeekdayCalendarUnitのみしか指定していない為、weekdayしか取得できない。
その他のプロパティ(year,month,day,hour,min,sec等)を取得する場合には、下記のようにする

NSDateComponents *c = [calendar components:
  NSYearCalendarUnit
  |NSMonthCalendarUnit
  |NSDayCalendarUnit
  |NSHourCalendarUnit
  |NSMinuteCalendarUnit
  |NSSecoundCalendarUnit
  |NSWeekdayCalendarUnit
 fromDate:date];

各CalendarUnitはXcodeが補完してくれる。それをビット演算子「|」で繋ぐ。
NSWeekdayCalendarUnitとNSWeekCalendarUnitは違うので注意。