シェルスクリプトの特別な検証が必要です。

シェルスクリプトの特別な検証が必要です。

実行時に多くのオプションを持つbashスクリプトを作成したいと思います。

# script.sh  --dry-run --user <parameter1> --pass <parameter2>

getoptオプションについて聞いたが、それらのうちの1つだけを書くことができるか、または--user or --passwordすべて--dry-runを書くことができないようです。基本的にこれを--user parameter1input1 と input2 にしたい、オプションがある場合は本番コードの代わりにテスト実行コードだけが実行される--pass parameter2特別な場合を作りたいと思います。--dry-run

#!/bin/bash
user=$1
pass=$2

help() {
    cat<<EOF
Usage : $0 --dry-run --user <user_id> --pass <password>
you can specify --dry-run or --production
EOF
}

[ ${3} ] || help

function dry_run() {
    // --dry-run code 
}

function production() {
   // --production code 
}

--dry-runオプションが「はい」の場合は--dry-run関数を実行し、それ以外の場合は関数をdry_run()実行していることを確認したいと思います。production()しかし、オプションと検証を書く方法は?

答え1

あなたがやっていることを私が理解しているなら、あなたはこれをすることができますgetopt

#!/bin/bash

PARAMS=$(getopt -l dry-run,production,user:,pass: -n $0 "" -- "$@")
if [ $? != 0 ]; then exit 1; fi
eval set -- "$PARAMS"

dryrun=false

while [ -n "$1" ]; do
    case "$1" in
        --dry-run) dryrun=true; shift;;
        --production) dryrun=false; shift;;
        --user) user="$2"; shift 2;;
        --pass) pass="$2"; shift 2;;
        --) shift;;
        *) exit 1;;
    esac
done

if [ $dryrun = true ]; then
    ...
else
    ...
fi

--dry-run同時にAND指定を許可しない場合、または--productionANDが必要な場合は、--userさらに処理を追加できます。--password

答え2

getopt実際に長いスクリプトオプションを処理する必要はありません。組み込みgetopts関数もこれを行うことができます。(通常サブシェルなし)。秘密は-オプションとして使用することです。そのように--dry-run (例えば)以下は、optvar=-このOPTARG=-dry-run場合に具体的にこれを行う方法の機能的な例です。

#!/bin/sh
help(){ echo usage; }                       #dummy help
unset   user dryrun pass _o o               #ensure all flag vars are unset
while   getopts :-:u:p:d o              &&  #getopts loop
        o=${o#-}        _o=${o:+$OPTARG}    #empty $o if $o==-
do      case            $o$OPTARG       in  #test concatenated $o$OPTARG
        (u*|-user)      user=${_o:-$2}  ;;  #set $user to $_o or $2
        (p*|-pass)      pass=${_o:-$2}  ;;  #ditto for $pass
        (d*|-dryrun)    o=d dryrun=1    ;;  #no $OPTARG either way - o=d base
        (*)             !  help         ;;  #no usage options met - opt error
        esac || exit                        #quit with error if opt == ! help
        shift "$((!${#o}+(OPTIND-(OPTIND=1))))"  #shift params as they're read
done

これはそのまま機能します。実際、私はいくつかの異なるオプションを試しました。たとえば、

~/getopts.sh -p-user --user me -uyou -d --dry-run

... #!/bin/sh -xbanglineで実行すると、これを私のstderrに印刷します。

+ unset user dryrun pass _o o
+ getopts :-:u:p:d o
+ o=p _o=-user
+ pass=-user
+ shift 1
+ getopts :-:u:p:d o
+ o= _o=
+ user=me
+ shift 2
+ getopts :-:u:p:d o
+ o=u _o=you
+ user=you
+ shift 1
+ getopts :-:u:p:d o
+ o=d _o=
+ o=d dryrun=1
+ shift 1
+ getopts :-:u:p:d o
+ o= _o=
+ o=d dryrun=1
+ shift 1
+ getopts :-:u:p:d o

getoptsループが完了したら、次のことができます。

[ "$((dryrun))" -eq 0 ] && production || dryrun

production()...と関数を宣言した場合dryrun()。必要に応じて、指定$passおよび/または割り当てられたコマンドライン値を見つけます。$userコマンドラインでこれらのいずれかが宣言されていない場合は、次のように参照することを検討できます。

echo "${user=default_username}" "${pass=default_password}"

...すべての基盤をカバーするためのものです。

関連情報