Webとデザインのあれこれ

プログラミングとUIデザインの学習記録です。

LinuxOSについて#3

シェルプログラミングについて

シェル・スクリプトとは

シェル用に作成されたプログラムで、テキスト形式のファイルです。bashなどのシェルがテキスト形式のファイルを解釈して実行します。同じ手順を自動的に実行したい場合によく利用されます。

viを起動し、sample.shとして下記のスクリプトを記述。

)#! /usr/bin/sh    #shebangですね。
echo '現在の日付と時刻' 
date

起動する前に、テキストファイルへの権限を変更する必要があります。

chmod u+x ファイル名 #uはそのファイルの所有者、xは実行権限です。
オプションの意味
オプション 意味
u そのファイルの所有者
g そのファイルの所有グループ
o その他の人
w 書き込み権限
r 読み込み権限
x 実行権限
+ 権限を与える
- 権限を拒否する

実行方法は下記の3通り。

1)
$ sh sample #shコマンドを実行2)
$ ./sample #ファイル名を直接入力して実行(相対パス名で実行)3)
$ . ./sample #.コマンド(相対パス名で実行)。shコマンドと異なり、.コマンド自体が処理します

カレントディレクトリは、コマンド検索パスに設定されてないのでファイル名だけを入力しても実行されないのです。

構造化プログラミング

プログラミング言語を2種類に分類。

  1. 手続き指向型(C言語やシェルプログラミング)
  2. オブジェクト指向型(JavaC++)

「手続き」は、処理をする内容の形態。構造化プログラミングの基本的な部品(基本構造)は,「連接(連続ですね)」,「選択」,「反復」の3つ。構文を以下にまとめました。

  • if文
  • case文
  • while文
  • until文
  • for文
  • break文
  • exit文
)
#! /usr/bin/sh  #shebang
fname = file  #変数代入
if test -f $fname   #条件コマンドでtestコマンドを実行します。
then
    echo 'ファイル名' $fname 'は存在します'
else
    echo 'ファイル名' $fname 'は存在しません'
fi

上記の場合、-fオプションを渡しているので、ファイルが存在し、かつ通常ファイルの場合は真を返します。testコマンドで使用する条件は以下の通りです。

testコマンドで使用できる基本的な条件
条件 内容
-a ファイル名 ファイル名が存在すれば真を返す
-e ファイル名 ファイル名が存在すれば真を返す
-f ファイル名 ファイル名が存在し、かつ通常ファイルならば真を返す
-d ファイル名 ファイル名が存在し、かつディレクトリならば真を返す
-r ファイル名 ファイル名が存在し、かつ読み出し可能ならば真を返す
-w ファイル名 ファイル名が存在し、かつ書き出し可能ならば真を返す
-x ファイル名 ファイル名が存在し、かつ実行可能ならば真を返す
-n 文字列 文字列の長さが1以上ならば真を返す
-z 文字列 文字の長さが0(空文字)ならば真を返す
数値1 ne 数値2 数値1と数値2が等しくないならば真を返す
数値1 gt 数値2 数値1が数値2より大きければ真を返す
数値1 ge 数値2 数値1が数値2以上ならば真を返す
数値1 lt 数値2 数値1が数値2より小さいならば真を返す
数値1 le 数値2 数値1が数値2以下ならば真を返す

スクリプトの引数

コマンド同様、スクリプトにも引数を渡すことは可能です。一度に参照できる引数は9つまでです。

$ ./example_arg abc def
$#  2 #スクリプトに指定された引数の数は,シェル変数$#で参照
$0 ./example_arg  #$0はスクリプト自身
$1 abc   #$1は第1引数
$2 def #$2は第2引数
$* abc def #$*は指定した全ての引数をまとめたものを表示する

スクリプトshow_argに3つの引数を渡すプログラム

#! /usr/bin/sh
echo '引数の数:' $#
echo 'スクリプト名:' $0
echo
echo '***  方法1 ***'
for arg in $@  #$*と同じだが、引数がそれぞれ別の文字列として扱われる
do 
  echo '引数:' $arg
done
echo
echo '*** 方法2 ***'
for arg in $*
do 
   echo '引数:' $1
   shift       #shiftは1回実行すると引数の番号を-1移動する
done

スクリプト内で実行したコマンドの実行結果を引数とすることも可能なのです。 setコマンドとバッククウォート(``)を用います。

#! /usr/bin/sh
echo "'who'コマンドの実行結果:"  #特殊文字を使用しているので、ダブルクオテーション使用
who 
echo
set `who`  #バッククウォートとsetコマンドによって、whoコマンドの実行結果を引数に指定

for arg in $@
do
  echo '引数: ' $arg
done

最後に

シェルスクリプトについては以上です。