숫자와 문자 배열의 구성 요소가 서로 연속적인지 여부를 숫자를 기준으로 결정하는 방법은 무엇입니까?

숫자와 문자 배열의 구성 요소가 서로 연속적인지 여부를 숫자를 기준으로 결정하는 방법은 무엇입니까?

내용이 있는 배열이 있습니다: ${array[0]}="h4", ${array[1]}="q2", ${array[2]}="s7", , ${array[3]}="r1", ${array[4]}="h3"그리고 이 배열의 숫자(4, 2, 7, 1, 3)가 서로 성공하는지 확인하고 싶습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?

답변1

다음과 같은 최근 질문에 대한 답변을 배포할 수 있습니다.

$ ARR=(h4 q2 s7 r1 h3)
$ SA=( $(IFS=$'\n'; echo "${ARR[*]}" | sort -k1.2n) )
$ [ "${ARR[*]}" == "${SA[*]}" ] && echo in seq || echo out of seq
out of seq

숫자에는 두 번째 문자부터 시작하는 여러 자리 숫자가 n허용됩니다 .sort

편집하다:아니면 더 짧게,

( IFS=$'\n'; [ "${ARR[*]}" == "$(sort -k1.2n <<< "${ARR[*]}" )"  ] )  && echo in seq || echo out of seq

답변2

아래 코드는 "마지막" 변수를 초기화한 다음 배열을 반복하고(두 번째 요소에서 시작) 해당 요소가 이전 요소보다 작은지 확인합니다. 그렇다면 코드는 실패 메시지를 표시하고 루프를 중지합니다.

lastone=${array[0]:1}
for((i=1; i < ${#array[@]}; i++))
do
  if (( "${array[i]:1}" < "$lastone" ))
  then
    echo failure
    break
  fi
  lastone=${array[i]:1}
done

또는 bash에게 첫 번째/선두 문자를 제거한 채 각 요소를 한 줄에 인쇄하도록 요청한 다음 파이프로 연결하여 sort입력이 정렬되었는지 물어보세요.

if printf '%d\n' "${array[@]/#?/}" | sort -cn 2>/dev/null
then
  echo is sorted
else
  echo is not sorted
fi

관련 정보