shell脚本系列:5、shell参数
文章目录
- 3. 其它
shell的命令行参数 | ||
由特殊字符表示的参数。 |
参数是存储值的实体。它可以是一个名称、一个数字或下面列出的特殊字符之一。变量是由名称表示的参数。变量有一个值和零个或多个属性。属性是使用declare builtin命令分配的(请参阅Bash Builtins中declare builtin的描述)。
如果给参数赋值,则设置该参数。空字符串是一个有效值。一旦设置了一个变量,就只能使用unset
builtin命令来取消它的设置。
变量可以通过表单的语句赋值:
如果value没有给定,变量将被赋值为空字符串。所有值都要进行波浪号展开、参数和变量展开、命令替换、算术展开和引号删除(详细说明如下)。如果变量有整数属性集,那么value将作为算术表达式计算,即使KaTeX parse error: Expected 'EOF', got '#' at position 75: …sh/bashref.html#̲Arithmetic-Expa…@"之外。不进行文件名扩展。赋值语句也可以作为别名、声明、排版、导出、只读和本地内置命令(声明命令)的参数出现。在POSIX模式下(请参阅Bash POSIX模式),这些内置命令可能出现在内置命令的一个或多个实例之后,并保留这些赋值语句属性。
在赋值语句将值赋给shell变量或数组索引(参见数组)的上下文中,’+='运算符可用于向变量的前一个值追加或添加。这包括内置命令的参数,比如声明接受赋值语句(声明命令)。当+=应用于已设置整数属性的变量时,value将作为算术表达式计算,并添加到变量的当前值,该值也将被计算。+ =应用于数组变量时使用复合赋值(参见数组),变量s的值不是设置(当使用=),和新值添加到数组开始在一个年代最大索引大于数组(索引数组),或作为额外添加一个关联数组的键-值对。当应用于字符串值变量时,value将展开并附加到变量的值后面。
可以使用-n选项为declare
或local
内置命令(请参阅Bash Builtins)赋予变量nameref属性,以创建一个nameref或对另一个变量的引用。这允许对变量进行间接操作。当nameref变量被引用、赋值、取消设置或其属性被修改(而不是使用或更改nameref属性本身)时,该操作实际上是对由nameref变量值指定的变量执行的。nameref通常在shell函数中用于引用一个变量,该变量的名称作为函数的参数传递给函数。例如,如果一个变量名作为它的第一个参数传递给一个shell函数,则运行:
在函数内部创建一个nameref变量ref,其值是作为第一个参数传递的变量名。对ref的引用和赋值,以及对其属性的更改,都被视为对名称为$1
的变量的引用、赋值和属性修改。
如果for循环中的控制变量具有nameref属性,则单词列表可以是shell变量列表,在执行循环时,将依次为列表中的每个单词建立名称引用。数组变量不能被赋予nameref属性。但是,nameref变量可以引用数组变量和下标数组变量。可以使用-n选项来取消Namerefs的设置(参见Bourne Shell内置)。否则,如果unset以nameref变量的名称作为参数执行,则nameref变量引用的变量将被取消设置。
1. 位置参数
位置参数是由一个或多个数字表示的参数,而不是单个数字0
。位置参数是在调用shell时从shell的命令行参数中分配的,可以使用set
builtin命令重新分配。位置参数N可以被引用为N。位置参数不能用赋值语句赋值。set和shift内置命令用于设置和取消它们(请参阅Shell内置命令)。当执行shell函数时,位置参数被临时替换(参见shell函数)。
当展开包含多个数字的位置参数时,必须将其括在大括号中。
比如$0、$1、$2等,类似c/python中常用的传递的命令行参数值。
2. 特殊参数
shell对几个参数进行了特殊处理。这些参数只能被引用;不允许分配给他们。
2.1 参数*
(KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲)扩展为位置参数,从一个开始。…*”等价于“$1c$2c…”,其中c是IFS变量值的第一个字符。如果未设置IFS,参数之间用空格隔开。如果IFS为空,则连接参数而不使用中间分隔符。
2.2 参数@
(@”等价于“$1”“@"和$@将不存在(也就是说,它们将被删除)。
2.3 参数#
($#)扩展为十进制的位置参数数目。
2.4 参数?
($ ?)展开到最近执行的前台管道的退出状态。
2.5 参数-
($-,一个连字符)。展开为调用时指定的当前选项标志,由set builtin命令指定,或由shell本身设置的选项标志(例如-i选项)。
2.6 参数$
($$)展开为shell的进程ID。在()子shell中,它展开为调用shell的进程ID,而不是子shell的。
2.7 参数!
($!)展开到最近放置到后台的作业的进程ID,无论是作为异步命令执行还是使用bg
内置(参见作业控制内置)。
2.8 参数0
($0)展开为shell或shell脚本的名称。这是在shell初始化时设置的。如果使用命令文件(请参阅Shell脚本)调用Bash,则将$0设置为该文件的名称。如果Bash以-c选项启动(参见调用Bash),那么$0将被设置为要执行的字符串后的第一个参数(如果有的话)。否则,它将被设置为用于调用Bash的文件名,如参数0所示。
3. 其它
这个其实放在shell脚本后面比较好一些,主要是传递命令行参数相关的内容。
这里创建一个简单的demo.sh: