それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Bashシェルスクリプト入門

シェルスクリプトの書き方を調べています。ちょっとずつ追記していきます。

全体の見出し。

  • シェルスクリプト書き方
  • 変数
    • 変数 foo=bar
    • 文字列
    • コメント
    • クォテーション
  • 引数展開
    • シェル変数
    • 環境変数
    • 特殊変数
    • 変数置換
    • if文
      • 条件
    • エスケープシークエンス
  • 配列
    • 配列の定義
    • 配列の参照
    • 配列に追加
    • 配列の長さ

本文

シェルスクリプト書き方


Windowsは拡張子でプログラムを指定するが、Linuxでは、Shebang を使って指定する。
shebangはシェバ(ん) と読む。

シェルスクリプト(sh互換モード)

sample
#!/bin/sh       #←ここがshebang 
echo hello world

実行する方法

実行モードに設定する

chmod +x sample

実行する

./sample  # 同じディレクトリなら./が必要

ファイル名の規約

ないです。好きな名前が使えます。拡張子も省略可能です。

参考 shebang

shebang = sharp + bang だと言われている。
読み方はシバンです。

その他のShebang

その他インタプリタ(ruby)
#!/usr/bin/ruby
環境変数から調べる
#!/usr/bin/env ruby

変数

変数名=値

単純な変数は「変数名=値」で定義できる。大文字小文字は区別されます。変数を参照して利用するときは「$」を頭につけます。

#!/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

条件

条件は無数にある。シェルスクリプト使うのに便利なものを抜粋。

条件 説明
-n 文字列が存在すれば真
-z 文字列が存在しなければ真
-d ディレクトリが存在すれば真
-f ファイルが存在すれば真
-s ファイルが存在し、かつファイルサイズが0でなければ真
-e ディレクトリかファイルが存在すれば真
-r ファイルが読み込み可能であれば真
-w ファイルが書き込み可能であれば真
-x ファイルが実行可能であれば真
http://www.boaro.jp/linux/bash/bash_script.html

エスケープシークエンス

$'と'で囲めばよい。

#!/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")

配列はスペース区切りなのでできる技ですね

配列の長さ

配列の長さを得るには # を使います。

 echo ${#a[@]}
http://www.boaro.jp/linux/bash/bash_script.html