連想配列

連想配列

ユーザー入力後、配列で選択した変数の拡張値に対して操作を実行したいと思います。これが私が意味するものです:

$ ./myscript.sh url2


#!/bin/bash

array=(Sigil wp2epub csskit)

Sigil       =   "https://github.com/Sigil-Ebook/Sigil.git"
csskit      =   "https://github.com/mattharrison/epub-css-starter-kit.git"
wp2epub     =   "https://github.com/mrallen1/wp2md.git"

if [ -z $1 ]; then
  echo "This script needs at least one parameter!"
  exit 1
fi

if [ $1 = Sigil ]; then
  ans=$Sigil # expanded
elif [ $1 = csskit ]; then
  ans=$csskit # expanded
elif [ $1 = wp2epub ]; then
  ans=$wp2epub # expanded
else
  echo "Please inform one of \
        Sigil, csskit or wp2epub!"
fi

git clone $ans

説明する:

スクリプトはユーザー入力($ 1)を確認し、それを可能な変数の配列と比較し、見つかった場合はその変数の拡張値を回答として取得し、拡張値(変数名ではなく)を使用します。

数日間努力しましたが、限られたbashスクリプト技術だけでは十分ではありません。

よろしくお願いします。


@terdon要求に応じて:ユーザーに人間に優しい配列の変数名を教えてください。

これらの変数は、実際にはgithub(git clone)から取得し、再コンパイルして再インストールする必要があるパッケージの名前です。

実際の使用量は次のとおりです。

$ ./update.sh Sigil # Sigil is one of the variables

答え1

連想配列を使用します。

#!/bin/bash

declare -A url
url=( [url1]="http://www.google.com"
      [url2]="http://www.yahoo.com"
      [url3]="http://www.bing.com"
    )

if [[ -z $1 ]] ; then
    echo "This script needs at least one parameter!"
    exit 1
elif [[ -z ${url[$1]} ]] ; then
    echo 'Unknown option'
    exit 1
fi

echo "Let's search ${url[$1]}."

答え2

提供されたスクリプトでは、$1anにはオプション名が含まれ、anには$arrayオプション値が含まれています。要求に応じて拡張変数で結果を取得するには、次の$ansオプションがあります。

評価する

eval:たとえば、$ 1を展開してansにSigil割り当てます。$Sigil

eval ans\=\"\$\{"$1"\}\"

ただし、これは$1変数の1ワードラベルであると仮定します。入力に他のコンテンツがある場合は評価できます。より強力な解決策は、${array[i]}配列の内容がスクリプトによって制御されるため、evalの代わりに代替を使用することです。

間接的な

Bashの同様のイディオム${!1}はvarが指す値を得ることですが$1、これが私たちに必要なものです。もう一度強く使用してください(${array[i]}一致するものが見つかった場合:$array[i]

a="array[i]"; ans="${!a}"

連想配列

ただし、配列キーと配列値に連想配列を使用すると、すべての評価と間接の問題を回避できます。

これにより、正しい値を簡単に見つけることができます。配列に値がある場合は有効な値です。配列にキー値がない場合、そのキーは無効です。

この概念に基づいたスクリプト全体は次のとおりです。

#!/bin/bash

[ $# -lt 1 ] && {  echo "This script needs at least one parameter!"; exit 1; }

declare -A a
    a=(
    [Sigil]="https://github.com/Sigil-Ebook/Sigil.git"
    [wp2epub]="https://github.com/mattharrison/epub-css-starter-kit.git"
    [csskit]="https://github.com/mrallen1/wp2md.git"
    )


### Process an error while informing of options.
for    val in "${!a[@]}"
do     d=$d${d:+", "}$last
       last=$val
done
d="Please inform one of $d or $last"
SayError(){ echo "$d" >&2; exit 1; }



### Process a valid command execution.
ExecCmd(){ git clone "$ans"; }



### Process all arguments of script.
for    arg
do     unset ans                          ### unset result variable.
       printf -v ans '%s' "${a[$arg]}"    ### Assign result to "$ans"
       ${ans:+:} SayError                 ### If "$ans" is empty, process error.
       ${ans:+false} || ExecCmd           ### With valid "$ans" execute command.
done

これを削除するために SayError 関数を変更することができ、exit 1スクリプトはまだすべての引数を処理し、無効な値について警告します。

答え3

arr=($url1 $url2 $url3)

for i in ${arr[@]}; do
  if [[ $i == $1 ]] ;then
    ans=$i
    break
  fi
done

関連情報