저는 프로젝트 폴더를 한 위치에서 다른 위치로 복사하는 Git Bash 유틸리티를 작성 중입니다. 사용자는 프로젝트를 여러 대상에 복사하려고 할 수 있지만 스크립트 실행당 하나의 위치만 허용됩니다. 지금까지의 논리는 이렇습니다.
#!/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
또한 응답이 정수인지 확인해야 합니다. 읽기 프롬프트에 0으로 평가되는 문자열로 응답하여 배열의 첫 번째 요소를 제공할 수 있기 때문입니다.
다음을 사용하는 것도 고려할 수 있습니다.선택하다여기:
#!/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 조건식
하지만 그것은 잘못된 것입니다.
숫자로 인덱스된 배열에서 인덱스는 산술 표현식으로 평가됩니다. 산술 표현식에서 "알몸" 문자열은 다음과 같이 처리됩니다.쉘 변수변수가 비어 있거나 설정되지 않은 경우 0 값으로 처리됩니다.
데모:
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