シェルの基本文法

1.5.5 クウォーテーションの使い分け

ダブルクウォート:変数の置き換え、コマンド置換を行う場合
シングルクウォート:変数の置き換えを行わない場合
バッククウォート:中に書かれたコマンドを実行


#ホームディレクトリが表示
echo "$HOME"

#'$HOME'が表示
echo '$HOME

#lsと同じ文字が表示
echo `ls`

1.8.4 OR演算子

削除コマンドで失敗時にエラーを出力させる

rm file || echo "error message"

1.9 コマンドのグルーピング

親から子スクリプトを呼ぶ場合、環境を変えても親の環境を変化させない。
ex.ディレクトリの移動

丸括弧()によるコマンドのグルーピング:サブシェルで動作する 中括弧{}によるコマンドのグルーピング:カレントシェルで動作する

1.10 制御文

testコマンド:ファイルの存在有無のチェック、2引数を比較する等を行う

# equal if [ -f file ]
if test -f file
then
    echo no file
fi

for文

for i in a b c
do
    echo ${i}
done

1.11 改行、セミコロン

if test 2 -ne 1 ; then echo hoge; else echo huga; fi

”;”を使うことで、複数行コマンドを単一行で記述できる。

2.1 シェル変数の定義

シェル変数として代入される値はすべて文字列扱い。

#下記は’100’という文字列をHENSUUに代入
HENSUU=100

NG_HENSUU = -1

2.2 シェル変数の取得

$を使うことで定義されている変数を取得することができる。
中括弧を使うことで、シェル変数の部分を明示できる

DIR=/tmp
cd $DIR
#equal cd ${DIR}

シェル変数の区切りの判定  * 中括弧で囲まれている * 使用可能文字(A-z,0-9,_)以外の文字が使われている

DIR=/tmp
cd $DIR #OK
cd $DIR/tmp2 #OK
cd ${DIR}tmp2 #OK
cd $DIRtmp2 #NU return null

2.4 =によるシェル変数定義

echo ${DIR:=xyz} #出力1
echo ${DIR=xyz} #出力2

上記シェルは、

条件 出力1(:=) 出力2(=)
DIR=abc abc abc
DIR=”” xyz ””
未宣言 xyz xyz

:= の場合、変数がnullのとき値を上書き = の場合、未宣言時のみ上書きが可能

2.4.2-2.4.4 -?+による変数宣言

値が設定されているか、設定されている値がnullかどうか判定したいときに使う

echo ${ABC:-value}

変数が未使用、未設定の場合 値を代入しないまま値を返す。

echo ${ABC:?value}

変数が未使用、未設定かどうか確認するときに使う

echo ${ABC:+value}

変数に値が設定されているとき、値を取り替えて表示

2.5 位置パラメタ

  • シェルの引数にアスタリスクを渡す→同じディレクトリのファイル名のリストが渡される
  • 位置パラメタは$0から$9の計10個
  • 9以上の引数がある場合は、shiftコマンドを使って処理する必要がある。
  • $* 引数全体をダブルクウォートで括って展開
  • $@ 引数一つづつをダブルクウォートで括って展開

2.6 特殊変数

$? コマンド実行時の終了ステータス

変数の値は継承される

$! バックグラウンドジョブのプロセスID

wait $! でバックグラウンドプロセスを停止する

$- シェル起動時のフラグ、setコマンドで設定したフラグの一覧表示

シェル関数,組み込みコマンド

3.1 シェル関数


name()
{
    command
    ....
}

下記のようにドットコマンドを用いて実行すると、 カレントシェル上で実行される。 (変数宣言が継承される、関数が使えるようになる)

$ . script_file

nullコマンド

: 何もせず、実行ステータスとして0を返却

:コマンドを使うことで変数のデフォルト値を設定できる

: ${VAR:=abc}

空ファイルを作成する

: > file

evalコマンド

変数を二重展開する ```sh #記述法は以下2通り eval echo $$var1 eval echo $”$var1”


#### readコマンド

キーボードからの入力を変数にセットする

#### readonlyコマンド

変数を読み取り専用に変更する

#### setコマンド

* シェルのオプションのオンオフ
* 位置パラメタに値をセットする

#### shiftコマンド

位置パラメタをずらす

```sh
#1つ分ずらす
shift 1
#引数をクリアする
#($#が引数の数を表すため)
shift $#

type コマンド

コマンドの場所などの情報を出力

umask コマンド

作成するファイルのモードを指定

unset

作成した変数や関数を消去

ファイル操作

4.1 ファイルディスクリプタ

ファイルディスクリプタ 0番 キーボード入力 1番 端末画面への標準出力 2番 端末画面への標準エラー

4.2 リダイレクション

通常のリダイレクションは1番のファイルディスクリプタの向きが変わる

# 標準エラーをファイル出力させる場合
cat not_exist.txt 2> error.log
# 標準出力をファイル出力させる場合
cat exist.txt 1> output.txt
# 標準出力と標準エラーを同時に出力させる場合(2番と1番を一緒にまとめる)
cat not_exist_or_exist.txt > output.txt 2>&1
# output.txtファイルに上書きする
cat file > output.txt

# output.txtファイルの後ろに文字を追加する
cat file >> output.txt

4.10 ヒアドキュメント

標準入力用のファイルを別に用意する必要をなくす

# command << END
$ cat << END
> hgoe
> END
hoge
$

5 環境変数

set #変数の一覧表示 env #環境変数の一覧表示

変数:定義プロセスのみ使用可能 環境変数:子プロセスにも変数の値が引き継がれる

export ${変数名} # 変数を環境変数として定義する source ${シェルファイル名} # 子シェルの変数が親シェルに反映される ↑ドットコマンドでも代用可?

PATH変数

コマンドを打った時にPATH変数の前から順番にコマンドの有無を調べる