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)
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。
您也可以使用下面的方法
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