四、shell替换:变量、命令、转义字符的替换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/play_chess_ITmanito/article/details/76912336

(1)变量替换:
根据变量的状态(是否定义,赋值,为空)来进行替换

 形式         说明
${var}         变量本来的值
${var:-hello}  如果var变量为空或者已经被unset之后,返回hello,但是不改变var的值
${var:=hello}  如果var变量为空或者已经被unset之后,返回hello,并将var的值设置为hello
${var:?message}        如果var变量为空或者已经被unset之后,则将message消息送到标准错误输出界面,主要用来检查变量var是否可以被正常赋值
${var:+hello}  如果变量var被定义之后,返回hello,但是不改变var的值

eg1:vi a.sh
#!/bin/bash

var=1
unset var
echo ${var:-"变量没被赋值"}
echo "1---变量值是${var}"

结果:
[root@h data]# chmod +x ./a.sh 
[root@h data]# ./a.sh 
变量不会被赋值
1--变量值是
eg2:
var="hello"
unset var
echo ${var:="变量被赋值"}
echo "2---变量值是${var}"

结果:
[root@h data]# vi a1.sh
[root@h data]# /bin/sh a1.sh 
变量被赋值
2---变量值是变量被赋值
eg3:
var=1
unset var
echo ${var:+"这是默认值"}
echo "3---变量值是${var}"

结果:
[root@h data]# vi a2.sh
[root@h data]# /bin/sh a2.sh 

3---变量值是

eg4:
var="hello shell"
echo ${var:+"这是默认值"}
echo "4---变量值是${var}"

echo ${var:?"返回message吗"}
echo "5---变量值是${var}"


结果:
[root@h data]# vi a3.sh
[root@h data]# /bin/sh a3.sh 
这是默认值
4---变量值是hello shell
hello shell
5---变量值是hello shell
eg5:
var="hello shell"
echo ${var:+"这是默认值"}
echo "4---变量值是${var}"

unset var
echo ${var:?message}
echo "5---变量值是${var}"

结果:
[root@h data]# /bin/sh a4.sh 
这是默认值
4---变量值是hello shell
a3.sh: line 6: var: message

(2)命令替换:
☞shell脚本可以先执行命令,将输出结果暂时保存,在合适的地方输出

命令替换的格式:

`命令`

查看并且修改Linux系统时间
查看系统时间:

[root@h data]# date
Tue Jun 27 19:02:52 CST 2017
设置系统时间:
[root@h data]# date -s "20170727 09:50:40"
Thu Jul 27 09:50:40 CST 2017
eg1:
#!/bin/bash
d=`date`
echo "d 是$d"

统计该虚拟机的用户数:

[root@h data]# who | wc -l
4
eg2:(把命令执行结果保存到变量中)wordcount
#!/bin/bash
user=`who | wc -l`
echo "登录的用户数是$user"
eg3:
ls=`ls | wc`
echo "结果1:$ls"

l=`ls | wc -l`
echo "结果2:$l"
结果:
[root@h data]# vi b2.sh
[root@h data]# /bin/sh b2.sh 
结果13      15     146
结果23

3行(当前文件夹下文件数),15个单词,146个字节,wc -l只输出文件行数
ls |wc 是统计你这个目录下的文件数目。
ls |wc -l是输出第一个结果即3 即文件的数目。

[root@h data]# ls -l | wc -l
9
[root@h data]# ls
a1.sh  a2.sh  a3.sh  a.log  a.sh  b1.sh  b2.sh  b.sh
[root@h data]# ll   (total 32-----32代表32字节)
total 32
-rw-r--r--. 1 root root  83 Jul 25 19:34 a1.sh
-rw-r--r--. 1 root root  77 Jul 25 19:36 a2.sh
-rw-r--r--. 1 root root 141 Jul 25 19:44 a3.sh
-rwxrwxrwx. 1 root root  23 Jul 27 10:11 a.log
-rwxr-xr-x. 1 root root  98 Jul 25 19:29 a.sh
-rw-r--r--. 1 root root  65 Jul 27 09:58 b1.sh
-rw-r--r--. 1 root root  72 Jul 27 10:03 b2.sh
-rwxr-xr-x. 1 root root  37 Jul 27 09:54 b.sh

(3)转义字符的替换
表达式里含有特殊字符,shell将会进行替换

转义字符    意义
    \\      反斜杠
    \a      警报,响铃
    \b      (BackSpace)删除
    \f      换页(FF),下一页
    \n      换行
    \r      回车
    \t      (tab)8个字节,一个水平制表符
    \v      垂直制表符

-E和不加-e都是禁止对特殊字符进行转义
-n禁止换行,不可以写换行符

-e表对转义字符进行替换。
不加-e:

[root@h data]# ./a.sh 
好久不见,hello\n焦美琪
eg:
#!/bin/bash
var="hello"
echo "好久不见,${var}"
echo "焦美琪"
结果:
[root@h data]# ./a.sh 
好久不见,hello
焦美琪 

猜你喜欢

转载自blog.csdn.net/play_chess_ITmanito/article/details/76912336