16

数日間の調査の後、私はまだ.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
4

2 に答える 2

25

の使用がgetopt最も簡単だと思います。そうでなければトリッキーな引数の正しい処理を提供します。たとえば、コマンドラインでorgetoptとして指定された長いオプションへの引数を処理する方法を知っています。--arg=option--arg option

シェル スクリプトに渡された入力を解析する際に役立つのは、"$@"変数の使用です。との違いについては、bash の man ページを参照してください$@。これにより、スペースを含む引数を確実に処理できます。

簡単なコマンド ライン引数を解析するための s スクリプトの書き方の例を次に示します。

#!/bin/bash

args=$(getopt -l "searchpath:" -o "s:h" -- "$@")

eval set -- "$args"

while [ $# -ge 1 ]; do
        case "$1" in
                --)
                    # No more options left.
                    shift
                    break
                   ;;
                -s|--searchpath)
                        searchpath="$2"
                        shift
                        ;;
                -h)
                        echo "Display some help"
                        exit 0
                        ;;
        esac

        shift
done

echo "searchpath: $searchpath"
echo "remaining args: $*"

スペースと引用符が保持されていることを示すために、次のように使用されます。

user@machine:~/bin$ ./getopt_test --searchpath "File with spaces and \"quotes\"."
searchpath: File with spaces and "quotes".
remaining args: other args

の使用に関する基本的な情報は、ここgetoptで見つけることができます

于 2013-02-09T10:34:40.840 に答える