shell脚本系列:5、shell参数


文章目录

  • shell脚本系列:5、shell参数
    • 1. 位置参数
    • 2. 特殊参数
      • 2.1 参数*
      • 2.2 参数@
      • 2.3 参数#
      • 2.4 参数?
      • 2.5 参数-
      • 2.6 参数$
      • 2.7 参数!
      • 2.8 参数0
    • 3. 其它
• 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选项为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由单个数字组成时被引用为 N,或者当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 开 始 。 在 执 行 分 词 的 上 下 文 中 , 这 将 把 每 个 位 置 参 数 展 开 为 一 个 单 独 的 词 ; 如 果 不 在 双 引 号 内 , 这 些 词 会 被 拆 分 。 在 不 执 行 分 词 的 上 下 文 中 , 这 扩 展 为 单 个 单 词 , 每 个 位 置 参 数 用 空 格 分 隔 。 当 展 开 出 现 在 双 引 号 内 , 并 执 行 分 词 时 , 每 个 参 数 展 开 为 一 个 单 独 的 词 。 也 就 是 说 , “ @)展开为位置参数,从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/bashecho $*
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

shell脚本系列:5、shell参数相关推荐

  1. Linux求平方脚本,Linux Shell脚本系列教程(五):数学运算

    这篇文章主要介绍了Linux Shell脚本系列教程(五):数学运算,本文讲解了使用let.(())和[]进行算术运算.使用expr进行算术运算.使用bc进行算术运算三种方法,需要的朋友可以参考下 在 ...

  2. shell脚本系列:1、shell、bash和shell脚本

    shell脚本系列:1.shell.bash和shell脚本 文章目录 shell脚本系列:1.shell.bash和shell脚本 1. 前言 2. shell.Bash.shell script简 ...

  3. linux shell 博客,【博客侠】Linux Shell脚本系列:开始上手(1)

    看标题大家应该知道,这是一个关于 Linux Shell 脚本的系列文章.通过本系列文章希望帮助 Linux 初学用户快速开始上手编写 Shell 脚本,能够利索的对脚本进行测试和使用. 在接下来的首 ...

  4. 详细介绍Linux shell脚本系列基础学习(列表)

    本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格式等. 不断更新中,是Shell学习的必读经典教程.现主要包含以下文章: Linux S ...

  5. linux shell语法检查或者查看shell脚本执行过程的参数介绍及两种使用方法

    shell语法检查或者查看shell脚本执行过程的参数介绍及两种使用方法 一.常用参数概述: set -x 与 set +x 在liunx脚本中可用set -x就可有详细的日志输出,省的老是要echo ...

  6. 1025.在线视频—shell脚本系列讲座(三)千机变—脚本变量

    shell脚本系列讲座有以下主题 (一)shell脚本与应用示例 (二)三剑客-文本处理 (三) 千机变-脚本变量 (四)向左向右-条件选择 (五)望山跑死马-循环 (六)脚本函数与任务调度 (七)脚 ...

  7. 【跟晓月学shell脚本】掌握shell脚本变量原理及概念

    前言 跟晓月一起学shell,死磕shell脚本,让shell脚本学习不再难. 想学习更多shell脚本的案例,可以前往我的师父的shell脚本专栏:shell脚本从入门到实战-案例篇 文章目录 前言 ...

  8. php shell脚本怎么写,Shell脚本编程入门

    一.什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do tou ...

  9. ios重签名shell脚本_iOS逆向——shell重签名及代码注入

    感谢hank老师 上一章我们讲了应用签名原理和重签名原理,不再赘述,没有看过的同学可以点这里-- 这章概述shell脚本重签名.可能有的同学认为有很多工具都能快速的帮助我们重签名实现需求,但我更希望在 ...

最新文章

  1. Vue.js 由 1 到 2 的旅程 - (1)
  2. tddebug怎么读取asm文件_如何利用 ASM 实现既有方法的增强?
  3. [多级联动下拉选择框]和[Tree to Tree]续——让他们可以设置默认值
  4. HBase总结(十一)hbase Java API 介绍及使用示例
  5. asp.net core中使用cookie身份验证
  6. 服务器看端口信息命令行,服务器查看端口命令行
  7. Spark之MLlib
  8. ios html转json,iOS 中 Model 和 JSON 互相转换
  9. 应聘软件测试岗位需要掌握的基础知识与技能(面试常考内容)
  10. Python爬虫理论 | (4) 数据存储
  11. word上下的横线怎么去掉_word文档上面有一条横线怎么去掉
  12. 基于短时时域处理中短时能量和过零率的语音端点检测方法
  13. JavaScript中逻辑运算符(、||、!)的优先级和运算顺序
  14. Flutter尽然还能有这种操作!送大厂面经一份!
  15. python合并单元格居中_Python基于xlrd模块处理合并单元格
  16. 浅谈PLC电力线载波技术
  17. Python之pandas:利用describe函数统计【类别型】特征/离散型变量的描述性统计信息(包括个数count、unique、top及其freq、first、last)之详细攻略
  18. Phpstudy 错误总结
  19. chiinv函数java_Excel 使用CHIINV函数和GAMMA.DIST函数绘制卡方分布
  20. vc应用程序——个性化的工具条图标

热门文章

  1. 使用U2-Net深层网络实现——证件照生成程序
  2. catia初学 v5R21
  3. C语言中文网课后作业day01
  4. Swin-Transformer:基于移位窗口(Shifted Windows)的分层视觉Transformer
  5. CSS制作的文字滑动效果\有图有真相
  6. java 打印一维码_java生成一维码
  7. 自创打油诗【我是程序猿】 --作者:君君
  8. RStudio画图错误提示
  9. Java强引用、软引用、弱引用、虚引用有什么区别?
  10. PV操作(操作系统) 详解 消费者 生产者问题