シェルスクリプトの書き方を調べています。ちょっとずつ追記していきます。
全体の見出し。
本文
シェルスクリプト(sh互換モード)
sample
#!/bin/sh #←ここがshebang echo hello world
実行する方法
実行モードに設定する
chmod +x sample
実行する
./sample # 同じディレクトリなら./が必要
ファイル名の規約
ないです。好きな名前が使えます。拡張子も省略可能です。
変数
変数名=値
単純な変数は「変数名=値」で定義できる。大文字小文字は区別されます。変数を参照して利用するときは「$」を頭につけます。
#!/bin/sh name="takuya" echo $name; echo "$name"; #ダブルクォーテーションを使うと展開されます。
実行例
./test.sh takuya takuya
配列もあります。配列は後で触れます。
文字列の扱い
#!/bin/sh name="takuya" echo $name; echo "$name"; #ダブルクォーテーションを使うと展開されます。
コメント
#を入れるとコメントになります
#!/bin/sh #ここはコメントです
シングルクォテーション
'$name' のように使います。変数は展開されません。
ダブルクォーテーション
"$name" のように使います。変数は展開されます。
バッククォーテーション
`whereis ls` のように使います。コマンドの実行結果に置き換わります。入れ子にはできません
実行例
takuya@letsnote:~$./string_sample takuya takuya
空文字/null
location= #null location="" #空文字 location=" " #空白文字 location="osaka" #値あり
nullは長さが0の文字列、つまりNull文字しかないと解釈されている。空文字も同じね
引数展開
コマンドの引数は変数として参照できます。
バッククォート
変数
シェル変数
現在のBashで保持されている変数一覧です。setコマンドで見ることができます。シェル変数は.bashrcや環境変数から引き継いだもの、いまのセッションで変数に入れたものが出てきます。
takuya@letsnote:~$ set PWD=/home/takuya ProgramData='C:\ProgramData' USERPROFILE='C:\Users\takuya' foo= location= #(略)
特殊変数
シェルスクリプトには特殊変数があります。"$"と記号,"$"と数字で構成されます。
プロセス番号
echo 'プロセスid' echo $$
引数の数
echo '引数の数' echo $#
引数関連
echo '自分のファイル名' echo $0 echo '1番目' echo $1 echo '2番目の引数..'#$9まで可能で、$10とする場合は${10}と書く echo $2 echo '引数全部、すべての引数' echo $* echo $@
$@ は 引数全部を " "区切りの文字列として扱っています。
$* は 引数全部を 文字列として扱っています。
環境変数
環境変数は引き継がれる。環境変数は、新しいプロセスを起動したときに引き継がれる変数です。
parent
name="parent" passwd="secret" export name ./child
child
echo $name echo $passwd
実行結果
takuya@letsnote:~$ ./parent parent #変数が引き継がれて いる。 #変数が引き継がれて ない。 takuya@letsnote:~$
変数置換
変数初期値設定に使えます。if連打を省略して一行にかけます。
細かくは省略。そういうことができると言うことを知っておけばいい。
プログラムわかる人なら参考演算子や or や defined or みたいなものだと思ってればいいと。
if [変数がNullのとき];then #初期値を入れる if
if文
if で初めて fi で終える
if [条件] ;then fi
if else 文
if [条件] ;then #do some else #do another fi
条件
条件は無数にある。シェルスクリプト使うのに便利なものを抜粋。
http://www.boaro.jp/linux/bash/bash_script.html
条件 説明 -n 文字列が存在すれば真 -z 文字列が存在しなければ真 -d ディレクトリが存在すれば真 -f ファイルが存在すれば真 -s ファイルが存在し、かつファイルサイズが0でなければ真 -e ディレクトリかファイルが存在すれば真 -r ファイルが読み込み可能であれば真 -w ファイルが書き込み可能であれば真 -x ファイルが実行可能であれば真
エスケープシークエンス
$'と'で囲めばよい。
#!/bin/sh echo $'foo\tBaarrr\nFooo\tBaaaa'
エスケープ・シーケンス 機能 \n 改行 \t タブ \b バック・スペース \a ビープ音 << 配列の扱い
シェルスクリプトでも配列を扱うことができる。引数展開の$@も配列になっています。
配列の定義
() を使って配列を作ります。
array=(1 2 3 4)配列の参照
配列は[]を用いてアクセスします。
echo ${a[0]} #勿論 0 から echo ${a[1]} echo ${a[2]} echo ${a[3]}配列を全部取り出す。
[@] を使うと配列に含まれる文字列が " "区切りで展開されます。
echo ${a[@]}配列にデータを追加する。
配列にデータを追記するのには、配列と配列を足しあわせました。
a=(${a[@]} 9 7 8) a=(${a[@]} "takuya") a=(${a[@]} "shingo") a=(${a[@]} "sango")配列はスペース区切りなのでできる技ですね
http://www.boaro.jp/linux/bash/bash_script.html配列の長さ
配列の長さを得るには # を使います。
echo ${#a[@]}