shell 函数,去掉传递进来参数开头的0

去除Bash参数前导零
#!/bin/bash
# 去掉传递进来参数开头的0(也可能是多个0),如果不去掉bash会把这个值当做8进制来解释
strip_leading_zero ()
{
    shopt -s extglob             # 打开扩展通配(globbing)
    local val=${1##+(0)}         # 使用局部变量,匹配最长连续一个或多个0
    shopt -u extglob             # 乇绽┱雇ㄅ洌╣lobbing)
    _strip_leading_zero=${val:-0} # 如果输入为0,那么返回0来替代空
}
strip_leading_zero 0003
echo ${_strip_leading_zero}
strip_leading_zero 0000

echo ${_strip_leading_zero}


echo `basename $PWD`  去掉当前目录前的"/"

echo "${PWD##*/}"

<think>我们需要创建一个简单的shell函数,实现两个数的相加。注意处理参数和基本错误检查。 函数名:add_two_numbers 功能:接受两个数字作为参数,输出它们的和。 考虑:如果参数不是数字,给出错误提示。 由于shell中默认是字符串,我们需要进行数值验证。 实现步骤: 1. 定义函数 add_two_numbers 2. 检查参数个数是否为2,否则报错 3. 检查两个参数是否都是数字(可以使用正则表达式) 4. 进行加法运算(注意:shell中整数和小数的处理不同,这里我们假设为整数,若需小数可以用bc) 5. 输出结果 注意:我们这里先处理整数的情况,如果需要小数,则使用bc计算,但题目没有明确,我们先按整数处理,然后考虑扩展性。 但是,题目没有明确是整数还是小数,所以我们可以设计成支持整数,如果用户输入小数则用bc处理。 我们可以这样判断:如果两个参数都是整数,则用$(( ))计算;如果其中一个是小数,则用bc计算。 不过,为了简单起见,我们可以统一使用bc,这样整数和小数都可以处理。 步骤: 1. 检查参数个数 2. 检查参数是否为数字(包括小数和负数),使用正则表达式:^[-+]?[0-9]+(\.[0-9]+)?$ 但是,shell的正则不支持?扩展,我们可以使用expr或awk,或者使用条件判断。 这里我们使用一种简单的方法:用变量赋值然后用grep检查。 由于不同shell版本(如bash)支持不同,我们使用bash,并且用grep -E(扩展正则)来检查。 但是,在函数中,我们可能不希望依赖外部命令,所以我们可以用bash的条件判断。 在bash中,我们可以使用[[ ... =~ ... ]]进行正则匹配。 因此,我们假设脚本运行在bash环境下。 具体实现: 函数定义: add_two_numbers() { if [ $# -ne 2 ]; then echo "错误:需要两个参数" return 1 fi # 定义正则表达式 local re='^[-+]?[0-9]+(\.[0-9]+)?$' if [[ $1 =~ $re && $2 =~ $re ]]; then # 使用bc计算,因为可能包含小数 echo "scale=2; $1 + $2" | bc # scale=2表示保留两位小数,如果不需要可以去掉,但整数不受影响 else echo "错误:两个参数都必须是数字" return 1 fi } 但是,注意:正则表达式中的括号需要转义,在bash的[[ =~ ]]中,括号不需要转义?实际上,在bash3.2以上版本,模式中的括号需要转义或者使用引号避免被解析为分组。 我们这里使用单引号将正则表达式定义,然后使用,这样括号不需要转义?实际上,在bash的条件表达式中,使用引号包裹的正则表达式字面量,其中的括号不需要转义。 但是,为了确保可移植性,我们使用双引号?不,使用单引号定义正则,然后变量引用,这样在匹配时,括号需要转义吗?测试一下: 在bash中,我们定义:re='^[-+]?[0-9]+(\.[0-9]+)?$',然后使用[[ $1 =~ $re ]] 这样,括号不需要转义,因为变量传递的是字符串。 但是,注意:在bash中,如果正则表达式中有括号,且没有用引号引起,那么括号会被解析为分组。而我们这里用变量存储正则,所以不需要转义。 但是,为了确保正确,我们可以写一个测试。 另外,我们也可以考虑使用算术运算,但只能处理整数。 考虑到题目没有明确,我们按照支持小数来实现。 但是,如果用户输入的是整数,bc也会正确计算,所以没问题。 另外,注意负数的情况,我们的正则支持负号。 最后,我们输出结果。 但是,注意:bc需要安装,通常系统都有,但为了健壮性,如果bc不存在,可以回退到整数计算(但这样小数就不支持了),我们这里假设bc存在。 如果不想依赖bc,我们可以判断两个参数是否都是整数,如果是则用算术运算,否则再用bc。但这样代码复杂,我们直接使用bc。 因此,最终代码如下: 注意:我们使用echo输出到bc,然后bc计算结果。 但是,如果用户输入的数字很大,或者小数位数很多,我们可以通过scale控制小数位数,这里设置为2位,如果不需要,可以设置为0?但是设置为0的话,小数部分会被截断。所以,我们可以不设置scale,这样整数输出整数,小数输出小数(默认是整数,除非有小数运算)。或者,我们可以不指定scale,这样默认是0,即整数运算。所以,为了支持小数,我们必须设置scale?实际上,如果两个数都是整数,那么结果也是整数,不需要小数位;如果有一个是小数,那么结果会保留小数部分,但默认是整数部分?bc的默认scale是0,所以小数部分会被截断。因此,我们需要设置scale为两个数中小数位数最多的那个?这样太复杂。我们可以设置一个较大的scale,比如10,然后输出时去掉末尾的0? 但是,题目只是要求两数相加,我们直接输出结果,不要求格式。所以,我们可以不设置scale,这样整数加整数正常,整数加小数会保留小数部分吗?不会,因为scale=0,所以小数部分会被截断。因此,我们必须设置scale。 如何设置scale?我们可以取两个数中各自的小数部分长度,然后取最大值?这样比较麻烦。我们可以设置一个固定值,比如10,然后通过sed去除多余的0? 或者,我们可以这样:先计算,然后通过printf格式化输出,但这样又依赖其他命令。 为了简单,我们设置scale=10,然后通过bc计算,然后去除末尾的0和多余的小数点。 但是,这会使整数也输出为小数形式(如5变成5.0000000000)。所以,我们可以用正则去除多余的0。 但是,这样处理在shell函数中会变得复杂。因此,我们决定:如果两个数都是整数,则用整数计算,否则用bc计算并设置scale=10,然后去除多余的0。 但是,这样函数会变得很长。我们权衡一下,直接输出bc的结果,不处理多余的0,因为bc默认会去掉末尾0?测试一下: 在bash中: echo "5.1 + 10" | bc -> 输出15.1 (因为scale=0,所以小数部分被忽略?实际上,bc的加法运算的scale由操作数的scale决定?) 实际上,bc的加法运算的scale是操作数中最大的小数位数。例如: echo "5.1 + 10" | bc -> 15.1 echo "5.10 + 10.000" | bc -> 15.10 但是,如果我们不设置scale,bc会使用默认的0,所以对于整数加法,不会出现小数,对于小数加法,会保留操作数的小数位数。 所以,我们不需要设置scale,直接让bc计算即可。这样整数输出整数,小数输出小数,并且会保留原小数位数(但不会补0,比如5.1+1.2=6.3,而5.10+1.2=6.30?不会,bc会去掉末尾的0,所以5.10+1.2=6.3)。 因此,我们不需要设置scale,直接计算。 修正:使用bc而不设置scale。 所以,函数内部: if [[ $1 =~ $re && $2 =~ $re ]]; then echo "$1 + $2" | bc else echo "错误:两个参数都必须是数字" return 1 fi 但是,注意:bc不支持科学计数法,我们的正则也不支持科学计数法,所以符合要求。 因此,最终函数如下: 注意:如果用户输入的数字很大,bc可以处理大数。 另外,如果用户输入的是负数,bc也能处理。 所以,我们写一个完整的shell脚本示例: 注意:函数定义后,如何调用?题目没有要求调用,所以只写函数即可。 但是,为了演示,我们可以写一个调用示例,但题目只要求写函数。所以,我们只提供函数。 但是,注意:正则表达式在bash中,如果使用双中括号,那么=~右边的正则表达式变量如果包含引号,则引号会被当作正则的一部分,所以我们的正则表达式变量不要用引号括起来。 所以,我们这样写: re='^[-+]?[0-9]+(\.[0-9]+)?$' 然后使用 [[ $1 =~ $re ]] 这样,如果$1是"+123.45",那么匹配成功。 但是,注意:有些系统可能不支持这种正则表达式,所以我们确保使用bash。 在脚本开头,我们可以指定:#!/bin/bash 但是,题目没有要求脚本完整,只要求函数,所以我们可以不写shebang。 最终答案: 注意:函数名和参数,我们按照题目要求。 另外,如果参数不是数字,返回非0状态。 因此,我们这样写:</think>### Shell 脚本实现两数相加函数 ```bash #!/bin/bash # 定义两数相加函数 add_numbers() { # 参数校验 if [ $# -ne 2 ]; then echo "错误:需要且仅需两个参数" return 1 fi # 数字格式校验 re='^[-+]?[0-9]+([.][0-9]+)?$' if ! [[ $1 =~ $re ]]; then echo "错误:'$1' 不是有效数字" return 1 fi if ! [[ $2 =~ $re ]]; then echo "错误:'$2' 不是有效数字" return 1 fi # 执行加法运算(支持整数和小数) result=$(echo "$1 + $2" | bc) echo "计算结果:$1 + $2 = $result" } # 函数调用示例: # add_numbers 25 17.5 # add_numbers -3 8.2 ``` #### 功能说明: 1. **参数校验**:严格检查输入参数数量 2. **格式验证**:使用正则表达式验证数字格式(支持整数、小数、正负数) 3. **精确计算**:通过 `bc` 命令进行精确数值计算(避免浮点精度问题) 4. **错误处理**:提供明确的错误提示信息 #### 使用示例: ```bash # 整数相加 $ add_numbers 25 17 计算结果:25 + 17 = 42 # 小数相加 $ add_numbers 3.14 2.86 计算结果:3.14 + 2.86 = 6.00 # 负数计算 $ add_numbers -5 3.2 计算结果:-5 + 3.2 = -1.8 # 错误输入示例 $ add_numbers 5 "abc" 错误:'abc' 不是有效数字 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值