Open7

bashスクリプトの勉強メモ

ryo_kawamataryo_kawamata

コマンド実行結果を変数に入れる

バッククォートか、$()を使うことでコマンド実行結果を変数に格納できる

hoge=`cat hoge.txt`
hoge=$(cat hoge.txt)

$()の方が高機能でネストもできるらしい。

hoge=$(echo $(echo 'foo'))

localをつけると関数内で限定される

ryo_kawamataryo_kawamata

デフォルト値の設定

${変数名:-初期値} でデフォルト値を設定できる

#第1引数がない場合はhogeをデフォルト値とする場合
# ${}で囲む場合、引数の$1は$を外して1になる
NAME=${1:-hoge}

``

ryo_kawamataryo_kawamata

引数のパース

こちらを参考に..
https://stackabuse.com/how-to-parse-command-line-arguments-in-bash/

function parse_args() {
    SHORT=c:,f:,h
    LONG=command:,files:,help
    OPTS=$(getopt -a -n watch-files --options $SHORT --longoptions $LONG -- "$@")

    eval set -- "$OPTS"

    while :
    do
        case "$1" in
            -c | --command )
                COMMAND="$2"
                shift 2
            ;;
            -f | --files )
                FILES="$2"
                shift 2
            ;;
            -h | --help)
                "This is a weather script"
                exit 2
            ;;
            --)
                shift;
                break
            ;;
            *)
                echo "Unexpected option: $1"
            ;;
        esac
    done

    echo $COMMAND, $FILES
}

parse_args "$@"

getopt はGNU/Linux 版とBSD 版で動きが違うので駄目だった..
getoptsを使うことにした。

function parse_args() {
    while getopts ":hc:f:" opt; do
        case ${opt} in
            c )
                COMMAND="$OPTARG"
            ;;
            f )
                FILES="$OPTARG"
            ;;
            h )
                usage
                exit 2
            ;;
            * )
                echo "Invalid option: $OPTARG" 1>&2
                exit 2
            ;;
        esac
    done
    shift $((OPTIND -1))

    if [[ "$COMMAND" == "" ]] || [[ "$FILES" == "" ]]; then
        usage
    fi
}
ryo_kawamataryo_kawamata

関数

関数の戻り値は終了ステータス。通常の意味での戻り値はechoを使う