给变量赋值,使用等号即可,但是等号两边千万不要有空格,等号右边有空格的字符串也必须用引号引起来
变量定义
1
2
3
|
para1="hello world" #字符串直接赋给变量para1
#unset用于取消变量
unset para1
|
定义变量类型:
declare 或 typeset
- -r 只读(readonly一样)
- -i 整形
- -a 数组
- -f 函数
- -x export
declare -i n=0
系统变量
| command |
释义 |
| $0 |
脚本启动名(包括路径) |
| $n |
第n个参数,n=1,2,…9 |
| $* |
所有参数列表(不包括脚本本身) |
| $@ |
所有参数列表(独立字符串) |
| $# |
参数个数(不包括脚本本身) |
| $$ |
当前程式的PID |
| $! |
执行上一个指令的PID |
| $? |
执行上一个指令的返回值 |
变量引用技巧
| command |
释义 |
| ${name:+value} |
如果设置了name,就把value显示,未设置则为空 |
| ${name:-value} |
如果设置了name,就显示它,未设置就显示value |
| ${name:?value} |
未设置提示用户错误信息value |
| ${name:=value} |
如未设置就把value设置并显示<写入本地中> |
| ${#A} |
可得到变量中字节数 |
| ${A:4:9} |
取变量中第4位到后面9位 |
| ${A:(-1)} |
倒叙取最后一个字符 |
| ${A/www/http} |
取变量并且替换每行第一个关键字 |
| ${A//www/http} |
取变量并且全部替换每行关键字 |
定义一个变量:file=/dir1/dir2/dir3/my.file.txt
| command |
释义 |
| ${file#*/} |
去掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt |
| ${file##*/} |
去掉最后一条 / 及其左边的字串:my.file.txt |
| ${file#*.} |
去掉第一个 . 及其左边的字串:file.txt |
| ${file##*.} |
去掉最后一个 . 及其左边的字串:txt |
| ${file%/*} |
去掉最后条 / 及其右边的字串:/dir1/dir2/dir3 |
| ${file%%/*} |
去掉第一条 / 及其右边的字串:(空值) |
| ${file%.*} |
去掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file |
| ${file%%.*} |
去掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my |
说明
- # 是去掉左边(在键盘上 # 在 $ 之左边)
- % 是去掉右边(在键盘上 % 在 $ 之右边)
- 单一符号是最小匹配﹔两个符号是最大匹配
操作变量
1
2
3
4
5
6
|
echo "para1 is $para1"
#将会输出 para1 is hello world
# or
echo "para1 is ${para1}!"
#将会输出 para1 is hello world!
|
变量替代
1
2
|
foo="I'm a cat."
echo ${foo/cat/dog} # 打印 "I'm a dog."
|
使用两个反斜线进行全力替换
1
2
3
|
foo="I'm a cat, and she's cat."
echo ${foo/cat/dog} # 打印 "I'm a dog, and she's a cat."
echo ${foo//cat/dog} # 打印 "I'm a dog, and she's a dog."
|
打印时不会修改变量
1
2
3
|
foo="hello"
echo ${foo/hello/goodbye} # 打印 "goodbye"
echo $foo # 仍然打印 "hello"
|
变量匹配删除
没有替换的字符串则直接删除
1
2
|
foo="I like meatballs."
echo ${foo/balls} # 打印 I like meat.
|
${name#pattern}操作删除${name}匹配模式的最短前缀,而##删除最长前缀:
1
2
3
4
|
minipath="/usr/bin:/bin:/sbin"
echo ${minipath#/usr} # 打印 /bin:/bin:/sbin
echo ${minipath#*/bin} # 打印 :/bin:/sbin
echo ${minipath##*/bin} # 打印 :/sbin ,就是*/bin 匹配的/bin及之前的字符串一并删除
|
运算符%是相同的,只不过匹配的是后缀而不是前缀:
1
2
3
4
|
minipath="/usr/bin:/bin:/sbin"
echo ${minipath%/usr*} # 打印 nothing
echo ${minipath%/bin*} # 打印 /usr/bin:
echo ${minipath%%/bin*} # 打印 /usr ,就是%/bin 匹配的/bin及之后的字符串一并删除
|
分片切割
1
2
|
string="I'm a fan of dogs."
echo ${string:6:3} # 打印 fan
|
是否存在默认值
1
2
3
4
5
6
|
username=shuan_lu
unset username
echo ${username-default} # 打印 default
username=admin
echo ${username-default} # 打印 admin
|
对于测试是否设置了变量的操作,可以通过添加冒号(":")来强制检查变量是否已设置且是否为空:
1
2
3
4
5
|
foo=""
bar=""
echo ${foo-123} # 打印 nothing
echo ${bar:-456} # 打印 456
|
运算符=(或:=)类似于运算符-,只是如果变量没有值,它也会设置变量:
1
2
3
4
5
6
|
unset cache
echo ${cache:=1024} # 打印 1024
echo $cache # 打印 1024
echo ${cache:=2048} # 打印 1024
echo $cache # 打印 1024
|
单引号和双引号
- shell 会忽略单引号中所有的特殊字符,其中的所有内容都会被当作一个元素
- 双引号几乎与单引号相似。这里之所以说“几乎”是因为他们也会忽略所有特殊字符,除了:
1
2
3
4
5
|
world=Earth
foo='Hello, $world!'
bar="Hello, $world"
echo $foo # 打印 Hello, $world!
echo $bar # 打印 Hello, Earth
|
总结
| command |
释义 |
| A=“a b c def” |
将字符串复制给变量 |
A=cmd |
将命令结果赋给变量 |
| A=$(cmd) |
将命令结果赋给变量 |
| eval a=$$a |
间接调用 |
| i=2&&echo $((i+3)) |
计算后打印新变量结果 |
| i=2&&echo $[i+3] |
计算后打印新变量结果 |
| a=$((2>6?5:8)) |
判断两个值满足条件的赋值给变量,类似三目运算符 |
| $1 $2 $* |
位置参数 *代表所有 |
| env |
查看环境变量 |
| env |
grep “name” |
| set |
查看环境变量和本地变量 |
| read name |
输入变量 |
| readonly name |
把name这个变量设置为只读变量,不允许再次设置 |
| readonly |
查看系统存在的只读文件 |
| export name |
变量name由本地升为环境 |
| export name=“RedHat” |
直接定义name为环境变量 |
| export Stat$nu=2222 |
变量引用变量赋值 |
| unset name |
变量清除 |
| export -n name |
去掉只读变量 |
| shift |
用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1 |
| name + 0 |
将字符串转换为数字 |
| number " " |
将数字转换成字符串 |
| a=‘ee’;b=‘a’;echo ${!b} |
间接引用name变量的值 |
| : ${a=“cc”} |
如果a有值则不改变,如果a无值则赋值a变量为cc |