shell编程进阶01 参数扩展

站长QQ群

用于技术交流、投稿、商务合作 站长唯一QQ:528482275 站长唯一QQ群:649978721

IT运维技术交流

特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!

开始写shell编程进阶教程了,如果你还没学过基础篇,请点下面相应链接。

 

shell编程基础01 Hello World

Shell编程基础02 变量

Shell基础教程03 运算

Shell基础教程04 数组

Shell基础教程05 控制语句

Shell基础教程06 函数

参数扩展介绍

 

进入主题,shell的一个核心功能是参数管理,参数是存储值的实体,由名称、数字或特殊符号引用。

 

  • 名称引用的参数称为变量
  • 数字引用的参数称为位置参数
  • 特殊符号引用的参数是具有不同特殊含义和用途的参数

 

名称引用参数

 

名称引用就是我们经常说的变量,没啥好说的,但是在写脚本时建议使用${}的语法,看一个例子:

[root@localhost ~]# filename=linuxtime[root@localhost ~]# echo "/home/$filename1"/home/[root@localhost ~]# echo "/home/${filename}1"/home/linuxtime1

 

为什么第一个echo没有打印出filename变量?因为shell把filename1当作成了一个变量,而filename1没有被定义,所以echo出""(空),shell会将以"$"开头的所有有效字符解释为一个变量名称。使用${}语法shell会强制解释大括号内的名称。

 

数字引用参数

 

数字引用参数就是基础篇里提到的位置参数啦,也没啥好说的,如果还不理解请翻阅基础篇^_^。

 

特殊符号引用参数

 

特殊符号引用参数有很多要说的,写脚本时使用上特殊符号引用参数,就可以甩其他童鞋一条街了(不是开玩笑哦)。既然是特殊符号,肯定不利于大脑记忆,那接下来就看例子,你一定要按照例子自己操作一遍,形成一个大概的印象,最后做到举一反三。

 

--------我是一条帅气的且内容重要的分割线--------

 

间接引用

 

[root@localhost ~]# echo ${filename}linuxtime[root@localhost ~]# linuxtime=time[root@localhost ~]# echo ${!filename}time

 

大小写转换

 

我们先打印filename变量,看下filename的值是啥。

[root@localhost ~]# echo ${filename} linuxtime

 

转换第一字符为大写,最短匹配。

[root@localhost ~]# echo ${filename^}  Linuxtime

 

转换所有字符为大写,最长匹配。

[root@localhost ~]# echo ${filename^^}  LINUXTIME

 

接下来演示大小转小写,还是先看下filename变量值。

[root@localhost ~]# echo ${filename}  LinuxTime

 

转换第一次字符为小写,最短匹配。

[root@localhost ~]# echo ${filename,}    linuxTime

 

转换所有字符为小写,最长匹配。

[root@localhost ~]# echo ${filename,,}linuxtime

 

大小写取反,看下filename变量值。

[root@localhost ~]# echo ${filename} LinuxTime

将第一个字符大小写取反,最短匹配。

[root@localhost ~]# echo ${filename~}linuxTime

 

将所有字符大小写取反,最长匹配。

[root@localhost ~]# echo ${filename~~} lINUXtIME

 

打印带有某个前缀的所有变量名称

 

老套路,先看定义的变量。

[root@localhost ~]# var1=test1[root@localhost ~]# var2=test2[root@localhost ~]# var3=test3[root@localhost ~]# vvar1=test4[root@localhost ~]# vvar2=test5[root@localhost ~]# vvar3=test6

 

打印所有以var开头的变量

[root@localhost ~]# echo ${!var*}var1 var2 var3[root@localhost ~]# echo ${!var@}var1 var2 var3

 

打印所有以vvar开头的变量

[root@localhost ~]# echo ${!vvar*}vvar1 vvar2 vvar3[root@localhost ~]# echo ${!vvar@}vvar1 vvar2 vvar3

 

删除前后缀

 

先定义一个演示用的变量,查看下变量的值。

[root@localhost ~]# filename=flask.py.bak[root@localhost ~]# echo ${filename} flask.py.bak

 

删除前缀

[root@localhost ~]# echo ${filename#*.}   py.bak

 

删除最长前缀

[root@localhost ~]# echo ${filename##*.} bak

 

删除后缀

[root@localhost ~]# echo ${filename%.*} flask.py

 

删除最长后缀

[root@localhost ~]# echo ${filename%%.*}  flask

 

替换

 

先定义一个演示用的变量

[root@linux-time ~]# name="what is linux, my name is linuxtime"

 

仅将第一个linux替换成book,最短匹配。

[root@linux-time ~]# echo ${name/linux/book} what is book, my name is linuxtime

 

将所有linux替换成book,最长匹配。

[root@linux-time ~]# echo ${name//linux/book} what is book, my name is booktime

 

将第一个linux替换成空字符串,最短匹配。

[root@linux-time ~]# echo ${name/linux} what is , my name is linuxtime

 

将所有linux替换成空字符串,最长匹配。

[root@linux-time ~]# echo ${name//linux} what is , my name is time

 

字符串长度

 

定义一个演示变量。

[root@linux-time ~]# os="centos, ubuntu, freebds, suse"

 

统计字符个数,包括空格。

[root@linux-time ~]# echo ${#os} 29

 

字符串截取

 

定义一个演示变量

[root@linux-time ~]# os="centos, ubuntu, freebds, suse"

 

从左边数的第8个字符开始往后取6个字符

[root@linux-time ~]# echo ${os:8:6} ubuntu

 

从右边数的第4个字符开始往后取4个字符,注意到没有,"-"与":"之间有个空格。

[root@linux-time ~]# echo ${os: -4:4} suse

 

同上,如果不想加个空格就用小括号括起来。

[root@linux-time ~]# echo ${os:(-4):4} suse

 

从右边数的第8个字符开始一直到最后一个字符

[root@linux-time ~]# echo ${os:8}ubuntu, freebds, suse

 

截取从右边的第8个字符串到从左边数2个字符串之间的字符串。

[root@linux-time ~]# echo ${os:8:-2}  ubuntu, freebds, su

 

默认值

 

定义演示变量

[root@linux-time ~]# os1=centos[root@linux-time ~]# os2=ubuntu

 

如果os1变量未定义或为空,那么将打印suse

[root@linux-time ~]# echo ${os1:-suse} centos

 

如果os3变量未定义或为空,那么将打印suse

[root@linux-time ~]# echo ${os3:-suse} suse

 

定义一个演示变量os4,值设置未空。

[root@linux-time ~]# os4=""

 

仅在变量为定义时,那么将打印suse,该行只打印了个空字符串。

[root@linux-time ~]# echo ${os4-suse}

 

如果os3变量未被定义或为空,那么将打印windows,并将windows赋值给os2。

[root@linux-time ~]# echo ${os3:=windows} windows

 

如果os2变量未被定义或为空,将打印windows,并将windows赋值给os2。

[root@linux-time ~]# echo ${os2:=windows} ubuntu

 

去掉冒号后仅当变量未被定义时将打印windows,并将windows赋值给os3。

[root@linux-time ~]# echo ${os3=windows} windows

 

os4变量为空字符串,所以该行未打印windows

[root@linux-time ~]# echo ${os4=windows}

 

检测变量

 

先打印下演示变量的值,确认下变量是否被上面的示例污染。

[root@localhost ~]# echo ${os1}, ${os4}centos,

 

一般用来检查变量是否已定义,起到一个提示的作用。如果变量未被定义,则输出为空。

[root@localhost ~]# echo ${os1:+ os1变量已被定义}os1变量已被定义

 

打印为空,说明os4变量未被定义。

[root@localhost ~]# echo ${os4:+ os4变量已被定义}

 

如果变量为null或未被定义,则显示错误提示。

[root@localhost ~]# echo ${os4:? windows}-bash: os4:  windows

 

好了,就演示到这里,有疑问,可以留言shell编程进阶01 参数扩展

 

如果阅读后有所收获,麻烦帮忙分享转发。谢谢!

未经允许不得转载:作者:小牛, 转载或复制请以 超链接形式 并注明出处 小牛博客
原文地址:《shell编程进阶01 参数扩展》 发布于2019-07-12

分享到:
赞(0) 打赏

评论 抢沙发

5 + 6 =


shell编程进阶01 参数扩展

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

网站公告

开启新征程,加油少年。 2019-10-6

开启新征程,加油少年。

不知不觉,都十月多了,即将面临找工作的我来说是尤为重要的,

不管怎么说,十月加油吧。

我已阅读
Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册