![如何从数字(bash 脚本中的变量)中提取第一个数字?](https://linux22.com/image/130737/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%95%B0%E5%AD%97%EF%BC%88bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%EF%BC%89%E4%B8%AD%E6%8F%90%E5%8F%96%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%95%B0%E5%AD%97%EF%BC%9F%20.png)
假设变量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 中是一个数字或者它是空的(甚至没有声明)。