ホームページへ戻る
 

上へ戻る
 

    Linux入門 その3  シェル言語(bash)  by H.Y 2月 24 18:34:19 JST 2002
12:48:22 JST 2002

目次:
1。シェル言語の基本事項
1)ファイルの最初
2)コメント
3)行の追加
4)ファイル名の補完
5)制御文字のエスケープ
6) ` ` によるコマンド置換
7)コマンドセパレータ
8)コマンドのグルーピング
9)引数
10)制御文
11) 特殊変数
2。test または [ ] コマンド
1)文字列比較
2)算術比較
3)ファイルの条件
4)その他
3。シェル変数
1){$... },$... の使い方
2)値をヌルに設定。定義のみ。
3){ = },{ := } 未設定の変数の設定 設定済の場合は変化しない。
4){ - }, { :- }
5){ ? },{ :? } 未設定かどうかの確認
6){ :+ }.{ + } 値が設定されているときは、セットした値を返す。
7){# }
8){ % }
9){ %% }
10){ # },{ ## }
11)例題
12)位置パラメータ
13)コマンドライン上での変数の設定
4。シェル関数
5。シェル組み込みコマンド
1)ヌルコマンド( : )
2)ドットコマンド( . )
3)break ループを抜ける
4)cd
5)echo
6)eval
7)exec カレントシェルのプロセスと置き換えて引数のコマンドを実行する。
8)exit シェルの終了
9)export 環境変数の設定
10)pwd カレントデイレクトリの完全パスを表示
11)read
12)readonly
13)return シェルから抜けるコマンド
14)set
15)trap
16)type
17)umask ファイルを作成するときのモードを指定する。
18)unset シェル変数や環境変数を削除する。
19)wait
20)expr 引数を式として評価する。
21)printf
22)continue
6。ヒヤドキュメント
7。リダイレクト
-----------------------------------------------------------------------

1。シェル言語の基本事項
1)ファイルの最初
#!/bin/bash :bash の宣言
2)コメント
#この記号のあとはコメント行になる。
3)行の追加
1つのコマンドは1行に書くのが原則。
長いコマンドは改行を無視するために [\] を最後に書く。
例 echo "こんにちわ。 \
bashにようこそ!"
シェルコマンドは改行がコマンドの最後をしめす。
それをエスケープするのが [\] である。
4)ファイル名の補完
正規表現の制御文字と混同しないこと。
あくまでシェルの制御文字である。
* : .で始まらない文字列全部
? : 始まりが.では無い任意の1文字
[...] : [ ]内のどれか1文字 .で始まるものは除く
[!...] : [ ]に含まれない文字
[補完例]
test[0-9][a-zA-Z] :test0a,test3b,test9A,,,,
test?? :test12,teatBc,test_a,,,,
??* :2文字以上のファイル
[!0-9]* :数字で始まらないファイル
[A-Z]* :大文字の英字で始まるファイル
[!A-z]* :英字で始まらないファイル
[-A-z]* :- か 英字で始まるファイル
[A-z]は無効になる(意味がない)
*test* :ファイル名に test を含むファイル
.* :.で始まるファイル
[.a]* :aで始まるファイル . は無視する
dir/* :dir 以下のファイル全て
dir/.* :dir 以下の.で始まるファイル
5)制御文字のエスケープ
(1)制御文字
; & () | ^ < > ? * [ ] $ ` ' " { } 改行 タブ スペース
(2)1文字のエスケープ
[\] を使う。
abcd\{efg これは abcd{efg
(3)' ' を用いる。
シングルクオート自信はエスケープできない。
(4)" "を用いる
$ ` \ はエスケープできない。
(5)例
echo "\$Hello"
$Hello
echo '$Hello'
$Hello
echo '\$Hello'
\$Hello
export Hello="Helloの環境変数"
echo "$Hello"
Helloの環境変数
echo "'Hello'"
'Hello'
echo '"Hello"'
"Hello"
echo "\\"
\
echo '\\'

\\
6) ` ` によるコマンド置換
echo "Today is `date` "
Today is Fri Apr 6 17:01:17 JST 2001
7)コマンドセパレータ
(1)改行
(2) ;
cat test.txt ; cat test2.txt
(3) | 次のコマンドへの入力
(4) & バックグラウンドで実行
(5) || OR演算子
左のコマンドの実行に失敗したときに右のコマンドを実行する。
[例]
rm test3.txt || echo "test3.txt はありません。"
(6) && AND演算子
左のコマンドの実行に成功したときに右のコマンドも実行する。
[例]
cat test3.txt && rm test3.txt
8)コマンドのグルーピング
1)丸かっこ( )。 ( )の中はサブシェルになる。
( cd /root/ ; mkdir test-dir ; ls -d test-dir )
( の後、) の前はスペースが必要。
2)中かっこ { } { }の中はカレントシェルで実行される。
{ cd /root ; mkdir test-dir ; ls -d test-dir; }
最後の ; は必要。
このスクリプトを実行する とカレントデイレクトリは /root に変わる。
9)引数
$0 : スクリプト名
$n : n 番目の引数の値
$# : 引数の数
$* : $1 から $n まで全部
$@ : $* と同じ。引数を" "で囲んで展開する。

10)制御文
(1)if 文 --- sc1 ------------
if test -f file1
then
echo "The file1 exists"
else
echo "The file1 does not exist"
fi
# if test -f file1 は if [-f file1] でも良い。
別の表現
if test -f file1; then echo "The file1 exists"; else \
echo "The file1 does not exist"; fi

(2)for 文 ---- sc2 -------------
for i in a b c d
do
echo "for loop" $i
done
# i の値は順に a,b,c,d と変化する。
(3)while 文---- sc3 -------------
a=1
while test $a -lt 3
do
echo "while loop" $a
a=`expr $a + 1`
done
(4)case 文 ---- sc4 -----------------
STRING="ABC"
case "$STRING" in
ABC) echo "STRING is ABC" ;;
abc) echo "STRING is abc" ;;
esac

11) 特殊変数
これらの変数は書き込み禁止。システムが設定する。
$? : 前のコマンドの終了ステータス
$$ : カレントプロセスのプロセス番号
$! : 直前のバックグランドジョブのプロセス番号
$- : カレントシェルの設定フラグ

echo $?
echo $!
echo $$
echo $- で確認する
2。test または [ ] コマンド
正常終了で 0 、そうで無いときは 0 以外の値になる。
test -f file1 : file1 がある場合は 0 になる。
[ -f file1 ] : [ の後と ]の前にはスペースが必要。

1)文字列比較
test string :stringがnullでなければ真
test string1 = string2 :string1とstring2が等しいと真
test string1 != string2 :string1とstrin2が等しくないと真
------- sc5 --------------
#!/bin/bash
string=ABCDEFG
if test string
then
echo $string
else
echo "string=null"
fi
-------------------------
2)算術比較
test A -eq B :A = B で真
test A -ne B :A != B で真
test A -gt B :A > B で真
test A -ge B :A >= B で真
test A -lt B :A < B で真
test A -le B :A <= B で真
test !A :A が偽で真。 ! は否定の意味
3)ファイルの条件
[ -d file ] :(directory) file がデイレクトリなら真
[ -e file ] :(exist) file が存在すれば真
[ -f file ] :(file) file が通常のファイルなら真
[ -g file ] :(group) fileにset-group-bit がセットされていると真
[ -u file ] :(user) fileにset-user-bitがセットされていると真
[ -r file ] :(read) fileが読みとり可能なら真
[ -w file ] :(write) fileが書き込み可能なら真
[ -x file ] :(execute) fileが実行可能なら真
4)その他
! : NOT の意味
-a : AND の意味
-o : OR の意味
例1: [ -r file -a -w file -a ! -x file ]
file は 読み込み/書き込み可能で実行不可能の場合に真
例2: [ ! \( -r file -a -w file \) ]
file は読み書きともに不可の時に真

3。シェル変数
1){$... },$... の使い方
TEST="シェル変数TEST" :あたいの設定
echo ${TEST}
echo $TEST
echo ${TEST}' : テスト表示 echo ${TEST}'
2)値をヌルに設定。定義のみ。
TEST=
TEST=""
3){ = },{ := } 未設定の変数の設定 設定済の場合は変化しない。
位置パラメータがつかえる。

echo ${TEST="テスト"}
echo ${TEST:="テスト"}
TESTが 定義済でも "" の場合は設定される。
未設定の場合はテストがかえされる。
設定済みの場合は,値がnullでも変化せずに、設定済みの値を返す。
即ち : は null を設定値とみなさない。
実行例:
(1) echo ${ABC:=xyz}
xyz 一度も使っていない変数の場合
(2) ABC=abc
echo ${ABC:=xyz}
abc
(3) ABC=""
echo ${ABC:=xyz}
abc :がある場合はnullの設定値は置き換わる
(4) ABC="" null に設定
echo ${ABC=xyz}
null を表示
4){ - }, { :- }
変数が未設定の場合は代入せずに、セットした値をそのまま返す。
セットされている場合はその値を返す。
セットされている値は変化しない。
実行例:
(1) unset TEST
echo ${TEST:-"テストです。"}
テストです。
(2) echo $TEST
なにも表示されない。
(3) TEST="データセット"
echo ${TEST:-"テストです。"}
データセット
(4) echo "The variable \$1 is ${1:-= not used}"
The variable $1 is = not used $1 は未設定
The variable $1 is abcdefg $1=abcdefgに設定
5){ ? },{ :? } 未設定かどうかの確認
実行例:
(1) unset TEST
echo ${TEST:?"TESTは設定されていません。"}
設定されていない場合:
[TESTは設定されていません]を表示してスクリプトはそこで終了する。
設定されている場合:
その値をかえす。
6){ :+ }.{ + } 値が設定されているときは、セットした値を返す。
変数の値はとりかえない。
TEST="テスト"
echo $TEST
テスト
echo ${TEST:+"TESTの値は設定されています。"}
ABCの値は設定されています。
echo $TEST
テスト
unset TEST
echo ${TEST:+"TESTの値は設定されています。"}
nullを表示
7){# }
${#param} param の長さを返す
8){ % }
${param%word}
paramの末尾を起点として文字列wordに一致する最短部分を削除
9){ %% }
${param%%word}
aramの末尾を起点として文字列wordに一致する最長部分を削除
10){ # },{ ## }
${param#word} param の先頭を起点。
11)例題
sc16
#!/bin/bash
unset foo
echo ${foo:-bar}

foo=fud
echo ${foo:-bar}

foo=/usr/bin/X11/startx
echo ${foo#*/}
echo ${foo##*/}

bar=/usr/local/etc/local/networks
echo ${bar%local*}
echo ${bar%%local*}

exit 0

実行結果
bar :設定されていないので bar 表示
fud :設定されている値を表示
usr/bin/X11/startx :最初の / までを削除
startx :最初の / から最後の / まで削除
/usr/local/etc/ :最後のlocalから削除
/usr/ :最初のlocalから削除

12)位置パラメータ
----- sc18 ------
#!/bin/bash
echo $#
echo $0 $1 $2 $3
shift 2
echo $0 $1 $2 $3
echo $#

./sc18 P1 P2 P3 P4 :実行
4
./sc18 P1 P2 P3
./sc18 P3 P4 :shif 2 でP1、P2はパスされる
2 :パラメータの数 P3,P4のみ

13)コマンドライン上での変数の設定
CFLAG=-g make :このコマンド make でのみ有効
( CFLAG=-g ; export CFLAG ; make ) :これも上と同じ
:()内はサブシェルなので。
4。シェル関数
(1)コマンドラインで定義
lscal(){ ls -al --color;} :{ の後にスペースが要る。
lscal
(2)スクリプトファイルで定義
sc12 : スクリプトファイル名
#!/bin/bash
lsl(){
ls -l
}
(3) 実行方法
./sc12 :シェル変数 lsl に関数が登録される。
lsl : 関数 lsl の実行
5。シェル組み込みコマンド
1)ヌルコマンド( : )
while : 無限ループを作る
do
.......
break
done
2)ドットコマンド( . )
. file :ファイルを読み込み実行する。
source file
3)break ループを抜ける
break 3 :ループを3回抜ける
4)cd
5)echo
echo test
echo -n test :改行しない
echo -e "string\tto\toutput" :\t \r \n 等を有効にする。
string to output
6)eval
複数の変換処理を一度に実行するコマンド
例1:
VAL1=value
VAL2=VAL1
echo $"$VAL2"
VAL1
例2:
eval echo $"$VAL2" :$VAL2を展開してechoを実行する
value

7)exec カレントシェルのプロセスと置き換えて引数のコマンドを実行する。
実行後はもとのシェルにはもどらない。
#!/bin/bash
exec ls -l
echo "テスト exec "
このスクリプトを実行しも echoは実行されない。
シェルスクリプト ls -l を実行して終了する。
8)exit シェルの終了
exit n :n 終了コード この nの値が $? に代入される。
9)export 環境変数の設定
export PATH=$PATH:/usr/local/bin
10)pwd カレントデイレクトリの完全パスを表示
11)read
read key_data :キイボードの入力がkey-dataにセットされる。
read key1 key2 key3
aaa bbb ccc ddd eee [リターン] :キイ入力
:FIS はスペース、タブ、リターン
echo $key1
aaa
echo $key2
bbb
echo $key3
ccc ddd eee :最後の変数に残りが全て入る。
12)readonly
readonly TEST :TESTはリードオンリーになる。
13)return シェルから抜けるコマンド
return n
14)set
(1) シェルオプションの ON/OFF
set -v :v オプション ON
set +i :i オプションの OFF
(2)シェル変数の表示
set :シェル変数を全て表示する
(3)シェル変数への代入
----sc15----------
#!/bin/bash
echo $0 $1 $2 $3 $4
set aaa bbb ccc echo
echo "\$1=$1"
echo "\$2=$2"
echo "\$3=$3"
echo "\$4=$4"

これを実行すると
./sc15 111 222 333 444 :実行
$0=./sc15
$1=aaa
$2=bbb
$3=ccc
$4= :444 はクリヤされる
(15)trap
trap action signal
このシェルスクリプトがsignalを受け取ったときの処理を指定する。
/usr/include/sys/signal.h で番号を調べる

trap -l :シグナルの種類を表示する。
trap :現在のtrap指定と動作の一覧表示
trap 'rm -f /tmp/my_tmp_file_$$' INT
trap - INT :- はデフォルトの状態に戻す。
trap で使うsignal
HUP(1) :ハングアップ
INT(2) :割り込み。通常[Ctrl]+Cを押した時。
QUIT(3):Qit 通常[Ctrl]+\を押した時
その他
-----sc19-------------
#!/bin/bash

while :
do
trap 'echo "Signal is recieved" ; \
echo "from the system."; exit' 1 2 3 15
done
------------------------
実行例:
./sc19
C-c :終了させる signal SIGINTを発行する
Signal is recieved
from the system.
(16)type
type command-name : コマンドの情報を表示
type ls echo
ls ls is hashed (/bin/ls)
echo is a shell builtin
(17)umask ファイルを作成するときのモードを指定する。
マスクが1で禁止をいみする。
umask :現在の値
022 :書き込み禁止ビットON
touch test
ls -l test
-rw-r--r-- 1 root root 0 Apr 8 12:50 test
rm test
umask 077 :umask の設定(オーナー以外は all 禁止)
touch test
ls -l test
-rw------- 1 root root 0 Apr 8 12:50 test
(18)unset シェル変数や環境変数を削除する。
unset TEST
(19)wait
wait jobnumber
jobnumber のプログラムが終了するまで待つ。

command & :バックグラウンドで実行
......
wait $! :バックグラウンドのcommandが終了するまで待つ
:引数がないので子プロセスが全て終了するまで待つ
(20)expr 引数を式として評価する。
x = 'expr $x + 1' :x には 1が加えれれる。
x = 'expr $x * 3' :x は3倍になる。
$((...))構文のほうが効率的。
例:
ABC=$((12 + 123))
echo $ABC
135
(21)printf
printf "format" parameter1 parameter2 ...
(A)エスケープ
\\ : \
\a :アラーム
\b :バックスペース
\f :フォームフィード
\n :改行
\r :キャリッジリターン
\t :タブ
\v :垂直タブ
(B)変換指定子
d :10進数を出力
c :文字を出力
s :文字列を出力
% :文字そのものを出力
(C)例
printf "%s\n" hello
printf "%s %d\t%s\n" "こんにちは" 15 people
-----sc20-------------------------------
#!/bin/bash
while :
do
trap 'printf "%s\n" "Signal is recieved" ; \
printf "%s\n" "from the system."; \
exit' 1 2 3 15
done

(22)continue
continue 次の繰り返しのステップに戻る
continue 2 2番目のループの繰り返しに戻る
6。ヒヤドキュメント
スクリプトの中で大量のテキストを出力するのに用いる。

#!/bin/bash
cat << TAG
こんにちは!
これが here document
です。
TAG
7。リダイレクト
ファイルスクリプト
1 : 標準出力
2 : 標準のエラー出力
(1) echo abc > test : test へ出力
(2) echo abc >> test : test へ追加(append)
(3) cat abc test > test3
(4) cat abc test 2> err : エラー情報のみ err へ
(5) cat abc test 1> test3 :(3)と同じ
(6) cat ccc test >& test3 :全て test3 へ
cat t3
cat: ccc: No such file or directory
This is test.