Tag: bash

bash/引数

bash によるオプション解析 - Qiita テンプレート、get_blocklist()関数、get_mac_addresslist()関数、ヘルプを表示する usage_exit()関数は用意してあるものとする if [ $# -eq 0 ]; then get_blocklist exit fi while getopts "bmh" OPT do case $OPT in b) get_blocklist hoge="hogehoge" ;; m) get_mac_addresslist ;; h) usage_exit ;; \?) usage_exit ;; esac done shift $((OPTIND - 1)) 最後の shift $((OPTIND - 1)) だが、これはコマンドライン中のオプションの部分を削除する動作 注意点 getopts コマンドでオプションを使ったシェルプログラミングは楽しい ♪ source などで呼ぶと変数領域がそのまま引き継がれる様子。 個人的には bash だと全部グローバル変数なので、変数は汚染されやすいよな、と思う 引数処理 (1) case 文を使う. while [ -n "$1" ]; do case "$1" in -with-arg) shift; arg=$1; shift;; -no-arg) shift;; *) shift;; esac done (2) getopts というシェル組み込みもある. Read more...

bash/比較演算子

bash の比較演算子の意味 - enokitech bash であれば [[ ! -d /var/tmp ]] のような 2 重カッコを使うことで、否定ができる 演算子 英語 記号 -lt Less than < -gt Greater than > -le Less than or Equal to <= -ge Greater than or Equal to >= -eq Equal to = -ne Not equal to != 文字列比較 = 左項と右項が同一文字列の場合真 ! Read more...

bash周りのメモ

bash 5.1.4 で 2021/09/09 確認 文字列操作 VAR=onetwothree # 以下はこの VAR を操作するとして 表現 結果 意味 ${VAR/two/four} onefourthree 値の中の文字列 two を four に置換 $VAR onetwothree (元の変数自体は変わらない) ${#VAR} 11 文字数 ${VAR/two} onethree 置換文字列を指定しないと一致文字列が削除される ${VAR#one*t} wothree 値の前方からマッチする最短の文字列を取り除く ${VAR##one*t} hree 値の前方からマッチする最長の文字列を取り除く ${VAR%t*ee} onetwo 値の後方からマッチする最短の文字列を取り除く ${VAR%%t*ee} one 値の後方からマッチする最長の文字列を取り除く ${VAR: 0: 3} one 一番左の文字から 3 文字を取り出す ${VAR: 2: 3} etw 2 番目の文字から 3 文字分を取り出す ${VAR: 2} etwothree 第 2 パラメータを省略すると`末尾まで’の意となる ${VAR: -4: 3} hre 末尾から数えて 4 番目の文字から、3 文字分を取り出す ${VAR: -4} hree 第 2 パラメータを省略すると`末尾まで’の意 ${VAR: -1} e 最後の 1 文字を取り出すにはこう シェルの組み込みコマンド コマンド 効果 : 何もしないで終了コード 0 を返す。while : ;do …;done のように無限ループさせるのによく使う。 . Read more...

bash_ リダイレクト

exec でリダイレクト先を指定する ファイルを分ける exec 2>> stderr.log 1>> stdout.log ファイルを一緒にする exec >> stdouterr.log 2>&1 リダイレクト 入力と出力 - UNIX & Linux コマンド・シェルスクリプト リファレンス “{}” のグループをリダイレクト { echo "1. hogehoge" echo "2. fugafuga" echo "3. foofoo" echo "4. barbar" } >>file ヒアドキュメントをリダイレクト cat <<__END_OF_MESSAGE__ >>file 1. hogehoge 2. fugafuga 3. foofoo 4. barbar __END_OF_MESSAGE__ for 文のブロックをリダイレクト for i in `seq 1 10`; do echo "number $i" done >>file if [ -f "$str" ]; then ls "fugafuga" else echo "FUGAFUGA" fi >>file case "$str" in "hoge" ) ls "hogehoge" ;; "fuga" ) cat "fugafuga" ;; * ) echo "NG. Read more...

bashでのデバック時に参考にさせていただくページ

シェルスクリプトのデバッグ - UNIX & Linux コマンド・シェルスクリプト リファレンス -x を使ったデバックの詳細がある。部分的に-x を適用したり。 たぶん使わないであろう Bash のデバッグ方法 - harry’s memorandum -x -v でデバッグ このページにはだいぶマニアックなデバッグ方法がある。 Read more...

bashで引数をIFS==で文字列を分解する

cat file | while read ... より while read ...; do ...; done < <(...) の方が、ループ本体を現在のシェルで実行できるので変数を保持しやすい。 IFS='=' read -r key value <<<"$pair" の形で key=value を分解できる。 動的な変数代入が必要でも eval は避け、local "$key=$value" のように扱う方が安全。 create_tags() { local instance_id=$1 shift local tags="" local pair key value for pair in "$@"; do IFS='=' read -r key value <<<"$pair" if [[ -z "$key" || -z "$value" ]]; then echo "$0 ${FUNCNAME[0]}: 第2引数以降は key=value の形式で指定してください" >&2 echo " 受け取った値: ${key}=${value}" >&2 exit 4 fi local "$key=$value" tags="$tags Key=$key,Value=$value" done tags="$tags Key=Creator,Value=${USER}@${HOSTNAME}" echo "$tags" # aws ec2 create-tags --tags $tags --resources "$instance_id" } create_tags i-02d848a7 Name=inoue-test1 Nodes=default ROLES=ekitan_essence hogehoge=4 Read more...

bashのシグナルをトラップする

シグナルをトラップする方法 参考この人のシェルスクリプト関連の話題は深い… シェルスクリプトでシグナルをトラップして処理したい場合に参考になった。 tracebackの方はサブシェルで起動するようにすれば良いかも EXIT トラップ内で pkill -P $$ を使う例は、親シェル配下の子プロセスをまとめて止めたい時だけ使う。意図しないプロセスまで終了させる可能性があるので注意。 #!/bin/bash set -u # Check unset variables only #set -ue # Check unset variables. Exit on error LANG=C # Trap signals trap_HUP() { echo "Trap HUP signal." exit 1 } trap_INT() { echo "Trap INT signal." exit 1 } trap_TERM() { echo "Trap TERM signal." exit 1 } trap_QUIT() { echo "Trap QUIT signal." exit 1 } on_exit(){ echo "Kill child processes on exit by 'pkill -P $$'" pkill -P $$ echo "Exit. Read more...

bashコーディング規約

コーディング規約 参考 参考 ヘッダを記載する ヘッダの直後に基本的な環境変数を定義する umask LANG PATH インデントは半角スペース 2 つ | は前後にスペース 1 つ 、»は前にスペース 1 つ、後ろは空けない <、«も前にスペース 1 つ、後ろは空けない if と then は同一行に、セミコロンの直後はスペース 1 つ for、while の do と done は行頭を揃える 関数定義の function は省略してもよい(しなくてもよい) if 文を省略しない 連続した同一ファイルへのリダイレクトはグルーピング 変数の命名規則 定数は大文字 定数以外は小文字 複数の単語を連結する場合は「_」で結合する readonly 宣言を付けて、読み取り専用にすることを推奨 ファイル/ディレクトリの絶対パスの場合は、HOGE_FILE または FUGA_DIR ファイル名またはディレクトリ名のみの場合は、HOGE_FILENAME または FUGA_DIRNAME 今後増える見込みのない少ない繰り返しはループしない 正常終了時はリターンコード 0 異常終了時はリターンコード 0 以外 ログレベル INFO: 参考情報 NOTICE: 注意レベル WARNING: 警告レベル、処理を中断しないスキップ程度の問題 ERROR: エラー、処理を中断するレベルの問題 シェルスクリプトのコーディングルール 2014 参考 Read more...

bash制御構文

分岐 if [ 条件 ] ; then fi if [ 条件 ] ; then else fi if [ 条件 ] ; then elif [ 条件 ] ; then fi declare -i i=0 while [ "$i" -lt 5 ]; do # 処理 ((++i)) done for 文 declare -i i for ((i=0; i < 5; ++i)); do done for each 文 for field in "${fields[@]}";do done if 文をシンプルに 参考 command ... if [ $? Read more...

bash変数周りのメモ

シェル変数 ||0|| プログラム名 ||1 ~ 9|| 第 1 ~9引数 ||@|| 全ての引数。"$@" としたときは “$1” “$2” “$3”… に等しい。 ||*|| 全ての引数。"$*" としたときは “$1 $2 $3…” に等しい。 ||#|| 引数の数 ||?|| 直前に実行したプログラムの終了コード。 ||RANDOM|| ランダムな数字。0~32767 が帰ってくる模様。 ||$|| プロセス ID Geek なぺーじ:10 の UNIX 小技 変数と「"」の組み合わせは慎重に 特別な理由が無い限り、変数は「"」で囲う方が良いでしょう。 もし、変数名の直後に文字を使いたいのであれば、変数名を「{}」で囲いましょう。 これを忘れてしまうと、別の変数名として扱われてしまいます。 意図しない別の変数名になってしまった場合、大抵はnull値になるでしょう。 $ ls tmp/ a b $ VAR="tmp/*" $ echo $VAR tmp/a tmp/b $ echo "$VAR" tmp/* $ echo $VARa $ echo "$VARa" $ echo "${VAR}a" tmp/*a $ echo ${VAR}a tmp/a $ コマンドのグループ化 Geek なぺーじ:10 の UNIX 小技 Read more...