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 コマンドでオプションを使ったシェルプログラミングは楽しい ♪ souce などで呼ぶと変数領域がそのまま引き継がれる様子。 個人的には bash だと全部グローバル変数なので、変数は汚染されやすいよな、と思う 引数処理 (1) case 文を使う. while [ -n "$1" ]; do case "$1" in -with-arg) shift; arg=$1; shift;; -no-arg) shift;; *) shift;; esac done (2) getopts という getopt(3)みたいな. 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==で文字列を分解する

whileへの情報の渡し方は cat hoge | while … より while read do ; … ; done < <( echo …) の方が良い。パイプだどパイブ以降はサブシェルとして扱われ、サブシェル内で変数を操作しても、サブシェルの外へは影響を及ぼせない。外の変数を操作できない。 IFS== で key=value を分解できる eval local $key=$value の形で関数内だけで有効な変数とできる create-tags(){ INSTANCEID=$1 ; shift while read VAL ; do IFS== read create_tags_key create_tags_value <<<"$VAL" if [[ "x" = "x${create_tags_key}" ]] || [[ "x" = "x${create_tags_value}" ]] ; then echo -e "$0 ${FUNCNAME[0]} です。\n 第2引数以降は key=value の形式でお願いします" echo " key=value が ${create_tags_key}=${create_tags_value} でした" exit 4 fi eval local ${create_tags_key}=${create_tags_value} TAGS="$TAGS Key=${create_tags_key},Value=${create_tags_value}" done < <( echo $@ | sed -e 's/ +/ /g' -e 's/ /\n/g' ) TAGS="$TAGS Key=Creater,Value=${USER}@${HOSTNAME}" echo -e "$0 ${FUNCNAME[0]} $KEY $VALUE $moemoe $hogehoge" echo $TAGS # aws ec2 create-tags --tags Key=Name,Value=${NAME} Key=Nodes,Value=${NODES} Key=Roles,Value=${ROLES} Key=Creater,Value="$USER@$HOSTNAME" --resources ${INSTANCEID} } create-tags i-02d848a7 Name=inoue-test1 Nodes=default ROLES=ekitan_essence hogehoge=4 Read more...

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

シグナルをトラップする方法 参考この人のシェルスクリプト関連の話題は深い… シェルスクリプトでシグナルをトラップして処理したい場合に参考になった。 tracebackの方はサブシェルで起動するようにすれば良いかも #!/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 #処理 let ++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...

bashでcgi

bash で cgi かける。 ただセキュリティ的に良くないので、外部からアクセスできない場所でのみ使えると思う。 #!/bin/sh cat - <<%%EOF Content-type: text/html <html> <body>cgi-test(/cgi-bin)test.hoge.com</body> </html> %%EOF Read more...