数字と文字配列のコンポーネントが互いに連続しているかどうかを数字に基づいて決定する方法は?

数字と文字配列のコンポーネントが互いに連続しているかどうかを数字に基づいて決定する方法は?

内容を持つ配列があります:、、、、、、${array[0]}="h4"そしてこの配列の数字(4、2、7、1、3)が互いに成功することを${array[1]}="q2"確認したいと思います。これを行う最良の方法は何ですか?${array[2]}="s7"${array[3]}="r1"${array[4]}="h3"

答え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

数字には、2 文字目から始まる複数桁の数字がn許可されます。sort

編集する:またはより短く、

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

答え2

以下のコードは、「最後の」変数を初期化してから配列を繰り返し(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に最初の/先頭の文字を削除して各要素を1行に印刷するように依頼してから、パイプに接続して入力が揃っているかどうかを尋ねsortます。

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

関連情報