声明变量
声明变量通常使用 declare
命令来操作
1 | $ declare [OPTIONS] VARIABLES |
不使用 declare
,直接使用等号也没有任何问题
1 | declare -i A=20 |
变量赋值
变量赋值的时候,等号两边不能有空格,如果值里面包括空格必须用引号,variable="hello world"
1 | var_name =VALUE # 这里的变量为本地变量 |
变量引用
变量的引用实际就是将变量名替换为变量所指向的数据。
1 | [user1@study ~]$ a=123;echo $a |
变量撤销
使用 $
可以对变量进行引用,在撤销变量的时候不需要 $
直接使用变量名即可
1 | [user1@study ~]$ a='Tom';b='Jerry';echo $a and $b |
变量间接引用
当一个变量所指向的数据是另外一个变量的名字时,可以间接性的引用那个变量所对应的数据。通常使用 ${!var_name}
的方式来实现
1 | [user1@study ~]$ message=hello |
使用转义符 \
对 $
转义而后交给 eval
命令也能实现变量的间接引用
1 | [user1@study ~]$ message=hello;hello=goodbye |
变量的查看
1 | set # 显示(设置)所有 shell 变量(包括环境变量及本地变量) |
示例
1 | [user1@study ~]$ name='Tom';echo ${name} # shell 本地变量设定及其引用 |
从变量提取字符串
假设定义了变量 strings
1 | [user1@study ~]$ strings=hello.10.10.10.10.test.world |
${strings#*10}
删除掉第一个 10
和它左边的字符串
1 | [user1@study ~]$ echo ${strings#*10} |
${strings##*10}
删除掉最后一个 10
和它左边的字符串
1 | [user1@study ~]$ echo ${strings##*10} |
${strings%10*}
删除掉最后一个 10
和它右边的字符串
1 | [user1@study ~]$ echo ${strings%10*} |
${strings%%10*}
删除掉第一个 10
和它右边的字符串
1 | [user1@study ~]$ echo ${strings%%10*} |
看上去有些绕,为了便于记忆,可以用键盘上的 $
做个分隔。键盘上 #
位于 $
的左边,所以提取字符串的时候向左删除,%
位于 $
的右边,所以提取字符串的时候向右删除。
这里用到的 *
只是一个通配符,有的时候可以不要。单一符号最小匹配,两个符号最大匹配,匹配到的内容删掉。
基于字符串切片
从变量指向的字符串中按照指定长度切取数据
${var:offset:length}
- offset:要跳过字节的个数;
- length:取出字节的长度,如果省略则取偏移量后所有元素
${var: -length}
操作示例
1 | [user1@study ~]$ mypath="/etc/sysconfig/network-scripts/" |
大小写切换
${a^^}
把 $a
中所有小写字母替换为大写
1 | [user1@study ~]$ a='Tom and Jerry';echo ${a^^} |
${a,,} 把
$a` 中所有大写字母替换为小写
1 | [user1@study ~]$ a='Tom and Jerry';echo ${a,,} |
变量展开
1 | ${a=hehe} # 若 $a 未设定,则用 hehe 作传回值,同时将 $a 赋值为 hehe (空及非空时不作处理) |
以上的理解在于,要分清楚 unset 与 null 及 non-null 这三种赋值状态。
其中 :
与 null
有关,如果不带 :
则 null
不受影响;如果带了 :
则连 null
也受影响。
字符串的替换(globbing)
1 | ${a/hehe/haha} # 将变量 a 中第一个 hehe 提换为 haha |
字符串的删除(globbing)
1 | ${a/hehe} # 查找 $a 中首次匹配到的字符串hehe,并删除之 |