8t's BBR

よくつまったあれこれをメモ

シェルスクリプトの基本

基本的には拾ってきたものばかりだけど、自分がわかりやすいようにまとめる。
何かあれば順次追加予定。
 

基本の基本

  • 拡張子は.sh
  • 1行目は#!/bin/shとかく(おまじないみたいなもの)
  • 実行するには./(ファイル名)もしくはsh (ファイル名)
     

基本コマンド

コメント

#以降はコメントとなる

入出力

readが入力、echoが出力

変数

変数名は半角英数字とアンダーバーが使える。
値代入には、=前後空白なしで入れる。
型を記述せずにいきなりvar="変数"とか定義してよい。
が、定数宣言する時は、readonlyを変数名の前に書く。
変数へのアクセスは、変数名の前に$を入れるか、$を入れた後に{}で囲む。
 
例えば、以下のようなシェルスクリプト(hello.sh)なら

#!/bin/sh
# この行はコメントです

echo "What's your name? "
read NAME
mes="Good luck!"
echo "Hello, $NAME!"
echo "$mes"

出力結果は以下のようになる(入力をKenとした場合)

$ ./hello.sh
What's your name? 
Ken
Hello, Ken!
Good luck!

 

特殊変数・特殊文字

$0  スクリプト
$1~9 引数。n番目の引数が$nとなる。
$#  引数の数
$?  直前実行したコマンドの終了値
特殊文字\と併用。例:\*
 

演算子

expr 数字 演算子 数字(変数に代入するなら両端を`で囲む必要あり)で計算できる
+-*/%===!=!はよくある意味でそのまま
気をつけるべきは以下
-gt  >を表す
-le  <を表す
-o  or
-a  and
-z  文字列が空ならTRUEを返す
-n  文字列に何か指定していればTRUEを返す
 

配列

ARRAY=(要素1 要素2 ‥)のように定義する。
n番目の要素を参照する時はARRAY[n]とすれば良い。
 

条件分岐・ループ

if文
if [ 条件式1 ]; then
 実行文
elif [ 条件式2 ]; then
 実行文
else
  実行文
fi
for文
for 変数 in 範囲
do
 実行文
done
while文
while [ 条件式 ]
do
 実行文
done
Switch文
case 変数名 in
 条件・値1) 実行文 ;;
 条件・値2) 実行文 ;;
   :
esac

ループの時のお決まりbreakcontinueも使える
 

関数

関数を定義するときは以下のようにする。

関数名 () {
 実行文
}

関数を実行するときは関数名 引数で。関数名のあとに()はいらない
たとえば、以下の関数を実行するときはhello Alice Bobでいい

hello () {
  echo "$1: Hello, $2!"
}

このとき、Alice: Hello, Bob!と表示されるはず。