数日間の調査の後、私はまだ.shスクリプトのコマンドライン引数を解析するための最良の方法を見つけることができません。私の参考文献によると、getopts cmdは、「位置パラメーター変数を乱すことなくスイッチを抽出してチェックします。予期しないスイッチ、または引数が欠落しているスイッチは、エラーとして認識され、報告されます」 。
位置パラメーター(例2-$ @、$#など)は、スペースが含まれている場合は明らかに機能しませんが、通常のパラメーターと長いパラメーター(-pおよび--longparam)を認識できます。ネストされた引用符を使用してパラメーターを渡すと、両方のメソッドが失敗することに気付きました("これは"" quotes" "の例です。")。これらの3つのコードサンプルのうち、コマンドライン引数を処理する方法を最もよく示しているのはどれですか?getopt関数はgurusによって推奨されていないので、私はそれを避けようとしています!
例1:
#!/bin/bash
for i in "$@"
do
case $i in
-p=*|--prefix=*)
PREFIX=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-s=*|--searchpath=*)
SEARCHPATH=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-l=*|--lib=*)
DIR=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
--default)
DEFAULT=YES
;;
*)
# unknown option
;;
esac
done
exit 0
例2:
#!/bin/bash
echo ‘number of arguments’
echo "\$#: $#"
echo ”
echo ‘using $num’
echo "\$0: $0"
if [ $# -ge 1 ];then echo "\$1: $1"; fi
if [ $# -ge 2 ];then echo "\$2: $2"; fi
if [ $# -ge 3 ];then echo "\$3: $3"; fi
if [ $# -ge 4 ];then echo "\$4: $4"; fi
if [ $# -ge 5 ];then echo "\$5: $5"; fi
echo ”
echo ‘using $@’
let i=1
for x in $@; do
echo "$i: $x"
let i=$i+1
done
echo ”
echo ‘using $*’
let i=1
for x in $*; do
echo "$i: $x"
let i=$i+1
done
echo ”
let i=1
echo ‘using shift’
while [ $# -gt 0 ]
do
echo "$i: $1"
let i=$i+1
shift
done
[/bash]
output:
bash> commandLineArguments.bash
number of arguments
$#: 0
using $num
$0: ./commandLineArguments.bash
using $@
using $*
using shift
#bash> commandLineArguments.bash "abc def" g h i j*
例3:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
exit 0