shell中的变量扩展

1. Shell中变量的原形:${var}

一般来说,$var{var}效果一样,都可以扩展一个变量(即获得它的值)。但如果要显示变量值一些字符时,就会出错,因为默认时他会把$后的一整个单词作为扩展对象。

这时应该用变量的原形:${var},即是加一个大括号来指明变量名称的范围

[root]# aa='ajax'
[root]# echo $aa
ajax
[root]# echo $aa_AA

[root]# echo ${aa}_AA
ajax_AA

2. $(cmd)

展开的结果是cmd执行后的标准输出,相当于用反引号括起来的命令。

[root@bogon t]# ls
1.txt  2.txt
[root@bogon t]# echo $(ls)
1.txt 2.txt

这里要注意的是$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出

[root@bogon t]# var=$(cat 3.txt)
cat: 3.txt: 没有那个文件或目录
[root@bogon t]# echo $var

$var显然是空的

3. 几种特殊的替换结构:

${var:-string},${var:+string},${var:=string},${var:?string}

(1) ${var:-string} 和 ${var:=string}

若变量var为空或者未定义,则用在命令行中用string来替换${var:-string}
否则变量var不为空时,则用变量var的值来替换${var:-string}

[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:-bcc}
bcc
[root@bogon ~]# echo $a

[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-bcc}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:=bbc}
bbc
[root@bogon ~]# echo $a
bbc

${var:-string}${var:=string}

比较 后者发现$var为空时,把string赋值给了var
后者是一种赋值默认值的常见做法

(2) ${var:+string}

规则和上面的完全相反
即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量var的值,即空值

[root@bogon ~]# a=ajax
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# echo ${a:+bbc}
bbc
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:+bbc}

[root@bogon ~]# 

(3) ${var:?string}

替换规则:若变量var不为空,则用变量var的值来替换${var:?string}
若变量var为空,则把string输出到标准错误中,并从脚本中退出。
可利用此特性来检查是否设置了变量的值

[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:?bbc}
-bash: a: bbc
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:?bbc}
ajax
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-`date`}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo ${a:-`date`}
2017年 02月 21日 星期二 10:13:46 CST
[root@bogon ~]# echo ${a:-$(date)}
2017年 02月 21日 星期二 10:13:59 CST
[root@bogon ~]# b=bbc
[root@bogon ~]# echo ${a:-$b}
bbc

4. $((exp)) POSIX标准的扩展计算

这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),包括三目运算符
注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等
若是逻辑判断,表达式exp为真则为1,假则为0

[root@bogon ~]# echo $(3+2)
-bash: 3+2: 未找到命令

[root@bogon ~]# echo $((3+2))
5
[root@bogon ~]# echo $((3.5+2))
-bash: 3.5+2: 语法错误: 无效的算术运算符 (错误符号是 ".5+2")
[root@bogon ~]# echo $((3>2))
1
[root@bogon ~]# echo $((3>2?'a':'b'))
-bash: 3>2?'a':'b': 语法错误: 期待操作数 (错误符号是 "'a':'b'")
[root@bogon ~]# echo $((3>2?a:b))
0
[root@bogon ~]# echo $((a=3+2))
5
[root@bogon ~]# echo $((a++))
5
[root@bogon ~]# echo $a
6

5. 四种模式匹配替换结构:

${var%pattern}
${var%%pattern}
${var#pattern}
${var##pattern}

${var%pattern},${var%%pattern}从右边开始匹配
${var#pattern},${var##pattern}从左边开始匹配
${var%pattern} ,${var#pattern}表示最短匹配,匹配到就停止,非贪婪
${var%%pattern},${var##pattern}是最长匹配

只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分

结构中的pattern支持的通配符:

  • * 表示零个或多个任意字符
  • ?表示零个或一个任意字符
  • [...]表示匹配中括号里面的字符
  • [!...]表示不匹配中括号里面的字符
[root@bogon ~]# f=a.tar.gz
[root@bogon ~]# echo ${f##*.}
gz
[root@bogon ~]# echo ${f%%.*}
a
[root@bogon ~]# var=abcdccbbdaa
[root@bogon ~]# echo ${var%%d*}
abc
[root@bogon ~]# echo ${var%d*}
abcdccbb
[root@bogon ~]# echo ${var#*d}
ccbbdaa
[root@bogon ~]# echo ${var##*d}
aa
#发现输出的内容是var去掉pattern的那部分字符串的值

记忆的方法为:
#是 去掉左边(键盘上#$的左边)
%是去掉右边(键盘上%$的右边)
单一符号是最小匹配;两个符号是最大匹配

6. 其他

  • ${file:0:5}:提取${file}最左边的 5 个字节
  • ${file:5:5}:提取第 5 个字节及之后的连续5个字节
  • ${file:5} :提取第5个字节及之后的子串

也可以对变量值里的字符串作替换:

  • ${file/dir/path}:将第一个dir 替换为path

  • ${file//dir/path}:将全部dir 替换为 path

  • ${#var}可计算出变量值${var}的长度

### Shell脚本中的变量扩展 #### 基础概念 在Shell脚本中,变量扩展是指通过特定语法来访问和操作已定义的变量。这种机制允许用户不仅获取变量的内容,还能对其进行各种处理,从而增强脚本的功能性和灵活性[^1]。 #### 扩展方式及其功能说明 - **基本引用** 使用`$variable_name`或`${variable_name}`的形式可以取得变量值。后者适用于当变量名后面紧跟着字符的情况,以区分边界[^4]。 - **默认赋值** 如果尝试读取未设置过的参数,则可以通过`${parameter:-word}`的方式提供一个临时使用的替代字符串;而`${parameter:=word}`则会在原参数为空时永久设定该缺省值。 - **错误提示** 当遇到不存在的参数且希望立即报错停止程序运行时,可采用`${parameter:?message}`结构,在此情况下如果`parameter`为空或者没被设过,就会打印出`message`并终止当前shell会话。 - **移除前缀/后缀匹配模式** `${parameter#pattern}`, `${parameter##pattern}`用于删除最短/最长左侧符合给定模式的部分; 同理有`${parameter%pattern}`, `${parameter%%pattern}`针对右侧做同样操作. 以下是几个具体的例子展示这些特性的应用: ```bash #!/bin/bash var="hello_world" echo "${var}" # 输出整个变量内容 hello_world echo "${var}_example" # 结合其他文本输出 hello_world_example unset another_var # 清除可能存在的同名旧变量 echo "${another_var-default_value}" # 显示 default_value (因为另一个变量已被清除) name_with_prefix="/path/to/file.txt" echo "${name_with_prefix#/}" # 移除首个斜杠后的结果 path/to/file.txt ``` 上述代码片段展示了不同类型的变量扩展技巧,有助于创建更加智能高效的Shell脚本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值