정수 배열이 주어지면 특정 목표에 합산되는 두 숫자의 인덱스를 반환합니다.
각 입력에 대한 솔루션이 있으며 동일한 요소를 두 번 사용할 수 없다고 가정할 수 있습니다.
예: 주어진 숫자 = [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
.
$[ . . . ]
다음과 같은 오래된 산술 평가 구문을 볼 수 있습니다 .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[@]}"
구문을 사용하여 키 목록을 가져옵니다.