shell脚本系列:5、shell参数


文章目录

• ​​Positional Parameters​

shell的命令行参数

• ​​Special Parameters​

由特殊字符表示的参数。

参数是存储值的实体。它可以是一个名称、一个数字或下面列出的特殊字符之一。变量是由名称表示的参数。变量有一个值和零个或多个属性。属性是使用declare builtin命令分配的(请参阅​​Bash Builtins​​中declare builtin的描述)。

如果给参数赋值,则设置该参数。空字符串是一个有效值。一旦设置了一个变量,就只能使用​​unset​​ builtin命令来取消它的设置。

变量可以通过表单的语句赋值:

name=[value]

如果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函数,则运行:

declare -n ref=$1

在函数内部创建一个nameref变量ref,其值是作为第一个参数传递的变量名。对ref的引用和赋值,以及对其属性的更改,都被视为对名称为​​$1​​的变量的引用、赋值和属性修改。

如果for循环中的控制变量具有nameref属性,则单词列表可以是shell变量列表,在执行循环时,将依次为列表中的每个单词建立名称引用。数组变量不能被赋予nameref属性。但是,nameref变量可以引用数组变量和下标数组变量。可以使用-n选项来取消Namerefs的设置(参见​​Bourne Shell内置​​)。否则,如果unset以nameref变量的名称作为参数执行,则nameref变量引用的变量将被取消设置。

1. 位置参数

位置参数是由一个或多个数字表示的参数,而不是单个数字​​0​​​。位置参数是在调用shell时从shell的命令行参数中分配的,可以使用​​set​​​builtin命令重新分配。位置参数N可以被引用为shell脚本系列:5、shell参数_shellN。位置参数不能用赋值语句赋值。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 参数@

(shell脚本系列:5、shell参数_shell_02@”等价于“$1”“shell脚本系列:5、shell参数_数组_03@"和$@将不存在(也就是说,它们将被删除)。

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:

#! /usr/bin/bash

echo $*
echo $@
echo $#
echo $?
echo $-
echo $$
echo $!
echo $0
echo $1
echo $2
zy@LS2-R910CQQT:~/work$ ./demo.sh 1 2 3
1 2 3
1 2 3
3
0
hB
1742

./demo.sh
1
2