Shell编程之变量的高级用法详解
变量替换
语法 | 说明 |
${变量名#匹配规则} | 从变量开头进行规则匹配,将符合最短的数据删除 |
${变量名##匹配规则} | 从变量开头进行规则匹配,将符合最长的数据删除 |
${变量名%匹配规则} | 从变量尾部进行规则匹配,将符合最短的数据删除 |
${变量名%%匹配规则} | 从变量尾部进行规则匹配,将符合最长的数据删除 |
${变量名/旧字符串/新字符串} | 变量内容符合就字符串,则第一个旧字符串会被新字符串替换 |
${变量名//旧字符串/新字符串} | 变量内容符合就字符串,则全部的旧字符串会被新字符串替换 |
示例
变量测试
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
x=${y-新值} | x=新值 | x为空 | x=$y |
x=${y:-新值} | x=新值 | x新值 | x=$y |
x=${y+新值} | x为空 | x=新值 | x=新值 |
x=${y:+新值} | x为空 | x为空 | x=新值 |
x=${y=新值} | x=新值 | x为空 | x=$y |
y=新值 | y值不变 | y值不变 | |
x=${y:=新值} | x=新值 | x=新值 | x=$y |
y=新值 | y=新值 | y值不变 | |
x=${y?新值} | 新值输出到标准错误输出(屏幕) | x为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
- 如果大括号内没有":",则变量 y 为空或没有被设置,处理方法是不同的;如果大括号内有":",则变量 y
- 不论是为空,还是没有被设置,处理方法是一样的;
- 如果大括号内是"-“或”+",则在改变变量 x 的值的时候,变量 y 的值是不改变的;
- 如果大括号内是"=",则在改变变量 x 的值的同时,变量 y 的值也会改变;
- 如果大括号内是"?",则当变量 y 不存在或为空时,会把"新值"当成报错输出到屏幕上。
示例
看完了我还是记不住!!参考上表吧!
字符串处理
字符串长度
语法 | 说明 | |
方法一 | ${#string} | 无 |
方法二 | expr length "$string" | string有空格,则必须加双引号 |
示例
子串字符索引
语法 | expr index $string $substring | string/substring有空格,则必须加双引号 | 此方法并不是查找子串的索引位置,它会把子串进行字符拆分,哪个字符最先找到了则返回其索引位置。并且索引从1开始 |
子串长度
语法 | expr match $string substring | string/substring有空格,则必须加双引号 |
expr match $string substring获取子串长度必须是从头开始匹配
抽取子串
语法 | 说明 | |
方法一 | ${string:position} | 从string中的position开始抽取子串 |
方法二 | ${string:position:length} | 从string中的position开始,抽取长度为length的子串 |
方法三 | ${string: -position} | (注意-position前有个空格)从尾部开始的position抽取子串 |
方法四 | ${string:(position)} | 从string中的头部开始的position抽取子串 |
方法五 | expr substr $string $position $length | 从string中的position开始,抽取长度为length的子串 |
示例
注意:expr substr $string $position $length的position从1开始,而${string:position:length}的从0开始。
小试牛刀
需求描述:变量string="bigdata process framework is hadoop,hadoop is an open source project."执行脚本后,打印输出string字符串变量,并给出用户一下选项:
- 打印string长度
- 删除字符串中所有的hadoop
- 替换第一个hadoop为mapreduce
- 替换所有hadoop为mapreduce
用户输入数字1|2|3|4,可以执行对应项的功能;输入q|q则退出交互模式。
命令替换
shell 命令替换是指将命令的输出结果赋值给某个变量。比如,在某个目录中输入 ls 命令可查看当前目录中所有的文件,但如何将输出内容存入某个变量中呢?这就需要使用命令替换了,这也是 shell 编程中使用非常频繁的功能。
语法 | |
方法一 | `command` |
方法二 | $(command) |
示例
有类型变量
在之前的变量声明中都是没有指定变量类型的,在shell编程中如果需要为变量指定类型则需要使用declare和typeset命令。这两个命令是等价的。(下表中-号为添加,取消则使用+号,如+x)
参数 | 含义 |
-r | 将变量设置为只读 |
-i | 将变量设置为整数 |
-a | 将变量定义为数组 |
-f | 显示此脚本前定义过的所有函数及内容 |
-f | 仅显示此脚本前定义过的函数名 |
-x | 将变量声明为环境变量 |
示例
数学运算之expr
expr操作符对照表:
操作符 | 含义 |
num1 | num2 | num1不为空且非0,返回num1;否则返回num2 |
num1 & num2 | num1不为空且非0,返回num1;否则返回0 |
num1 < num2 | num1小于num2,返回1;否则返回0 |
num1 <= num2 | num1小于等于num2,返回1;否则返回0 |
num1 = num2 | num1等于num2,返回1;否则返回0 |
num1 != num2 | num1不等于num2,返回1;否则返回0 |
num1 > num2 | num1大于num2,返回1;否则返回0 |
num1 >= num2 | num1大于等于num2,返回1;否则返回0 |
注意:如果需要在命令行中使用这些运算需要转义,如expr $num1 \| $num2,expr $num1 \> $num2,否则报错。
数学运算之bc
bc是bash内建的运算器,支持浮点数运算。默认情况下bc运算精确到整数,可以设置scale来保留指定位数的小数。
在shell中通常通过管道来使用bc。如:echo "2.5/3.65" | bc或echo 'scale=2; (2.777 - 1.4744)/1' | bc。注意:后者的/1操作,如果不进行除法则无法保留指定位数的小数
bc 除了 scale 来设定小数位之外,还有 ibase(输入数据的进制) 和 obase(输出的数据进制) 来其它进制的运算。
到此这篇关于shell编程之变量的高级用法详解的文章就介绍到这了,更多相关shell 变量的高级用法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!