shellscript
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
shellscript [2019/07/08 06:24] – [テクニック] nullpon | shellscript [2024/08/20 15:31] (現在) – nullpon | ||
---|---|---|---|
行 1: | 行 1: | ||
====== ShellScript ====== | ====== ShellScript ====== | ||
+ | ===== bash ===== | ||
+ | |||
+ | シェルスクリプトは基本的にはbashをターゲットに作成する。 | ||
+ | |||
+ | < | ||
+ | #!/bin/bash -eu | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | shebangは''# | ||
+ | |||
+ | dockerで起動する場合、alpineにはbashが入ってないため、ubuntu-slimをベースイメージにする。 | ||
===== shの実行オプション ===== | ===== shの実行オプション ===== | ||
行 6: | 行 19: | ||
* -x 変数を展開した状態で実際に実行されるコマンドを標準エラー出力に書き出す | * -x 変数を展開した状態で実際に実行されるコマンドを標準エラー出力に書き出す | ||
* -u 未定義の変数があれば処理を打ち切る | * -u 未定義の変数があれば処理を打ち切る | ||
+ | * -C noclobberオプションを有効にする(リダイレクトでファイルを上書きしようとするとエラーになる、追記はOK) | ||
shebangに追加されることが多い | shebangに追加されることが多い | ||
行 42: | 行 56: | ||
==== [[ ]] ==== | ==== [[ ]] ==== | ||
- | bashの拡張、bashならこちらを使った方がバグが少ないので良い | + | testコマンドのbash拡張 |
単語分割やパス展開しないので、変数をクオートで囲む必要ない | 単語分割やパス展開しないので、変数をクオートで囲む必要ない | ||
行 65: | 行 79: | ||
read line | read line | ||
echo $line | echo $line | ||
+ | |||
+ | プロンプトを出して入力を促す | ||
+ | |||
+ | echo -n "User Name: " | ||
+ | read username | ||
+ | echo $username | ||
+ | | ||
+ | zshでは以下のようにかける | ||
+ | |||
+ | read " | ||
+ | echo $username | ||
+ | | ||
+ | 入力値をマスクしたい場合はread -s(決定時の改行も出力されなくなるのでechoを挟むとよい) | ||
+ | |||
+ | read -s " | ||
+ | tty -s && echo | ||
+ | echo $password | shasum -a 256 | ||
+ | |||
+ | |||
| | ||
標準入力が尽きるまで行を読み取る(Ctrl-DでEOFを送信) | 標準入力が尽きるまで行を読み取る(Ctrl-DでEOFを送信) | ||
行 89: | 行 122: | ||
| | ||
| | ||
- | ===== テクニック | + | ===== trap ===== |
- | ==== 終了時処理を実行 | + | ==== シグナルのハンドリング |
- | 例えばmktempで作成した一時ファイルをスクリプト終了時に削除するなど | + | < |
+ | trap "echo trap sigint" | ||
+ | |||
+ | while :; do sleep 1; done | ||
+ | </ | ||
+ | |||
+ | SIGINTをトラップすると、Ctrl-cで終了できなくなるので注意。またSIGKILLはトラップできない。 | ||
+ | |||
+ | ==== EXITで終了時処理 ==== | ||
+ | |||
+ | 基本はシグナルのハンドリングだが、EXITとERRという疑似シグナルが利用できる。例えばmktempで作成した一時ファイルをスクリプト終了時に削除するなどの処理をEXITと組合わせて書ける。 | ||
< | < | ||
hoge=/ | hoge=/ | ||
- | |||
mktemp $hoge | mktemp $hoge | ||
+ | |||
trap "rm $hoge" EXIT | trap "rm $hoge" EXIT | ||
</ | </ | ||
+ | | ||
+ | ===== テクニック ===== | ||
+ | |||
==== スクリプトファイル名を取得 ==== | ==== スクリプトファイル名を取得 ==== | ||
行 148: | 行 194: | ||
< | < | ||
${HOGE: | ${HOGE: | ||
- | ${HOGE: | + | ${HOGE: |
${HOGE: | ${HOGE: | ||
${HOGE:? | ${HOGE:? | ||
</ | </ | ||
+ | ===== シェル変数の加工 ===== | ||
+ | |||
+ | 指定位置で切り取り | ||
+ | |||
+ | < | ||
+ | x=abcdefg | ||
+ | echo ${x: | ||
+ | </ | ||
+ | |||
+ | 変数の値の先頭・末尾でマッチした部分を削除する | ||
+ | |||
+ | < | ||
+ | x=hogehogefugafuga | ||
+ | |||
+ | echo ${x# | ||
+ | |||
+ | echo ${x%fuga} | ||
+ | |||
+ | echo ${x# | ||
+ | |||
+ | echo ${x## | ||
+ | |||
+ | echo ${x%f*a} | ||
+ | |||
+ | echo ${x%%f*a} | ||
+ | </ | ||
+ | |||
+ | 文字列置換 | ||
+ | |||
+ | < | ||
+ | echo ${var/ | ||
+ | |||
+ | echo ${var// | ||
+ | </ | ||
+ | |||
+ | |||
+ | 使用例:まとめてリネーム、拡張子まとめて変更 | ||
+ | < | ||
+ | $ ls | ||
+ | a.txt b.txt c.txt | ||
+ | |||
+ | $ for i in `ls`; do mv $i ${i%.txt}.php; | ||
+ | |||
+ | $ls | ||
+ | a.php b.php c.php | ||
+ | </ | ||
===== パラメータ展開 ===== | ===== パラメータ展開 ===== | ||
行 253: | 行 345: | ||
</ | </ | ||
- | '' | + | '' |
+ | |||
+ | |||
+ | '' | ||
< | < | ||
行 288: | 行 383: | ||
これらの挙動はシェル関数の引数でも同様である。 | これらの挙動はシェル関数の引数でも同様である。 | ||
+ | |||
+ | ===== ヒアドキュメント ===== | ||
+ | |||
+ | 変数に格納 | ||
+ | |||
+ | <code shellscript> | ||
+ | val=$(cat << ' | ||
+ | hoge | ||
+ | fuga | ||
+ | piyo | ||
+ | EOS | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | 標準入力に渡す | ||
+ | |||
+ | <code shellscript> | ||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done << ' | ||
+ | hoge | ||
+ | fuga | ||
+ | piyo | ||
+ | EOS | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | 一度変数を経由する。''<<<'' | ||
+ | |||
+ | <code shellscript> | ||
+ | val=$(cat << ' | ||
+ | hoge | ||
+ | fuga | ||
+ | piyo | ||
+ | EOS | ||
+ | ) | ||
+ | |||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done <<< | ||
+ | </ | ||
+ | |||
+ | クオートの有無は変数展開するかしないか | ||
+ | |||
+ | <code shellscript> | ||
+ | val=' | ||
+ | |||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done << " | ||
+ | ${val} | ||
+ | ${val} | ||
+ | ${val} | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | クオートありの場合は変数展開されずに以下のように出力される | ||
+ | |||
+ | < | ||
+ | ${val} | ||
+ | ${val} | ||
+ | ${val} | ||
+ | </ | ||
+ |
shellscript.1562567041.txt.gz · 最終更新: 2019/07/08 06:24 by nullpon