如何根据数字确定数字和字母组合的数组的组成部分是否彼此连续?

如何根据数字确定数字和字母组合的数组的组成部分是否彼此连续?

我有一个包含内容的数组:${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

相关内容