shell脚本系列:5、shell参数

shell脚本系列:5、shell参数


Positional Parametersshell的命令行参数
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选项为declarelocal内置命令(请参阅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的命令行参数中分配的,可以使用setbuiltin命令重新分配。位置参数N可以被引用为 N , 或 者 当 N 由 单 个 数 字 组 成 时 被 引 用 为 {N},或者当N由单个数字组成时被引用为 NNN。位置参数不能用赋值语句赋值。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 开 始 。 在 执 行 分 词 的 上 下 文 中 , 这 将 把 每 个 位 置 参 数 展 开 为 一 个 单 独 的 词 ; 如 果 不 在 双 引 号 内 , 这 些 词 会 被 拆 分 。 在 不 执 行 分 词 的 上 下 文 中 , 这 扩 展 为 单 个 单 词 , 每 个 位 置 参 数 用 空 格 分 隔 。 当 展 开 出 现 在 双 引 号 内 , 并 执 行 分 词 时 , 每 个 参 数 展 开 为 一 个 单 独 的 词 。 也 就 是 说 , “ @)展开为位置参数,从1开始。在执行分词的上下文中,这将把每个位置参数展开为一个单独的词;如果不在双引号内,这些词会被拆分。在不执行分词的上下文中,这扩展为单个单词,每个位置参数用空格分隔。当展开出现在双引号内,并执行分词时,每个参数展开为一个单独的词。也就是说,“ @)1;@”等价于“$1”“ 2 ” 。 如 果 双 引 号 展 开 出 现 在 单 词 中 , 则 第 一 个 参 数 的 展 开 与 原 始 单 词 的 开 头 部 分 连 接 , 最 后 一 个 参 数 的 展 开 与 原 始 单 词 的 结 尾 部 分 连 接 。 当 没 有 位 置 参 数 时 , " 2”。如果双引号展开出现在单词中,则第一个参数的展开与原始单词的开头部分连接,最后一个参数的展开与原始单词的结尾部分连接。当没有位置参数时," 2"@"和$@将不存在(也就是说,它们将被删除)。

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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值