実行時に多くのオプションを持つbashスクリプトを作成したいと思います。
# script.sh --dry-run --user <parameter1> --pass <parameter2>
getoptオプションについて聞いたが、それらのうちの1つだけを書くことができるか、または--user or --password
すべて--dry-run
を書くことができないようです。基本的にこれを--user parameter1
input1 と 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指定を許可しない場合、または--production
ANDが必要な場合は、--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 -x
banglineで実行すると、これを私の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}"
...すべての基盤をカバーするためのものです。