シェルスクリプトを始める前に シェルスクリプトを編集するときに使われる Vimエディタの使い方について説明します。
Vimには3つのモードがあります。
コマンドモード→インサートモードやexモードへの移行、カーソル移動、文字削除など
インサートモード→文字を入力するモード、コマンドモードから「i」キーを押すと出現
exモード→exコマンドを利用するモード、コマンドモードから「:」キーを押すと出現
入力 | 操作 |
---|---|
:1 | ファイル先頭 |
:$ | ファイル末尾 |
0 | 行頭移動 |
$ | 行末移動 |
K | 上 |
L | 右 |
J | 下 |
H | 左 |
入力 | 操作 |
---|---|
/ | 後方にある文字列を検索 |
? | 前方にある文字列を検索 |
:%s/【検索文字列】/【置換文字列】/g | マッチした文字列を全置換 |
入力 | 操作 |
---|---|
:+w+q+! | 保存して終了 |
:+q+! | 保存せず終了 |
:+e ファイル名 | 指定したファイルを開く |
$ vi +10 /etc/hosts #/etc/hostsファイルの10行目から開く
複数のコマンドをまとめて実行したいときにシェルスクリプトを活用します。
テキストエディタとして標準で利用できるVimやnanoやgeditを使用して作成します。
エディタを起動してシェルスクリプトを書いてみましょう。
1行目にはシェバン(shebang)というシェルを実行するインタプリタを指定する行を追加します
以下がシェバンです。
#!/bin/sh
以下の内容を打ち込みtest.shとしてファイル保存しましょう
#!/bin/sh
for i in 1 2 3; do
echo $i
done
実行権限を付与して実行
sudo chmod +x ./test.sh
sh test.sh
echo "01234\
45678"
variable = "東京都"
echo $variable #東京都と出力される
echo "ようこそ$variable" #ようこそ東京都
echo 'ようこそ$variable' #ようこそ$variable
ls -ltr ~/
echo $? #成功:0 失敗:1
条件式はtestコマンドと呼ばれ[]で条件を囲い真だった場合は0、偽だった場合は1
を返します。
条件式でよく使う演算子
条件式 | 意味 |
---|---|
-f ファイル | 対象がファイルである場合は真 |
-e ファイル | 対象が存在する場合は真 |
-d ファイル | 対象がディレクトリである場合は真 |
-w ファイル | 対象が書き込み可能である場合は真 |
-x ファイル | 対象が実行可能である場合は真 |
数値A -eq 数値B | 数値Aと数値Bが等しい場合 |
数値A -ne 数値B | 数値Aと数値Bが等しくない場合 |
数値A -gt 数値B | 数値Aが数値Bより大きい場合 |
数値A -lt 数値B | 数値Aが数値Bより小さい場合 |
数値A -ge 数値B | 数値Aが数値B以上の場合 |
数値A -le 数値B | 数値Aが数値B以下の場合 |
! 条件式 | 条件が偽だった場合 |
ファイルが存在しているかどうかを確認
#!/bin/sh
if [ -e /etc/resolv.conf]; then
echo "exists"
fi
png_files = $(ls *.png)
echo $png_files
以下のようなシェルスクリプトを用意
#!/bin/sh
echo $0
echo $1
echo $2
$ ./test.sh a b c
a b c と出力される
for i in 1 10 100; do
echo $(expr 999 + $i)
上記のコマンドを実行すると、1000,1009,1099と出力される。
#!/bin/sh
check_param(){
if [ ! -z $1 ]
then
echo "シェルの引数の値は存在します"
else
echo "シェルの引数の値は存在しません"
fi
}
check_param $1
アプリケーション起動や停止の管理をするsystemdというものに登録するとサービスとして活用できます。 jounaldというロギングシステムがあり、問題があった場合にはログ出力してくれます。
サービスの稼働はsysytemctl status 【アプリケーション名】で確認することができます
cut -d ',' -f 3,5,7 kawasaki_koukai.csv | sort -n -r -t ',' -k 3 | head -n 10
cat kawasaki_koukai.csv | awk 'FS="," { if($34 < 100) {print $4 $5 $34}}'