동일하지 않을 때마다 i
및 of라는 이름의 두 개의 j
중첩 반복자를 인쇄하고 싶습니다 . for loops
에러 메시지:
예상치 못한 마커 'then' 근처에 구문 오류가 있습니다.
#!/bin/bash
read n
array=()
for i in `seq 1 $n`
do
read num
array+=$num
done
count=0
count2=0
countmax=0
for i in `seq 1 $n`; do
for j in `seq 1 $n`; do
if [ $i -ne $j ]; then
echo $i $j
fi
done
done
내가 뭘 잘못했나요?
답변1
내가 뭘 잘못했나요?
순서대로 나열되지 않은 이름,
#!/bin/bash
첫 번째 줄에 해당하는 항목이 없습니다 .- 실패한 실제 스크립트를 게시하지 않은 것 같습니다. (여기의 내용은 문법적으로 정확합니다.)
"$n"
대신 큰따옴표로 변수를 인용하지 않습니다$n
.- 평가 대신 쓸모없는 백틱을 사용합니다
$( ...)
. - 아직 코드를 테스트하지 않았습니다.https://shellcheck.net/
- 읽기 쉽도록 코드 블록을 들여쓰지 않습니다.
- 배열에 요소를 추가하려면 를 사용하세요
array+=($num)
. 코드의 내용은 마지막 요소에 대한 문자열 연결입니다. - (새) 첫 번째 블록에서는 요소 (0 .. n-1)에 할당하고 나중에 요소 (1 .. n)을 사용합니다.
- (새) 두 번째 블록에서는 배열 요소가 아닌 인덱스의 불평등을 비교합니다. 비교
"${array[$i]}" -ne "${array[$j]}"
(또는(( ... ))
건설 의 경우) 를 의미합니까array[i] != array[j]
?
(이들 중 일부는 기본 코딩 규칙이 아니라 좋은 사례라는 점을 지적하고 싶습니다.)
내 제안이 적용된 코드는 다음과 같습니다.
#!/bin/bash
read -p 'Number of elements: ' n
array=(0) # We don't use element zero
for i in $(seq "$n")
do
read -p 'Element: ' num
array+=($num)
done
for i in $(seq "$n")
do
for j in $(seq "$n")
do
# Compare the array elements rather than the indices
# Is this what you intended?
if (( array[i] != array[j] ))
then
echo "${array[$i]} ${array[$j]}"
fi
done
done
답변2
seq
또한 for 루프를 사용하여 사용을 제거합니다.
#!/bin/bash
read -p 'Number of elements: ' n
array=(0)
for (( i = 1; i <= n; i++ ))
do
read -p 'Element: ' num
array+=("$num")
done
for (( i = 1; i <= n; i++ ))
do
for (( j = 1; j <= n; j++ ))
do
(( array[i] != array[j] )) && echo "${array[i]} ${array[j]}"
done
done