getoptを使用するBashスクリプトは、「デフォルト」の2番目の引数に属します。

getoptを使用するBashスクリプトは、「デフォルト」の2番目の引数に属します。

Bashで小さなスクリプトを再学習していますが、getopt2番目のパラメータはcase

#! /bin/bash

LONG_OPTION_LIST=(
    "arg-a"
    "arg-b:"
    "arg-c:"
)
SORT_OPTION_LIST=(
    "a"
    "b:"
    "c:"
)
# Read the parameters
opts=$(getopt -q \
  --longoptions "$(printf "%s," "${LONG_OPTION_LIST[@]}")" \
  --name "$(basename "$0")" \
  --options "$(printf "%s" "${SORT_OPTION_LIST[@]}")" \
  -- "$@"
)
eval set -- "$opts"

echo "##$1##"
echo "##$2##"
echo "##$3##"
echo "##$4##"
echo "##$5##"
echo "#########"

argA=0
# It it is same a queue (process the head) because $1 and $2
for arg
do
    echo $1
    echo $2
    echo "--------"
    case "$arg" in
        --arg-a | -a)
            argA=1
            shift 1
            ;;
        --arg-b | -b)
            argB=$2
            shift 2
            ;;
        --arg-c | -c)
            argC=$2
            shift 2
            ;;
        *)
            echo "###$1###"
            echo "break"
            echo "_________"
            break
            ;;
    esac
done

echo "argA $argA"
echo "argB $argB"
echo "argC $argC"

いくつかの追加例:

user@pc:/tmp$ ./test.bash -a
##-a##
##--##
####
####
####
#########
-a
--
--------
--

--------
###--###
break
_________
argA 1
argB 
argC 
user@pc:/tmp$ ./test.bash -b 111
##-b##
##111##
##--##
####
####
#########
-b
111
--------
--

--------
###--###
break
_________
argA 0
argB 111
argC 
user@pc:/tmp$ ./test.bash -a -b 111
##-a##
##-b##
##111##
##--##
####
#########
-a
-b
--------
-b
111
--------
--

--------
###--###
break
_________
argA 1
argB 111
argC 
user@pc:/tmp$ ./test.bash -b 111 -a
##-b##
##111##
##-a##
##--##
####
#########
-b
111
--------
-a
--
--------
###-a###
break
_________
argA 0
argB 111
argC 

ベストアンサー1

for arg
do
    ...
    shift 1

ここでのシフトは好きなようには機能しないと思います。ループが繰り返す単語はループの先頭に設定され、その単語のシフトは影響しません。例えば

$ set -- aa bb cc; 
$ for x; do echo $x; shift; done
aa
bb
cc

"$@"ただし、各要素に対して一度ずつ移動するため、ループ後は空になります。


getoptループを使用するほとんどの例では、およびを見てwhile true手動で移動し、ターミネータが表示されたらループを終了します(util-linux getoptは常にターミネータを追加しますが、オプションではないことを手動で確認することもできます)。$1$2--

たとえば、参照してください。

おすすめ記事