ユーザ用ツール

サイト用ツール


shellscript

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
shellscript [2019/04/24 01:48] – [シェルスクリプトの引数] nullponshellscript [2024/08/20 15:31] (現在) nullpon
行 1: 行 1:
 ====== ShellScript ====== ====== ShellScript ======
  
 +===== bash =====
 +
 +シェルスクリプトは基本的にはbashをターゲットに作成する。
 +
 +<code>
 +#!/bin/bash -eu
 +
 +...
 +</code>
 +
 +shebangは''#!/bin/sh''にはしない
 +
 +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 "username?User Name: " 
 +  echo $username 
 +   
 +入力値をマスクしたい場合はread -s(決定時の改行も出力されなくなるのでechoを挟むとよい) 
 + 
 +  read -s "password?Password:
 +  tty -s && echo 
 +  echo $password | shasum -a 256 
 + 
 + 
 +   
 +標準入力が尽きるまで行を読み取る(Ctrl-DでEOFを送信)
   while read line   while read line
   do   do
行 88: 行 121:
   EOS   EOS
      
 +  
 +===== trap =====
 +
 +==== シグナルのハンドリング ====
 +
 +<code>
 +trap "echo trap sigint" INT
 +
 +while :; do sleep 1; done
 +</code>
 +
 +SIGINTをトラップすると、Ctrl-cで終了できなくなるので注意。またSIGKILLはトラップできない。
 +
 +==== EXITで終了時処理 ====
 +
 +基本はシグナルのハンドリングだが、EXITとERRという疑似シグナルが利用できる。例えばmktempで作成した一時ファイルをスクリプト終了時に削除するなどの処理をEXITと組合わせて書ける。
 +
 +<code>
 +hoge=/tmp/hogehoge
 +mktemp $hoge
 +
 +
 +trap "rm $hoge" EXIT 
 +</code>
      
 ===== テクニック ===== ===== テクニック =====
行 115: 行 172:
 fi fi
 </code> </code>
 +
 +==== ランダム文字列を生成 ====
 +
 +0-9A-Za-zのランダムな文字列を作成する。mac用
 +
 +<code>
 +$ cat /dev/random | base64 | fold -w 16 | egrep -v "[+/]" | head -n 1
 +
 +$ head -c 100 /dev/random | base64 | tr -d "+/" | head -c 16
 +</code>
 +
 +セキュアな必要がないならば
 +
 +<code>
 +$ shasum <(ls -al) | cut -d " " -f 1 
 +</code>
 +
  
 ===== 変数参照 ===== ===== 変数参照 =====
行 120: 行 194:
 <code> <code>
 ${HOGE:-wang}   # HOGEに値がある場合はその値が展開される。HOGEが空の場合は、wangが展開される ${HOGE:-wang}   # HOGEに値がある場合はその値が展開される。HOGEが空の場合は、wangが展開される
-${HOGE:+wang}   # HOGEに値がある場合はその値とwangが展開される。HOGEが空の場合は何もしない+${HOGE:+wang}   # HOGEに値がある場合はwangが展開される。HOGEが空の場合は何もしない
 ${HOGE:=wang}   # HOGEに値がある場合はその値が展開される。HOGEが空の場合は、wangと展開し、さらにHOGEにwangを代入 ${HOGE:=wang}   # HOGEに値がある場合はその値が展開される。HOGEが空の場合は、wangと展開し、さらにHOGEにwangを代入
 ${HOGE:?wang}   # HOGEに値がある場合はその値が展開される。HOGEが空の場合は、wangを標準エラー出力に書き出して exit 1 ${HOGE:?wang}   # HOGEに値がある場合はその値が展開される。HOGEが空の場合は、wangを標準エラー出力に書き出して exit 1
 </code> </code>
  
 +===== シェル変数の加工 =====
 +
 +指定位置で切り取り
 +
 +<code>
 +x=abcdefg
 +echo ${x:1:4}      # => bcde
 +</code>
 +
 +変数の値の先頭・末尾でマッチした部分を削除する
 +
 +<code>
 +x=hogehogefugafuga
 +
 +echo ${x#hoge}       # => hogefugafuga 前方一致削除
 +
 +echo ${x%fuga}       # => hogehogefuga 後方一致削除
 +
 +echo ${x#h*e}      # => hogefugafuga * はワイルドカード
 +
 +echo ${x##h*e}     # => fugafuga ##はワイルドカードを前方最長一致にする
 +
 +echo ${x%f*a}        # => hogehogefuga * はワイルドカード
 +
 +echo ${x%%f*a}       # => hogehoge %%はワイルドカードを後方最長一致にする
 +</code>
 +
 +文字列置換
 +
 +<code>
 +echo ${var/hoge/HOGE}   # => HOGEhogefugafuga
 +
 +echo ${var//hoge/HOGE}  # => HOGEHOGEfugafuga グローバルマッチ
 +</code>
 +
 +
 +使用例:まとめてリネーム、拡張子まとめて変更
 +<code>
 +$ ls 
 +a.txt b.txt c.txt
 +
 +$ for i in `ls`; do mv $i ${i%.txt}.php; done
 +
 +$ls 
 +a.php b.php c.php
 +</code>
 ===== パラメータ展開 ===== ===== パラメータ展開 =====
  
行 219: 行 339:
 </code> </code>
  
-</code>+<code>
 $ ./arg2.sh 1 2 3 $ ./arg2.sh 1 2 3
 1 2 3 1 2 3
行 225: 行 345:
 </code> </code>
  
-''$@'' と ''$*'' はダブルクオートで括った場合の動作が異なる。''$*'' は引数が一つの値にまとめられてしまう。ほとんどの場合、''$@'' の挙動が求められるので、''$@'' を使っておけば間違いない+''$@'' と ''$*'' はダブルクオートで括った場合の動作が異なる。''"$@"''は''"1" "2" "3"''、''"$*"''は''"1 2 3"''と展開される。 
 + 
 + 
 +''$*'' は引数が一つの値にまとめられてしまう。ほとんどの場合、''$@'' の挙動が求められるので、''$@'' を使っておけば間違いない
  
 <code> <code>
行 260: 行 383:
  
 これらの挙動はシェル関数の引数でも同様である。 これらの挙動はシェル関数の引数でも同様である。
 +
 +===== ヒアドキュメント =====
 +
 +変数に格納
 +
 +<code shellscript>
 +val=$(cat << 'EOS'
 +hoge
 +fuga
 +piyo
 +EOS
 +)
 +</code>
 +
 +
 +標準入力に渡す
 +
 +<code shellscript>
 +while read -r line
 +do
 +  echo $line
 +done << 'EOS'
 +hoge
 +fuga
 +piyo
 +EOS
 +)
 +</code>
 +
 +
 +一度変数を経由する。''<<<''はヒアストリングと呼ばれるものでPOSIXには定義されておらずshでは使用できない。bashやzshで使用できる
 +
 +<code shellscript>
 +val=$(cat << 'EOS'
 +hoge
 +fuga
 +piyo
 +EOS
 +)
 +
 +while read -r line
 +do
 +  echo $line
 +done <<< $val
 +</code>
 +
 +クオートの有無は変数展開するかしないか
 +
 +<code shellscript>
 +val='test'
 +
 +while read -r line
 +do
 +    echo $line
 +done << "EOF"
 +${val}
 +${val}
 +${val}
 +EOF
 +</code>
 +
 +クオートありの場合は変数展開されずに以下のように出力される
 +
 +<code>
 +${val}
 +${val}
 +${val}
 +</code>
 +
shellscript.1556070486.txt.gz · 最終更新: 2019/04/24 01:48 by nullpon