当前位置: 首页 > Linux

Bash小技巧:介绍$0,$1,$2,$#,$@,$-,$-的含义

时间:2023-04-06 07:07:07 Linux

编写Linuxbashshell脚本时,$0,$1,$2,$#,$@,$*,$?和其他参数。下面详细解释这些参数的含义。假设执行./test.shabc这样的命令,可以使用如下参数获取一些值:$0对应./test.sh的值。如果执行./work/test.sh,则对应./work/test.sh的值,而不是只返回文件名本身的部分。$1会得到一个,即$1对应传递给脚本的第一个参数。$2会得到b,即$2对应传递给脚本的第二个参数。$3会得到c,即$3对应传递给脚本的第三个参数。$4、$5等参数的含义可以类推。$#会得到3,对应传入脚本的参数个数,统计的参数不包括$0。$@将得到"a""b""c",这是所有参数的列表,不包括$0。$*也将得到"a""b""c",它与$@具有相同的值。但是“$*”和“$@”是不同的。“$*”将所有参数组合成一个字符串,而“$@”将得到一个字符串参数数组。$?执行./test.shabc命令后可以得到返回值。执行前台命令后,可以使用$?立即获取命令的返回值。该命令可以是系统本身的命令、shell脚本或自定义的bash函数。在执行系统自带的命令时,$?对应于此命令的返回值。执行shell脚本时,$?对应于脚本调用exit命令返回的值。如果没有主动调用exit命令,默认返回0。执行自定义bash函数时,$?对应函数调用返回命令返回的值。如果没有主动调用return命令,默认返回0。下面的例子说明“$*”和“$@”的区别。假设有一个testparams.sh脚本,内容如下:#!/bin/bashforargin"$*";doecho"****:"$argdoneecho--------------forargin"$@";doecho"@@@@:"$argdone这个脚本分别遍历"$*"和"$@"展开的内容,打印出来。执行./testparams.sh脚本,结果如??下:$./testparams.shThisisatest****:Thisisatest-------------@@@@:这个@@@@:是@@@@:a@@@@:test可以看到"$*"只生成一个字符串,for循环只遍历一次。而“$@”产生多个字符串,for循环遍历多次,就是一个字符串参数数组。注意:如果传入的参数超过9个,不能用$10来引用第10个参数,而是用${10}来引用。即大于9的数字需要用大括号{}括起来。例如${10}表示获取第10个参数的值,写成$10,则无法获取第10个参数的值。其实$10就相当于${1}0,即先取$1的值,再取0。如果$1的值为“first”,那么$10的值就是“first0”。查看manbash中位置参数的说明如下:PositionalParameters位置参数是用一个或多个数字表示的参数,而不是单个数字0。位置参数是在调用shell时从参数中分配的,并且可以是使用set内置命令重新分配。位置参数不能赋值给赋值语句。执行shell函数时临时替换位置参数。当需要一个由多个数字组成的位置参数时,用大括号括起来。即最后一句提到,当position参数由多位数字组成时,需要用大括号{}将多位数字括起来。获取位置参数个数在bash中,可以使用$#获取传入命令行或传入函数的参数个数。需要注意的是,$#统计的参数个数不包括脚本本身的名称,也不包括函数的名称。比如执行./a.shab,那么$#就是2,不是3。查看manbash的说明如下:SpecialParameters#Expandstothenumberofpositionalparametersindecimal。可以看到,$#其实是扩展到位置参数个数,统计参数不包括$0。