私はプロジェクトフォルダをある場所から別の場所にコピーするGit Bashユーティリティを作成しています。ユーザーはプロジェクトを複数のターゲットにコピーしようとしますが、スクリプト実行ごとに1つの場所しか許可されません。これまでの論理はこうです。
#!/bin/bash
# declare and initialize variables
source="/z/files/development/xampp/code/htdocs/Project7"
targets[0]="/z/files/development/xampp/code/htdocs/test/$(date +'%Y_%m_%d')"
targets[1]="/c/users/knot22/desktop/temp_dev/$(date +'%Y_%m_%d')"
# display contents of variables to user
echo "source " $source
echo -e "\nchoice \t target location"
for i in "${!targets[@]}"; do
echo -e "$i \t ${targets[$i]}"
done
echo
# prompt user for a target
read -p "Enter target's number for this copy operation: " target
今まではそんなに良くなった。次に、if
ユーザーが入力した値があるかどうかを確認するステートメントをtarget
作成したいと思いますtargets
。 PHPでは、array_key_exists($target, $targets)
Bashの対応する値があります。
答え1
以下を使用して、配列要素が空であるか空でないことを確認できます。
expr='^[0123456789]+$'
if [[ $target =~ $expr && -n "${targets[$target]}" ]]; then
echo yes
else
echo no
fi
また、応答が整数であることを確認する必要があります。これは、読み取りプロンプトでゼロと評価される文字列で応答して、配列の最初の要素を提供できるためです。
以下を使用することも検討できます。選ぶここで:
#!/bin/bash
# declare and initialize variables
source="/z/files/development/xampp/code/htdocs/Project7"
targets[0]="/z/files/development/xampp/code/htdocs/test/$(date +'%Y_%m_%d')"
targets[1]="/c/users/knot22/desktop/temp_dev/$(date +'%Y_%m_%d')"
select i in "${targets[@]}" exit; do
[[ $i == exit ]] && break
echo "$i which is number $REPLY"
done
答え2
TL;DR この回答は間違っていますが、その理由を説明しました。
私は書いた:
使用できる
-v
if [[ -v targets[$target] ]]; then ...
次から録音6.4 Bash条件式
しかし、それは間違っています。
数値で索引付けされた配列では、索引は算術式として評価されます。算術式では、「裸」文字列は次のように処理されます。シェル変数変数が空であるか設定されていない場合は、ゼロ値として扱われます。
デモ:
targets=(zero one two)
target=2
[[ -v targets[target] ]] && echo "${targets[target]}" || echo n
# ==> two
target="x"
[[ -v targets[target] ]] && echo "${targets[target]}" || echo n
# ==> zero
しかし、同じ変数がある場合名前〜のように値、$target
それから:
x=1
[[ -v targets[target] ]] && echo "${targets[target]}" || echo n
# ==> one