2009-10-01から1ヶ月間の記事一覧

パス名からディレクトリ名を取り出す

dirnameはパス名からディレクトリ名だけを取り出すコマンド #!/bin/sh #cmddir.sh fullpath=`which "$1"` [ $? -ne 0 ] && exit 1 dirname "$fullpath" $ ./cmddir.sh vi /usr/bin

片方の配列にあってもう片方にはないデータを見つける(bash)

両方の配列に含まれる項目を抜き出しそれを元に配列から取り除く uniq -d は重複する行だけを表示し、uniq -u は重複しない行だけを表示する #!/bin/sh #array_diff.sh array1=('Tokyo' 'Beijing' 'Washington D.C.' 'London' 'Paris') array2=('Paris' 'Pus…

配列のデータを整列させる(bash)

sortコマンドを使って配列の中身をソートする 区切り文字に改行を指定しておけば、配列の中身を改行で区切って出力できる データに空白を含んでいても大丈夫 #!/bin/sh #arry_sort.sh array1=('Tokyo' 'Beijing' 'Washington D.C.' 'London' 'Paris') IFS=$'…

配列変数に一度に値をセットする(bash)

array_name=(word1 word2 word3)のように右辺を()でくくって まとめて書くことで複数の項目をまとめて配列変数に代入できる #!/bin/sh #array_bash_paren.sh array=(first "second" 'third with space' fourth\ with\ space) for n in 0 1 2 3 ; do echo "${…

配列変数のすべての要素を一度に表示する(bash)

配列変数に格納されているすべての要素を一度に得るには ${array_name[*]}または${array_name[@]}を使う #!/bin/sh #array_bash_allelem.sh array=(one two three four) echo "${array[@]}" echo "${array[*]}" IFS=':' echo "${array[*]}" IFS=$'\n' echo "…

配列の要素数を調べる(bash)

配列の要素数は$#var_name[*]}で参照する #!/bin/sh #array_bash_count.sh #添え字が連続している場合 sample1[0]=zero sample1[1]=one sample1[2]=two echo ${#sample1[*]} #添え字が不連続の場合 sample2[1]=first sample2[7]=second sample2[10]=third ec…

配列を扱う(bash)

bashには配列を扱う機能がある #!/bin/sh #array_bash.sh #配列に値をセットする sample[0]=zero sample[1]=one sample[2]=two for i in 0 1 2; do echo "sample[$i]=${sample[$i]}" done $ ./array_bash.sh sample[0]=zero sample[1]=one sample[2]=two

配列を扱う

shに配列を扱う機能はないがevalを使うことでほぼ同等の機能を実現できる #!/bin/sh #array.sh #配列に値をセットする #$1配列名 #$2添え字 #$3セットする値 array_put(){ eval "$1_$2=\"\$3\"" } #配列の値を取り出す #$1配列名 #$2添え字 array_get(){ eva…

日付や時刻の計算をする(GNU date)

GNU dateコマンドでは任意の日付に指定した日数を足したり 引き算をすることができる #!/bin/sh #date_add.sh date -d '2009/1/1' +'%A' date -d '2009/1/1 100 days' +'%F' date -d '10:00:00 1000 seconds ago' +'%T' $ ./date_add.sh Thursday 2009-04-11…

日付や時刻を指定した書式で得る

dateコマンドを使用する #!/bin/sh #date_format.sh date +'%Y/%m/%d %H:%M:%S' date +'%c' date +'Timezone: %z' $ ./date_format.sh 2009/10/15 10:49:49 Thu Oct 15 10:49:49 2009 Timezone: +0900

浮動小数点の演算を行う

小数を含む数値の計算を行うにはbcコマンドが使われる #!/bin/sh #float.sh A=5 B=7 echo 'scale=5; sqrt(1/3)' | bc

文字列が整数かを調べる

testコマンドで数値と文字列を比較するとエラーになる 文字列が整数でなければ終了コードが2以上になる #!/bin/sh #isnum.sh is_num(){ [ "$1" -eq 0 ] 2>/dev/null if [ $? -ge 2 ]; then echo "$1 is NOT a valid integer." else echo "$1 is a valid inte…

乱数を得る(bash)

shには乱数を生成する機能がない bashのシェル変数RANOMは0-32767までの乱数を返す 乱数の範囲を1-Nまでにしたい場合は $ ( ( (RANDOM % n) + 1 ))のようにする #!/bin/sh #random_bash.sh for n in 1 2 3 4 5 6 7 8 9 10; do random=$(( (RANDOM % 10) + 1 …

数値の比較を行う

testコマンドを使う #!/bin/sh #int_compare.sh a=3 b=5 c=3 if [ $a -lt $b ]; then echo "$a is less then $b" fi if [ $a -eq $c ]; then echo "$a is equal to $c" fi if [ $a -eq $b ]; then echo "$a is equal to $b" else echo "$a is NOT equal to $…

整数の演算を行う(bash)

$ ( (expression))で演算を行い、exprとほぼ同じだが以下の点が異なる 1.数式上では変数名の前に$をつける必要がない 2.数字や演算子の前後に空白をあける必要がない 3.*や()などをエスケープする必要がない 4.等号は=でなく== #!/bin/sh #arith_bash.sh x=5…

整数の演算を行う(expr)

#!/bin/sh #arith.sh x=5 y=9 z=13 #*や()などシェルによって解釈される文字はエスケープする a=`expr $x \* $y` b=`expr \( $y + $z \) / $x` echo "$a" echo "$b" $ ./arith.sh 45 4

文字列の長さを調べる

${#var_name}で変数var_nameに含まれる文字列の長さを調べることができる #!/bin/sh #str_length.sh text="The quick brown fox jumps over the lazy dog." echo "Length: ${#text}" $ ./str_length.sh Length: 44

文字列の大文字小文字を変換する(tr)

#!/bin/sh #str_toupper.sh text="The quick brown fox jumps over the lazy dog." result=`echo "$text" | tr 'a-z' 'A-Z'` echo "$result" $ ./str_toupper.sh THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.

文字列から正規表現に一致する部分を抜き出す(expr)

抜き出したい部分に相当する正規表現を、\(\)でグループ化する グループ内の正規表現にマッチした文字列が表示される #!/bin/sh #str_match_expr.sh text="<a target=WINDOW href=URL>ANCHOR</a>" expr "$text" : '.* \(target=[^ >]*\)' expr "$text" : '.* href=\([^ >]*\)' expr "$text"…

文字列の一部を置き換えする(sed)

#!/bin/sh #str_replace.sh text="The quick brown fox jumps over the lazy fox." echo $text | sed 's/fox/DOG/' echo $text | sed 's/fox/DOG/g' #oで始まる単語をafterに変更する echo $text | sed 's/\

文字列に別の文字列が含まれているか調べる(expr)

sedやgrepと異なり正規表現との比較は文字列の先頭からのみ行われる (正規表現の先頭に^が追加されていると考える) 文字列"hello world"に対して正規表現"hello"".*world"はマッチするが "world"はマッチしない #!/bin/sh #str_find_expr.sh text="The quick…

文字列に別の文字列が含まれているか調べる(grep)

#!/bin/sh #str_find_grep.sh text="The quick brown fox jumps over the lazy dog." if echo "$text" | grep -q 'fox'; then echo "found" else echo "not found" fi $ ./str_find_grep.sh found

文字列のm文字目からn文字目までを取り出す(set --)

setコマンドは文字列を単語に分割するにも使える 最初の引数 -- はそれ以降のオプションの解釈をしないようにするためのオプション 文字列の部分は""でくくらないようにする 分割した結果は $1-$9 $* $@ で参照できる setを使うと引数が上書きされるため、必…

文字列のm文字目からn文字目までを取り出す(cut)

#!/bin/sh #str_substr.sh str="abcdefghif" start=3 end=7 substr=`echo "$str" | cut -c${start}-${end}` echo "$substr" $ ./str_substr.sh cdefg

文字列の比較

文字列の比較にはtestコマンドを使う #!/bin/sh #str_compare.sh str1="foo" str2="" [ "$str1" = "foo" ]; echo $? [ "$str1" != "foo" ]; echo $? if [ "$str1" = "foo" ]; then echo '$str1 is foo' else echo '$str1 is not foo' fi [ -z "$str2" ] && e…

制御文字を含めた文字列を作成する

制御文字をエディタで直接入力できる場合は''で括る printfコマンドを使うと、\n(改行)\t(タブ)などを書くことができる bashでは$''で括ればprintfコマンドと同じ書き方ができる #!/bin/sh #str_spesial.sh #改行 str=' ' echo -n "a${str}a" #タブ str=`pri…

変数が空の場合エラーメッセージを表示して終了する

#!/bin/sh #var_error.sh yourname="anmino" echo "Good evening, ${yourname:?Please edit var_error.sh}" yourname="" echo "Good evening, ${yourname:?Please edit var_error.sh}" $ ./var_error.sh Good evening, anmino ./var_error.sh: line 8: yourn…

変数が定義されていない場合デフォルトの値を使う

#!/bin/sh #var_default.sh #変数に値がセットされている場合その値が使われる fruit="an orenge" echo "Do you have ${fruit:-some fruit}?" #変数が空の場合指定したデフォルト値が使われる fruit= echo "Do you have ${fruit:-some fruit}?" #nameが未定…

変数が定義されているか調べる

setコマンドで定義済み変数の一覧を表示し それをgrepで検索する #!/bin/sh #var_is_defined.sh is_defined(){ varname="$1" if set | grep -q "^${varname}="; then echo "${varname} is defined." else echo "${varname} is not defined." fi } foo="" is_…

ファイルの内容を変数に読み込む

ファイルの内容を変数に読み込むには catコマンドの出力をコマンド置き換えする #!/bin/sh #file_to_var.sh msg=`cat file.out` echo "$msg"