目次 このページのソースコードを表示

スニペット

公開日:
更新日:

ShellScriptでよく使いそうな処理をまとめてみました.

備忘録を兼ねています.

主に, 文献[1][2]を参考にしました.

環境変数$PATHの後にパス追加

        export PATH="$PATH:追加したいパスA:追加したいパスB"

$PATH変数の前にパス追加

        PATH="pathA:pathB${PATH+:}${PATH-}"
    

${PATH+:}: $PATHが定義されていたら:

${PATH-}: $PATHが定義されていたら$PATH

シェル変数の展開書式[1]

${var}の動作についての補足.

基本以下の条件が当てはまらないときは, $varが読まれる.

書式 条件と動作
${var-word} 変数$varが未定義の場合, 文字列"word"が読みだされる.
${var:-word} 変数$varが未定義か空文字の場合, 文字列"word"が読みだされる.
${var+word} 変数$varが定義されている場合, 文字列"word"が読みだされる.
${var:+word} 変数$varが定義されている(空文字でない)場合, 文字列"word"が読みだされる.

シェルスクリプトの前に書く, 環境設定

        set -u
        export LC_ALL=C
        type Command >/dev/null 2>&1 && type getconf >/dev/null 2>&1 &&
        export PATH="$(command -p getconf PATH)${PATH+:}${PATH-}"
        export UNIX_STD=2003  # to make HP-UX conform to POSIX

引数がなければ即終了

        case $# in 0) exit 1;;esac
    

#は引数の数

コマンド名を取得する

        ${0##*/}

$0はコマンドパス

コマンドパスから前から検索をかけて最後にある/まで切り落とされる.

コマンドのヘルプオプションがあるか?

        case "${1:-}" in
          --help|--version|-h) print_usage_and_exit;;
        esac
    

$1は, 引数1つ目.

ファイルを開く(ファイルの末尾に改行がないとき, 改行させる)

        
        grep '' ${file:+"$file"} 
        

$fileにはファイルパスを設定する

エラーメッセージと終了値を引数に持つ終了関数

        # === FUNC: error exit with message and return code ====================
        # arg    : $1=ret; $2=message
        # ret    : return code
        # stderr : message
        error_exit() {
          ${2+:} false && echo "${0##*/}: $2" 1>&2
          exit $1
        }
    

${2+:}は, 二つ目の引数が定義されているとき:を呼ぶ.

falseのときは, &&以降のコードは読まれないが, : falseのときは, 実行される.

コマンドの使い方を表示して終了

        usage="
        Usage: ${0##*/} [options]
        
        Options:
         -h, --help  display this help and exit
        
        Version:
         1.0.0
        "
        
        print_usage_and_exit () {
          echo "$usage" 1>&2
          exit 1
        }
    

コマンドのオプションごとの処理

            
        opta=0
        optb=0
        optc=0
        
        while [ $# -gt 0 ]; do
          case $1 in
            --a) opta=1; shift; continue;;
            --b) optb=1; shift; continue;;
            --c) optc=1; shift; continue;;
            --help|--version|-h) print_usage_and_exit;;
                *) print_usage_and_exit;;
          esac
        done


        case $opta in
          0) : ;;
          1) echo オプションAの処理
        esac
        
        case $optb in
          0) : ;;
          1) echo オプションAの処理
        esac
        
        case $optc in
          0) : ;;
          1) echo オプションAの処理
        esac

コマンドを用いたファイル追記

    
        cat >> ~/.bashrc <<EOF
        # .bashrcに追加書き込みたいことを書く
        # ...
        
        EOF
    
    

pkill, pgrepなどのコマンドで渡すための, ttyを取得する

ttyの確認によく使われるコマンドttyがありますが, 出力は, /dev/pts/0/dev/tty2であり, pkillpgrep-tオプションで渡すttyの値は, 先頭の/dev/を取り除いた値で, 適していません.

以下のスニペットで, 先頭の/dev/を取り除いた, pkill, pgrep-tオプションで渡せるttyの値を取得します.

        current_tty=$(ps -p $$ | tail -n 1 | awk '{ print $2 }')

awkを使わないならば,

        current_tty=$(
          ps -p $$ | tail -n 1 | (
            set $(cat)
            printf "$2"
          )
        )

だが, psコマンドのTTYの列が, 数字のみの場合(FreeBSD 9.1-RELEASE-p24)があったので, もしかしたら, 以下の方がいいかも.

        current_tty=$(tty | sed -e "s:/dev/::")
参考

参照文献

  1. ^ a b 松浦智之. Windows/Mac/UNIXすべてで20年動くプログラムはどう書くべきか. 2016
  2. ^ 山森丈範. [改訂第3版]シェルスクリプト基本リファレンス. 2017
「https://contentsviewer.work/Master/ShellScript/Snippet/Snippet」から取得