Linnux 中有些命令的功能非常强大,主要是因为它支持的命令选项比较多。如:【ip】命令可以配置IP地址、路由条目的配置管理操作非常完善,该命令就可以完成【ifconfig】和【route】命令实现的所有功能。函数是单独的功能模块,如果函数能够接收选项参数,那么该函数的功能就变得丰富,且灵活。脚本也是一样。

那么linux中命令的格式又是怎么样的呢?[root@Node1 ~]# command   [optons parameter1 | parameter2]...  parameter3  parameter3 ...

命令      选项    选项参数                   命令参数(1)   命令参数(2)

我们书写脚本的标准:与linux中命令的格式几乎一样。那么如果我们的脚本支持选项参数,格式如下:scriptName   {-option|--option     parameter}...       scriptParameter ...

脚本名称      短选项  长选项       选项参数             脚本参数

说明:option                使用单杠(-)或双杠(--)来表示选项。

parameter             选项参数

scriptParameter       脚本参数

这些选项、选项参数和脚本参数都统称为位置参数(positional parameter),shell会使用特殊的变量来记录它们。所以在脚本或函数中就可以使用这些变量来引用脚本或函数的参数了。既然称为位置参数,应该有前后顺序。那么bash shell是如何标识不同位置的参数的呢?$1           该变量记录第1个参数

$2           该变量记录第2个参数

$3           该变量记录第3个参数

...           ....

$9           该变量记录第9个参数

${10}        该变量记录第10个参数

...          ...

$0           在命令行运行脚本时:

如果使用绝对路径运行脚本的话,记录脚本名称时使用的是绝对路径。

如果使用相对路径运行脚本的话,记录脚本名称时使用的是相对路径。

可以使用: 【basename $0】方法去除脚本的路径。只获取脚本名称。

$#           位置参数的个数

$*           获取所有参数,把这些参数当做一个单词处理。不允许使用 for 进行迭代。

$@           也是获取所有参数。把它当作一个字符串。该字符串中包含多个使用空间分

隔的单词组成,这种方式允许使用for 迭代出该字符串中的

每一个单词(位置参数)的。

那么,我们在脚本或函数中怎么样获取选项参数呢?

分析:书写脚本或函数时,如果支持选项参数的话,要遵循上述格式。选项option有一个特点:都使用单杠(-)或双杠(--)来表示这就是脚本或函数的选项。它后面跟就是选项参数了。这么是如何实现的呢?实现方式有两种:

1、使用 if 判断语句。if [[ "$1" =~ ^- ]];then

$2就是选项$1的参数了

fi

2、通过选择结构的方式: casecase $1 in

-a|--add)

$2就是选项$1的参数了

;;

esac

这种获取脚本或函数的选项参数的方式有太多的局限性。对于获取只有一个选项的脚本或函数有用。对于多个选项参数的脚本/函数就无能为力了。

虽然使用if的多支语句可以获取多个选项的参数。要把每个选项都作为一条if的分枝语句,很繁琐。

如果,我们的脚本或函数中要使用到多个选项。那么怎么获取选项的各个参数呢?

bash shell 提供【shift】命令来帮助操作命令行参数,该命令能够改变命令行参数的相对位置。shift 默认将每个参数变量左移一个位置。

如:假如给脚本或函数传递了2个参数,每执行一次shift命令,变量$2的值移组变量$1,变量$1的值被丢弃。

shift 命令的使用shift: shift [n]          设置步长。默认是为1 .

我们使用【shift】命令与选择语句 case 就可以很方便的取得每一个选项的参数了,而且也很简洁。例:

mkscript.sh [-D|--description "script description"] [-A|--author "script author"] /pa/filecase $1 in

-D|--description)

该就选项的参数就是$2了

shift 2

;;

-A|--author)

该选项的参数就是$2了

shift 2

;;

*)

echo "Usage: 脚本或函数的使用方法"

esac

上述提取,脚本/函数的选项参数的方法有问题:

无论运行脚本mkscript时传递的参数正确也否都会显示"echo "Usage: 脚本或函数的使用方法".都会执行这一步。

最理想的就是:如果用户使用该脚本的时候且带了选项,如果“选项”不是 case 语句列出的“选项”就告诉用户使用该脚本或函数的方法。又能正确无误地取得脚本参数/pa/file.

分析:

执行 case 选择语句,要有一个条件:如果“参数”是"选项"才执行case语句。在脚本中"选项"的标志是:单杠(-)或双杠(--),我们就可以根据该标志判断 case 选择语句是否执行。

因为,我们的脚本选项很多,所以要使用到循环.判断是否是”选项“作为循环的条件。我们把提取脚本的选项参数和脚本参数方法修改成如下while [ "$1" != "${1##[--,-]}" ];do

case $1 in

-D|--description)

该选项的参数就是$2

shift 2

;;

-A|--author)

该选项的参数就是$2

shift 2

;;

*)

使用该脚本时,虽然使用了选项,但是脚本不支持的,都匹配 *

在这里就可以提示用户:脚本的使用方法了

shift 2

;;

esac

done

脚本的参数=$1

linux脚本怎么获取参数,在Bash shell脚本编程中,如何正确无误获取到“脚本选项参数”和“脚本参数”呢?...相关推荐

  1. linux运行powershell,linux – 是否可以编写一个在bash / shell和PowerShell中运行的脚本?...

    我需要创建一个集成脚本来设置一些环境变量,使用wget下载文件并运行它. 挑战在于它需要是可以在Windows PowerShell和bash / shell上运行的SAME脚本. 这是shell脚本 ...

  2. linux脚本获取当前用户,bash shell 获取当前正在执行脚本的绝对路径

    一般我们写Shell脚本的时候,都倾向使用绝对路径,这样无论脚本在什么目录执行,都应该起到相同的效果,但是有些时候,我们设计一个软件包中的工具脚本,可能使用相对路径更加灵活一点,因为你不知道用户会在哪 ...

  3. linux shell 获取环境变量,bash shell中的环境变量

    环境变量--bash shell使用环境变量来存储系统相关数据,并允许将数据存储在内存中. 环境变量分为:全局环境变量 本地环境变量 目录全局环境变量 本地环境变量 设置全局环境变量 删除环境变量 P ...

  4. win10复制粘贴linux,如何在Windows 10的Bash Shell中启用复制和粘贴键盘快捷键 | MOS86...

    Windows 10s Bash shell终于有了方便的复制和粘贴键盘快捷键,但是出于兼容性原因,默认情况下将它们禁用. 这些快捷方式在2018年10月更新中可用,该更新最初代号为Redstone ...

  5. 小程序获取城市行政区号_小程序中通过经纬度如何获取所在省市区名字(腾讯地图JavaScript SDK)...

    在小程序中通过经纬度来获取所在省市区名字,这个功能还是挺有意思的,小程序中竟然不直接返回所在省市区,只提供经纬度,还需要腾讯地图来获取,还是有点小坑的,不注意的话很容易出问题.废话不多说,请看下文. ...

  6. linux bash sh,linux bash shell.sh编程实例

    1.输出 #!/bin/bash echo "Please type your number:" read a for ((i=1;i<=a;i++)) do for ((p ...

  7. 获取计算机内存镜像文件,计算机取证中的内存镜像获取的研究与实现

    摘要: 随着计算机科学技术的迅猛发展和网络普及,以计算机信息系统为工具和j巳罪对象的各式新型j巳罪案件频繁发生,造成的巨大危害也越来越大.怎么可以最大程度地获取计算机j巳罪相关的计算机证据,将犯罪人员 ...

  8. JavaScript中如何正确的获取字符串长度

    在工作中或多或少会去判断字符串的长度是多少:但是字符串其中的内容可能不是我们确定的:他有可能是中文,也有可能是英文或者数字:那么我们怎么计算才能得到真实的字符串长度呢? 先给大家展示一串字符串: 注意 ...

  9. Linux——Bash Shell脚本 for循环

    1.创建和执行Bash Shell脚本 (1)借助Bash Shell环境和脚本编写功能,将Linux命令与shell脚本组合在一起,从而轻松的解决重复而困难的实际问题,Bash shell脚本最简单 ...

最新文章

  1. 联邦学习,为何而生?
  2. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流
  3. 浙江省计算机网络技术比赛,[2018年最新整理]0509浙江省三级计算机网络技术历年真题(含答桉).doc...
  4. 文献学习(part18)--Subspace Clustering
  5. 德国汽车厂发生机器人杀人事件 人机协作是大势所趋
  6. flink整合java,Flink使用SideOutPut替换Split实现分流
  7. good-Windows下搭建PHP开发环境(Apache+PHP+MySQL)
  8. 7-8 连续因子 (20 分)
  9. 电脑桌面背景色及分辨率设置问题-仅供参考
  10. Mysql之1050错误解决办法
  11. ps水彩效果教程-庞姿姿
  12. 高级计量经济学及stata应用 陈强 2021年5月1-5日 社会科学 经济学 管理学 金融 医学等各个领域
  13. 为什么会发生通货膨胀
  14. 怎样删除服务器内磁盘阵列信息,如何管理你的磁盘阵列
  15. Retrying connect to server: 192.168.10.101/192.168.10.101:10020. Already tried 0 time(s); retry poli
  16. 基于iis配置一个ftp服务器
  17. 禅与摩托车维修的艺术
  18. 搬运工-白嫖-docker
  19. 关于各种USB启动模式(MBR)的原理剖析
  20. Python数据分析实战之葡萄酒质量分析

热门文章

  1. 《信息可视化:交互设计(原书第2版)》——1.1节可视化
  2. angularjs--resource
  3. 你竟是这样的月饼-今年中秋节折腾的月饼2.0
  4. iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)
  5. 20135337——Linux内核分析:第十七章 模块与设备
  6. WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式
  7. Android隐藏标题设置全屏,设置背景
  8. 【LeetCode】Sum Root to Leaf Numbers
  9. 一台服务器多个oracle启动
  10. 【译】适合dba和开发者的mysql最佳实践