정수 배열이 주어지면 특정 목표에 합산되는 두 숫자의 인덱스를 반환합니다.

정수 배열이 주어지면 특정 목표에 합산되는 두 숫자의 인덱스를 반환합니다.

정수 배열이 주어지면 특정 목표에 합산되는 두 숫자의 인덱스를 반환합니다.

각 입력에 대한 솔루션이 있으며 동일한 요소를 두 번 사용할 수 없다고 가정할 수 있습니다.

예: 주어진 숫자 = [2, 7, 11, 15], 대상 = 9,

nums[0] + nums[1] = 2 + 7 = 9이므로 [0, 1]이 반환됩니다.

Bash에서 이것을 시도했지만 구문 오류로 인해 실패했습니다. 논리가 올바른지, 구문 오류가 있는지 알려주십시오.

#!/bin/bash
# Given an array of integers, return indices of the two numbers such 
# that they add up to a specific target.

read T
nums=("2" "7" "11" "15")

for i in ${nums[@]}
do
    for j in ${nums[@]}
    do
        if [ "$i" + "$j" == $T ]
            echo "i=$i"
            echo "j=$j"
            break
        fi
    done
done

답변1

if해당하는 것이 필요 하며 산술 테스트를 위해서는 1이then 필요합니다 .(( . . .))

if (( $i + $j == $T )); then

아니면 그 이후로

표현식 내에서 쉘 변수는 매개변수 확장 구문을 사용하지 않고도 이름으로 참조될 수도 있습니다.

다음과 같이 단순화할 수 있습니다.

if (( i + j == T )); then

SHELL GRAMMAR - Compound Commands하위 섹션을 참조하세요 man bash.


  1. $[ . . . ]다음과 같은 오래된 산술 평가 구문을 볼 수 있습니다 .

    if [ $[$i + $j] == $T ]; then
    

    또한 합법적입니다. 하지만 이는 더 이상 사용되지 않으며 새 스크립트에 사용해서는 안 됩니다.

답변2

for i in "${array[@]}"루프스루가치연관배열 1. 여기서와 같이 키(인덱스)를 반복하려는 경우에는 for in "${!array[@]}"에 있습니다 bash.

#! /bin/bash -
T=${1?Please pass a decimal integer number as argument}
nums=(2 7 11 15)
found=false

if [[ ! $T =~ ^-?[0123456789]+$ ]]; then
  printf >&2 '"%s" is not a valid integer number\n' "$T"
  exit 2
fi
  
for i in "${!nums[@]}"; do
  for j in "${!nums[@]}"; do
    if ((nums[i] + nums[j] == T)); then
      printf '%s\n' "i=$i nums[i]=${nums[i]}" "j=$j nums[j]=${nums[j]}"
      found=true
      break 2
    fi
  done
done
"$found"

인수로 전달된 입력 숫자의 유효성을 검사하는 것이 중요합니다. 그렇지 않으면 코드에 임의 명령 실행 취약점이 발생하게 됩니다.

또한 bash앞에 0이 붙은 숫자는 다음과 같이 이해됩니다.8진수따라서 010은 10이 아닌 8로 이해됩니다.


¹ bash 배열(예: ksh의 배열)희소 배열, 양의 정수로 제한된 키를 가진 연관 배열과 같습니다. 버전 4.0부터 bash는 키가 다음 순서로 제한되는 연관 배열도 지원합니다.하나NUL이 아닌 바이트 이상을 선언하고 declare -A동일한 "${!assoc[@]}"구문을 사용하여 키 목록을 가져옵니다.

관련 정보