shell学習記録
シェルの基本文法
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変数の前から順番にコマンドの有無を調べる