2

私はbashが初めてで、インターネット上のどこにも解決策が見つからないという問題があります。

自分でプログラミングなどを試みる前に、このような状況に対処するための標準的な方法を確認したいと思います。

基本的に、getopts を配列にキャプチャしたいと思います...

私は十分に明確であるかどうかわからないので、次の PHP の例を見てみましょう。

http://www.test.com/index.php?a=1&b=2

<?php
function getParams() {
return $_GET[];
}
?>

これは私が欲しいものです: myscript -a 1 -b 2

これまでのところ、私が見つけた getopts のすべての言及は、私が何を取得しようとしているのかを正確に知る必要があることを暗示していました。

while getopts a:b: option
do
  case "${option}"
    in
      a) a=${OPTARG};;
      b) b=${OPTARG};;
  esac
done

これらのオプションが何であるかに関係なく、スクリプトに渡されるすべての引数の連想配列を持つことができる方法はありますか?いつでも次のようなことができます:

OPTS = get_params

echo $OPTS[@]

そして、私は自分自身の検証などを行うことができました...

明らかな何かが欠けている場合はもう一度申し訳ありません。私は本当にbashに慣れていないので、どこから始めればよいか助けやガイダンスをいただければ幸いです。

事前にどうもありがとうございました。

4

2 に答える 2

1

単に:

declare -A myopts
while getopts cqz:b:a: OPTNAM ;do
    myopts[$OPTNAM]=$OPTARG
  done

テスト:

set -- -a 4 -b 23 -c -q -- file test

declare -A myopts
while getopts cqz:b:a: OPTNAM ;do
    myopts[$OPTNAM]=$OPTARG
  done

set | grep ^myopts=
myopts=([a]="3" [b]="3" [c]="" [q]="" )

echo ${@:$OPTIND}
file test

[ ${myopts[c]+.} ] && echo switch c present
switch c present


for sw in c q z;do
    echo switch $sw $(
        [ ${myopts[$sw]+.} ] && echo present || echo absent )
  done
switch c present
switch q present
switch z absent

echo ${myopts[a]}
3
于 2012-11-11T17:18:08.087 に答える
0

次の行に沿って進むことができます:

#!/bin/bash

declare -A my_opts

while (($#)); do
   case $1 in
      -- )
         shift
         break
         ;;
      -* )
         my_opts[${1#-}]=$2
         shift 2
         ;;
      * )
         break
         ;;
   esac
done

for k in "${!my_opts[@]}"; do
   echo "$k => ${my_opts[$k]}"
done

# At this point, you still have the remaining arguments in $@

echo "Arguments left: ${@:-(none)}"

# End of script #

test_argsこのスクリプトを呼び出してchmod +x test_args. 次に (この過度に単純化された方法の副作用を示します):

$ ./test_args -a 1 -b 2
a => 1
b => 2
Arguments left: (none)

$ ./test_args -a 1 -- -b 2
a => 1
Arguments left: -b 2
$ ./test_args -a 1 foo -b 2
a => 1
Arguments left: foo -b 2

$ ./test_args --a 1 -b 2
-a => 1
b => 2
Arguments left: (none)

$ # And a bad one (with this simplified version):
$ ./test_args -a -- foo
-a => --
Arguments left: foo
于 2012-11-11T17:12:20.103 に答える