배열에 인덱스가 있는지 테스트하는 방법

배열에 인덱스가 있는지 테스트하는 방법

저는 프로젝트 폴더를 한 위치에서 다른 위치로 복사하는 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

관련 정보