シェルスクリプトとは、シェル言語で記述された自動化スクリプトです。シェルは弱型言語であり、変数のデータタイプを明示的に宣言する必要はありません。
1.1 シェル変数
username='john'
echo ${username} #結果: john
または
echo $username # 結果: john
Linuxでは、インタフェース上で直接変数usernameを定義します。注意: username='john'の間にはスペースを入れてはなりません。Bashでは、スペースは重要な意味を持ちます。
1.2 シェルスコープ
スコープの理解(入れ子のボックス)
1.3 単引用とダブル引用の違い
- 単引用:特殊文字を認識しません。
- ダブル引用:特殊文字を認識します。
1.4 変数の分類
シェルの変数は、ローカル変数、グローバル変数、環境変数に分類されます。
- ローカル変数:現在のシェル内でしか使用できません。
- グローバル変数:現在のシェルとそのサブシェルで使用できます。
- 環境変数:グローバル変数とほぼ同じですが、大文字を使用します(例:PATHなど)。
exportを使用してローカル変数をグローバル変数または環境変数に昇格させることができます。
1.5 変数の表示
- env: 現在のシェルまたはユーザーが使用できるすべてのグローバル変数と環境変数を表示します。
- set: envと同様に表示しますが、ローカル変数も含まれます。
- printenv varname: 特定のグローバル変数varnameの値を表示します。
1.6 サブプロセスと親プロセス
bash/shを使用してスクリプトを実行すると、新しいサブシェルが開始され、現在のシェルの変数は保持されません。sourceを使用してスクリプトを実行すると、現在のシェル内でスクリプトが読み込まれ、変数は保持されます。
1.7 特殊変数
#!/bin/bash
echo "特殊変数 \$0 \$1 \$2"
echo "結果:" \$0 \$1 \$2
echo "#########"
echo "特殊変数 \$# はパラメータの総数"
echo "結果:" \$#
echo "############"
echo "特殊変数 \$*"
echo "################"
echo "特殊変数 \$@"
- \$#: パラメータの総数
- \$*: すべてのパラメータを1つの単語として扱います。
- \$@: 各パラメータを個別の単語として扱います。
2.1 bashの基本的な組み込みコマンド
- echo: 文字列を表示します。
- eval: 複数のコマンドを実行します。
- exec: 新しいプロセスを作成せずに次のコマンドを実行し、終了します。
- export: 変数をエクスポートします。
- read: 標準入力から入力を読み取ります。
- shift: スクリプトのパラメータをシフトします。
2.2 サブストリングの高度な使用法
user="john"
${変数} # 変数名を返す
${#変数} # 変数の長さを返す
${変数:開始位置} # 開始位置以降の文字を返す
${変数:開始位置:長さ} # 開始位置から指定した長さの文字を返す
${変数#パターン} # 変数の先頭から最短一致するパターンを削除
${変数##パターン} # 変数の先頭から最長一致するパターンを削除
${変数%パターン} # 変数の末尾から最短一致するパターンを削除
${変数%%パターン} # 変数の末尾から最長一致するパターンを削除
${変数/パターン/文字列} # 最初に一致するパターンを文字列に置換
${変数//パターン/文字列} # すべての一致するパターンを文字列に置換
2.3 文字列の長さの計算方法
- wc: 文字列の長さを計算します。
- expr: 文字列の長さを計算します。
- awk: 文字列の長さを計算します。
2.5 特殊変数の拡張
- \${変数:-デフォルト}: 変数が空の場合、デフォルト値を返します。
- \${変数:=デフォルト}: 変数が空の場合、デフォルト値を代入し、返します。
- \${変数:?メッセージ}: 変数が空の場合、メッセージをエラーとして出力します。
- \${変数:+文字列}: 変数が空でない場合、文字列を返します。
例: ファイルの削除スクリプト
#!/bin/bash
find \${path:=/backup/data/} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f