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

Ras*_*had 5 shell scripting bash

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

  for n in `seq 1 $count`
    do var=${numbers[0]}
  done
Run Code Online (Sandbox Code Playgroud)

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

nxn*_*nev 11

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

${parameter:offset:length}
Run Code Online (Sandbox Code Playgroud)

例子:

$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 5

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

printf 'The first digit is "%s"\n' "$firstdigit"
Run Code Online (Sandbox Code Playgroud)

上面的结果是

The first digit is "9"
Run Code Online (Sandbox Code Playgroud)

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

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

firstdigit=$( printf "%s\n" "$numbers" | cut -c 1 )
Run Code Online (Sandbox Code Playgroud)

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

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

firstdigit="${numbers%${numbers#?}}"
Run Code Online (Sandbox Code Playgroud)

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


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

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

或者,

numbers="${numbers#${numbers%%[0-9]*}}"
Run Code Online (Sandbox Code Playgroud)

${numbers[0]}如果每个字符都是数组 numbers中的单独元素(并且第一个字符是数字),则可以工作。由于numbers不是数组,因此它相当于$numbers


Pra*_* BS 3

您也可以使用下面的方法

cat script.sh

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



 sh script.sh 90

Where 90 is the user input
Run Code Online (Sandbox Code Playgroud)

输出是9