如何从数字(bash 脚本中的变量)中提取第一个数字?

如何从数字(bash 脚本中的变量)中提取第一个数字?

假设变量numbers=$@where$@来自用户输入。用户输入./script.sh 901.32.02,我想获取第一个数字9并将其存储在另一个变量中。我怎样才能做到这一点?我被告知要做

  for n in `seq 1 $count`
    do var=${numbers[0]}
  done

echo $var但如果我而不是仅仅打印出整个输入9

答案1

在 Bash 中,您可以使用以下命令提取第一个字符参数扩展:

${parameter:offset:length}

例子:

$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9

答案2

numbers='901.32.02'
firstdigit="${numbers:0:1}"

printf 'The first digit is "%s"\n' "$firstdigit"

上面的结果是

The first digit is "9"

${numbers:0:1}中的参数扩展为bash您提供从字符串开头(偏移量为零)开始长度为 1 的子字符串。这是一个bash特定的参数替换(也在其他一些 shell 中,但不在 POSIX 标准中)。

在 POSIX shell 中,您也可以这样做

firstdigit=$( printf "%s\n" "$numbers" | cut -c 1 )

这将用于cut仅返回第一个字符。

或者,使用标准参数扩展,

firstdigit="${numbers%${numbers#?}}"

这首先用于${numbers#?}创建一个带有第一个数字的字符串已删除$numbers,然后它从using末尾删除该字符串${numbers%suffix}(其中suffix是第一次扩展的结果)。


上面假设 的第一个字符$numbers实际上是一个数字。如果不是,那么您必须首先从值的开头删除非数字:

numbers=$( printf '%s\n' "$numbers" | sed 's/^[^0-9]*//' )

或者,

numbers="${numbers#${numbers%%[0-9]*}}"

${numbers[0]}如果每个字符都是一个单独的元素,那么就会起作用大批 numbers(如果第一个字符是数字)。由于numbers不是数组,因此它相当于$numbers

答案3

您也可以使用下面的方法

cat script.sh

   #!/bin/bash
echo $1 | awk '{print substr($1,1,1)}'



 sh script.sh 90

Where 90 is the user input

输出是9

答案4

如果您只想检测数字(而不是其他字符类型),您应该使用简单的正则表达式。

[[ ${numbers} =~ ^([[:digit:]]) ]] && var=${BASH_REMATCH[1]}

$var 中是一个数字或者它是空的(甚至没有声明)。

相关内容