ユーザー入力後、配列で選択した変数の拡張値に対して操作を実行したいと思います。これが私が意味するものです:
$ ./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
提供されたスクリプトでは、$1
anにはオプション名が含まれ、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