1、字符串替换
shell 遇到包含一个或多个特殊字符的表达式时,就会执行替换。
例如,
#!/bin/bash
URL="www.cjavapy.com"
echo -e "cjavapy = $URL \n no pain no gain"
输出:
$ bash demo.sh cjavapy = www.cjavapy.com no pain no gain
不使用-e选项的结果:
cjavapy = www.cjavapy.com \n no pain no gain
\n代表是换行符,echo命令支持的转义字符如下:
\a 警示字符
\b 退格
\c 忽略输出中最后的换行符号。这个参数之后的任何字符,包括后面的参数都会被忽略掉。
\f 清除屏幕
\n 换行
\r 回车
\t 水平制表符号
\v 垂直制表符号
\\ 反斜杠字符
注意:
1)可以使用-E选项禁用转义字符(反斜杠转义),默认就是这个选项。
2)可以使用-n选项不插入换行符。
例如,
#!/bin/bash
echo -n "c"
echo -n "java"
echo "py"
输出:
$ bash demo.sh
cjavapy
2、命令替换
命令替换是指将命令的输出结果赋值给某个变量。
用法:
variable=`commands`
variable=$(commands)
注意:variable 是变量名,commands 是要执行的命令。commands 可以只有一个命令,也可以有多个命令,多个命令之间以分号;分隔。
例如,
#!/bin/bash
DATE=`date`
echo "Date is $DATE"
USERS=`who | wc -l`
echo "Logged in user are $USERS"
UP=`date ; uptime`
echo "Uptime is $UP"
输出:
Date is 2021年 10月 04日 星期一 20:32:44 CST
Logged in user are 3
Uptime is 2021年 10月 04日 星期一 20:32:44 CST
20:32:44 up 339 days, 3:02, 3 users, load average: 0.01, 0.04, 0.08
3、变更替换
变量替换是能够根据变量的状态来操作变量的值。如下表,
表达式 | 含义 |
${var} | 变量var的值, 与$var相同 |
${var-DEFAULT} | 如果var没有被声明, 那么就以$DEFAULT作为其值 |
${var:-DEFAULT} | 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 |
${var=DEFAULT} | 如果var没有被声明, 那么就以$DEFAULT作为其值 |
${var:=DEFAULT} | 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 |
${var+OTHER} | 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串 |
${var:+OTHER} | 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串 |
${var?ERR_MSG} | 如果var没被声明, 那么就打印$ERR_MSG |
${var:?ERR_MSG} | 如果var没被设置, 那么就打印$ERR_MSG |
${!varprefix*} | 匹配之前所有以varprefix开头进行声明的变量 |
${!varprefix@} | 匹配之前所有以varprefix开头进行声明的变量 |
例如,
#!/bin/bash
echo ${var:-"cjavapy"}
echo "1 - c java py is ${var}"
echo ${var:="cjavapy"}
echo "2 - c java py is ${var}"
unset var
echo ${var:+"cjavapy"}
echo "3 - c java py is $var"
var="Prefix"
echo ${var:+"cjavapy"}
echo "4 - cj ava py is $var"
echo ${var:?"cjavapy"}
echo "5 - c java py is ${var}"
输出:
cjavapy 1 - c java py is cjavapy 2 - c java py is cjavapy 3 - c java py is cjavapy 4 - cj ava py is Prefix Prefix 5 - c java py is Prefix