1 shell脚本的参数

2 参数扩展

1.shell脚本的参数


从命令行传递给脚本的参数称为位置参数

shell脚本中表示位置参数的系统变量
变量名 说明 示例
$n

1≤n≤9,表示变量的位置顺序

n≥10

echo "$1"

echo "${11}"

$# 命令行参数的个数 echo "$#"

$0

执行的脚本名称

脚本的文件名

echo "$0"

echo "$0" | cut -d/ -f2

$* 返回所有参数的值

echo "$*"

以"$1 $2 … $n"的形式输出

$@ “同上”,输出形式略有不同

echo "$@"

以"$1" "$2" … "$n" 的形式输出

$_ 代表之前执行的命令的最后一个参数

  示例,比较$@、$*,脚本haha.sh代码如下:

#!/bin/bashtmp=""
declare -i k=0
for i in "$@"; dolet k+=1echo "Cycles: $k"tmp=${tmp}"$(echo $i)"
doneecho "$tmp"

如第三行,执行后输出:

$ ./haha.sh hello sunny !
Cycles: 1
Cycles: 2
Cycles: 3
hellosunny!

修改成$*,执行后如下:

$ ./haha.sh hello sunny
Cycles: 1
hello sunny !

倘若去掉第三行的双引号,输出结果都是一样的,如下:

$ ./haha.sh hello sunny !
Cycles: 1
Cycles: 2
Cycles: 3
hellosunny!

  这个例子,说明:第5行如果不带双引号的情况下,$*、$@效果一样。带了双引号,会影响程序的执行。带上双引号后,“$*”就是一个字符串;而“$@”才能准确地表示脚本的多个变量。

  上边的情况是,选项不带空格符“hello world.”,第5行“"$@"”,结果是:

Cycles: 1
hello world.

去掉第5行的双引号:

Cycles: 1
Cycles: 2
helloworld.

说明带上双引号,才能正确表示选项。

  总结如下表,+表示带上双引号、-表示不带、√表示正确处理、╳处理表示错误。

位参 命令 $@ $* 说明
+ + 位参中包含空格
+ -
- -
- + 程序中需要使用双引号时,选择$@

2.参数扩展


  给脚本传递多个不同值的“同位”参数。这里需要引入“getopts”命令来完成参数扩展。

  getopts的使用,有个前提:认为选项不会出现在“?”、“:”之中。

2.1.语法

  getopts的语法:getopts 选项定义 选项变量名 [args]

  “选项定义”用来设定接受的选项列表。当列表中某个字符后带着“:”时,代表其需要一个参数。

  “选项变量名”用来接收脚本的选项。

  [args]表示,一次脚本执行,需要多个选项时的用法。

  “选项参数”保存在变量OPTARG中,获取到最后一个参数的时候,getopts的返回值“为假”。

  如果“选项定义”首个字符是“:”就关闭了报错机制(静默模式)。也可以使用变量“OPTERR”(设置为0)关闭报错,优先级更高。

2.2.异常

  当“选项变量名”获取到一个未定义的选项时,变量名被赋值“?”。静默模式时,选项被赋值给变量OPTARG。

  当缺少参数时,非静默模式情况下“选项变量名”被赋值“?”;选项参数处于“unset”状态。当缺少参数时,静默模式时,“选项变量名”被赋值“:”;选项参数被赋值“选项字符”。

  当从脚本获取到选项时,getopts返回为真。

#!/bin/bash# 静默模式,两个选项,一个带参数,一个不带参数
while getopts ":ln:" opt
docase "$opt" in# 不带参数的预定义选项处理意见"l")echo "option $opt";;# 带参数的预定义选项处理意见"n")# 输出“选项”、“选项的参数”echo "option $opt has vlaue $OPTARG";;# 静默模式,不带选项的处理意见":")echo "No arg.";;"?")# 兼容下非静默模式的选项变量名的值echo "invalid arg.";;"*")# 处理异常选项echo "unkown error from arg.";;esac
done
getopts ":ln:" opt
项目 意义
getopts 命令
":ln:"

选项定义,定义脚本处理的选项列表

opt 选项变量名,捕获脚本执行时使用的选项
":ln:"
项目 意义
: 选项定义首个字符是冒号时,代表getopts运行在静默模式。
l 定义了一个无参数的选项 l
n: 定义带参数的选项 n
检查执行效果
执行效果

$ ./my-getopts.sh -l

option l

选项 l 处理选项 l
$ ./my-getopts.sh -n

No arg.

省略参数的选项 n 在循环中使用“:”处理忘记了参数的选项
$ ./my-getopts.sh -n 3

option n has vlaue 3

带参数 3 的选项 n 处理 选项 n 及 n 的值 3

$ ./my-getopts.sh -k

invalid arg.

未定义的选项

2.3.试数

  探测下运行机制……

#!/bin/bashdeclare -i sw=0while getopts ":abc" option
doecho "option is ${option}."echo "OPTARG is ${OPTARG}."echo "OPTIND is ${OPTIND}."sw=1
done# Without option
[ $sw -eq 0 ] && echo "without any option?" && echo "OPTIND is ${OPTIND}."

转载于:https://blog.51cto.com/sunnybay/1428194

使用getopts处理选项相关推荐

  1. shell 命令行实现

    说明:原文网址http://blog.chinaunix.net/uid-26807463-id-3151601.html 获取UNIX类型的选项: unix有一个优点就是标准UNIX命令在执行时都具 ...

  2. Bash Cookbook 学习笔记 【高级】

    Read Me 本文是以英文版<bash cookbook> 为基础整理的笔记,力求脱水 [高级]部分,涉及脚本安全.bash定制.参数设定等高阶内容 本系列其他两篇,与之互为参考 [基础 ...

  3. linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记

    SHELL编程一UNIX和Shell工具简介 什么是shell? shell只是一个程序,它在系统中没有特权.因此,有多个不同风格shell共同存在原因--Bourne Shell,Korn Shel ...

  4. shell数组目录遍寻循环输出

    linux shell编程控制结构:expr.let.for.while.until.shift.if.case.break.continue.函数.select 学习笔记 分类: linux2013 ...

  5. linux命令行和shell脚本编程大全笔记

    第1章        初识Linux shell 内存存储单元按组划分成很多块,这些块称作页面(page) Linux操作系统将运行中的程序称为进程.进程可以在前台运行,将输出显示在屏幕上,也 可以在 ...

  6. shell编程(八) : [shell基础] 处理用户输入

    接上一篇文章shell编程(七) : [shell基础] 使用结构化命令 目录 3.3 处理用户输入 3.3.1 命令行参数 1.位置参数 2.对参数进行测试 3.3.2 特殊参数变量 1.参数个数 ...

  7. Mencoder MPlayer 参数详解

    MPlayer(1)                        电影播放器                        MPlayer(1) D>0>        mplayer  ...

  8. 使用getopts处理长和短命令行选项

    我希望使用我的shell脚本来调用命令行选项的长短形式. 我知道可以使用getopts ,但是像在Perl中一样,我无法对shell进行同样的操作. 关于如何完成此操作的任何想法,这样我就可以使用以下 ...

  9. linux命令:bash脚本选项使用cat EOF使用 getopts选项描述

    getopts:用于描述相关信息. 选项: OPTARG  .  OPTIND bash脚本综合实验: 1.如何利用脚本,在创建脚本时,自动把相关选项添加到新的脚本中,且自动在保存 脚本后检测是否有语 ...

最新文章

  1. 敏捷开发实践—任务看板
  2. 在国内安装Pytorchy以及遇到的问题
  3. 动态可订制属性的 PropertyGrid(转载)
  4. ceph对象存储折腾记
  5. 社区不支持HTML,popover不支持html内容吗?
  6. 全套Python数据分析常用命令速查表!PDF文档限时分享
  7. MySQL date_sub()函数
  8. 电脑主板跳线_DIY电脑主板的跳线安装及排序规则
  9. 图像金字塔:高斯金字塔vs拉普拉斯金字塔
  10. 如何获取select中的value、text、index相关值 如何获取单选框中radio值 触发事件 radio 默认选中...
  11. 23模式之: 迭代器模式demo
  12. 自己动手 MOBI 转 PDF
  13. 如何给论文添加参考文献
  14. 《编码:隐匿在计算机软硬件背后的语言》读书笔记
  15. 【deepstream部署Yolov6】
  16. Visual Studio2013 调试报错:该文件没有与之关联的程序来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置...
  17. vue filters的使用
  18. 【设计模式】建造者模式
  19. 見到老板的老婆。。。
  20. 5 python数据分析基础——批量进行数据分析(一)

热门文章

  1. CentOS下安装Telnet
  2. Windows下安装 openpyxl
  3. Thinking in UML 学习笔记(四)——UML活动图来看核心
  4. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java
  5. Spring-Boot:写出来的网站访问不到静态资源?怎样通过url访问SpringBoot项目中的静态资源?localhost:8989/favicon.ico访问不了工程中的图标资源?
  6. 编译原理练习题(第三章)
  7. piczoom兼容性问题_浏览器不兼容原因及解决办法
  8. maya怎么保持2u_【肘进健康】手肘超伸怎么练?
  9. python创建数组放入矩阵_python创建数组并存入数据库
  10. Python知识点1——基础