Linux学习笔记-9. Shell编程

9.Shell编程

 

 

9.1.正则表达式

 

 

 

1、 正则表达式与通配符

a) 正则表达式用来在文件中匹配符合条件的字符串,正则包含匹配grepawksed等命令可以支持正则表达式。

b)   通配符用来匹配符合条件的文件名,通配符是完全匹配lsfindcp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。

2、基础正则表达式

 

 

元字符

作用

*

前一个字符匹配0次或任意多次

.

匹配除了换行符外任意一个字符

^

匹配行首。例如:^hello会匹配以hello开头的行

$

匹配我行尾。例如:hello$会匹配以hello结尾的行

[]

匹配中括号中指的任意一个字符,只匹配一个字符。

例如:[aeiou]匹配任意一个元音字母,[0-9]匹配任意一个数字,[a-z][0-9]匹配小写字母和一位数字构成的2位字符。

[^]

匹配除中括号内的字符以外的任意一个字符。

例如:[^0-9]匹配任意一个非数字字符,[^a-z]表示任意一位非小写字母

\

转义符。用于取消特殊符号的含义。

\{n\}

表示其前面的字符恰好出现n次。

例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码。

\{n,\}

表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字

\{n,m\}

表示其前面的字符至少出现n次,最多出现m次。

例如:[a-z]\{6,8\}匹配68位的小写字母。

 

 

匹配所有内容,包括空白行。因为*表示a匹配0次或任意多次,就是没有a一样会匹配。

grep "a*" testfile

 

 

匹配至少包含有一个a的行。*表达式是对其前一个字符有效,故b有无都可以,但是a要必须有。

grep "ab*" testfile

 

 

匹配至少包含2个连续a的字符串

grep "aab*" testfile

 

 

匹配至少包含4个连续a的字符串

grep "aaaab*" testfile

 

 

匹配在sd2个字母之间一定有2个字符的单词

grep “s..d” testfile

 

 

匹配在sd之间有任意字符

grep “s.*d” testfile

 

 

匹配任意内容

grep “.*” testfile

 

 

匹配空白行

grep –n “^$” testfile

 

 

 9.2.字符串截取命令

 

9.2.1.cut字段提取命令

 

 

  

grep是提取的行,cut提取的是列。

 

语法:cut [选项] 文件名

 

-f 列号:提取第几列

-d 分隔符:按照指定分隔符分隔列

 

 

成绩单:中间是Tab键,不能是空格,否则cut匹配不了

[root@localhost ~]# cat student.xt

ID      Name    gender  Mark

1       xiaoliu M       98

2       lisi    M       99

3       wangwu  M       100

 

 

 

提取第2列:Name

[root@localhost ~]# cut -f 2 student.xt

Name

xiaoliu

lisi

wangwu

 

 

第取24列:列之间逗号分隔即可

[root@localhost ~]# cut -f 2,4 student.xt

Name    Mark

xiaoliu 98

lisi    99

wangwu  100

 

 

cut命令的默认分隔符是一个制作符(Tab键),通过-d选项可以指定分隔符

[root@localhost ~]# cut -d : -f 1,3 /etc/passwd

root:0

bin:1

daemon:2

adm:3

lp:4

sync:5

shutdown:6

halt:7

mail:8

operator:11

games:12

ftp:14

nobody:99

systemd-network:192

dbus:81

polkitd:999

postfix:89

sshd:74

test:1000

test2:1001

 

 

现在假设要删除普通用户,要如何做?

 

登录Shell/bin/bash的才可以登录的,普通用户都是这个Shell

 

如下命令提取出来所有普通用户的用户名,要删除就方便了

[root@localhost ~]# cat /etc/passwd|grep /bin/bash|grep -v root|cut -d : -f 1

test

test2

 

 

cut命令的局限性

cut的分隔符必须是制表符,或者具体的分隔符,例如冒号:等。

 

如下所示:cut命令并没有起作用,这个是因为分隔符不是制表符,而是空格

[root@localhost ~]# df -h|cut -f 5

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   17G  1.2G   16G   7% /

devtmpfs                 446M     0  446M   0% /dev

tmpfs                    456M     0  456M   0% /dev/shm

tmpfs                    456M  6.1M  450M   2% /run

tmpfs                    456M     0  456M   0% /sys/fs/cgroup

/dev/sda1               1014M  125M  890M  13% /boot

tmpfs                     92M     0   92M   0% /run/user/0

[root@localhost ~]#

 

 

如下所示指定空格作为分隔时,匹配出来的是空白,是因为cut命令只接收一个空格做为分隔,所以分隔符为空格时,cut命令使用起来并不是非常符合我们想像的那样。

[root@localhost ~]# df -h|cut -f 5 -d " "

 

 

 

 

 

 

 

 

[root@localhost ~]#

 

 

 9.2.2.printf格式化打印命令

 

 格式化打印命令

 

 

语法:printf ‘输出类型输出格式输出内容

 

输出类型:

输出类型

作用

%ns

输出字符串。n是数字,表示输出几个字符

%ni

输出整数。n是数字,表示输出几个数字

%m.nf

输出浮点数。mn是数字,表示输出的浮点数全部位数和小数位数。

%8.2f代表输出8位整数,其中2位是小数,6位是整数。

 

 

输出格式:

输出格式

作用

\a

输出警告声音

\b

输出退格键,也就是Baskspace

\f

清除屏幕

\n

换行

\r

回车,也就是Enter

\t

水平输出退格键,也就是Tab

\v

垂直输出退格键,也就是Tab

 

 

基本输出,没有换行

[root@localhost ~]# printf %s 1 2 3 4 5 6

123456[root@localhost ~]#

 

 

%s都输出了,是因为输出类型需要使用单引号括起来

123456[root@localhost ~]# printf %s %s %s 1 2 3 4 5 6

%s%s123456[root@localhost ~]#

 

 

正确输出:

[root@localhost ~]# printf '%s %s %s\n' 1 2 3 4 5 6

1 2 3

4 5 6

[root@localhost ~]#

 

 

printf不支持后面根文件名,读取文件;也不支持通过管道符来输入格式化内容,需要使用如下方式:

如下所示,但是格式全乱掉了:

[root@localhost ~]# printf '%s' $(cat student.xt)

IDNamegenderMark1xiaoliuM982lisiM993wangwuM100[root@localhost ~]#

 

printf通常情况下和awk命令一起使用。

 

通过指定格式,可以将文件内容输出我们想要的格式:

[root@localhost ~]# printf '%s\t%s\t%s\t%s\n' $(cat student.xt)

ID      Name    gender  Mark

1       xiaoliu M       98

2       lisi    M       99

3       wangwu  M       100

[root@localhost ~]#

 

 

 

awk命令的输出中支持printprintf命令

printprint会在每个输出之后自动加入一个换行符,Linux默认没有print命令,是awk的。

printfprintf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加换行符。

 

 

 9.2.3.awk

 

 

  

cut局限性是空格支持不是非常完美。

awk命令也是提取列内容的。支持管道符。但是比较复杂,通常cut能完成的,还是用cut

 

1awk

语法:awk ‘条件1{动作1} 条件2{动作2}...’ 文件名

 

条件:

一般使用关系表达式作为条件,条件非常多,简单举例几个:

x>10 判断变量x是否大于10

x>=10 大于等于

x<=10 小于等于

 

主要的动作:

格式化输出

流程控制语句

 

 

条件可以省略,直接执行动作

[root@localhost ~]# awk '{printf $2 "\t" $4"\n"}' student.xt

Name    Mark

xiaoliu 98

lisi    99

wangwu  100

[root@localhost ~]#

 

 

通过awk命令就可以提取df命令的输出了:

[root@localhost ~]# df -h|awk '{printf $5 "\t" $6"\n"}'

Use%    Mounted

7%      /

0%      /dev

0%      /dev/shm

2%      /run

0%      /sys/fs/cgroup

13%     /boot

0%      /run/user/0

[root@localhost ~]#

 

 

2BEGIN

开始,是大写,表示的是执行后面所有动作之前,执行BEGIN紧跟的动作。

 

[root@localhost ~]# awk 'BEGIN{print "Test BEGIN."}{printf $2 "\t" $4"\n"}' student.xt

Test BEGIN.

Name    Mark

xiaoliu 98

lisi    99

wangwu  100

[root@localhost ~]#

 

 

通过BEGIN,可以指定一些前置操作,例如,指定分隔符:{FS=”:”}

FS是内置变量,默认是制表符

 

[root@localhost ~]# awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin     1

daemon  2

adm     3

...

test    1000

test2   1001

[root@localhost ~]#

上面输出内容可以看了第1行并未格式化,这是因为awk处理过程是:先读入一行数据,然后再去执行输出格式化。

即读出第1行的时候,分隔符已经默认为制表符了,然后这个时候才设定分隔符是冒号,已经来不及了。

 

通过BEGIN关键字,可以让awk在执行输出之前先执行指定分隔符动作。

[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd

root    0

bin     1

...

test    1000

test2   1001

[root@localhost ~]#

 

 

3END

在所有动作执行完成后,执行END紧跟动作。

[root@localhost ~]# awk 'BEGIN{print "Test BEGIN."}END{print "Test END"}{printf $2 "\t" $4"\n"}' student.xt

Test BEGIN.

Name    Mark

xiaoliu 98

lisi    99

wangwu  100

Test END

[root@localhost ~]#

 

 

4、关系运算符

 

对于学生成绩表,只输出成绩大于或等于99的学生及成绩。因为标题列不是数字,不能比较,所以通过grep命令排除掉了标题列

[root@localhost ~]# cat student.xt |grep -v Name|awk '$4>=99{print $2 "\t" $4}'

lisi    99

wangwu  100

[root@localhost ~]#

 

 

9.2.4.sed

 

 

1sed

set是一种几乎包括在所有UNIX平台,包括Linux的轻量级流编辑器set主要是用来将数据进行选取,替换,删除,新增的命令。

 

支持管道符操作。

 

主要用在对命令的结果编辑处理上。

 

语法:sed [选项] ‘[动作]’ 文件名

 

选项:

选项

作用

-n

一般set命令会把所有数据都输出到屏幕,如果加入此选项,则只会把经过set命令处理的行输出到屏幕。

-e

允许对输入数据应用多条set命令编辑

-i

set的修改结果直接修改读取数据的文件,而不是由屏幕输出。

 

 

动作:

动作

作用

a \

追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用\代表数据未完结。

c \

行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用\代表数据未完结。

i \

插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用\代表数据未完结。

d

删除,删除指定的行

p

打印,输出指定的行。

s

字符串替换,用一个字符串替换另外一个字符串。格式为行范围s/旧字符串/新字符串/g”,和vim中的替换格式类似。

 

 

打印第2行到屏幕:

[root@localhost ~]# sed '2p' student.xt

ID      Name    gender  Mark

1       xiaoliu M       98

1       xiaoliu M       98

2       lisi    M       99

3       wangwu  M       100

 

 

上面的命令除了第2行,其他的都打印出来了,所以需要通过-n选项,只打印sed处理过的行。

[root@localhost ~]# sed -n '2p' student.xt

1       xiaoliu M       98

[root@localhost ~]#

 

 

支持管道操作:

[root@localhost ~]# df -h|sed -n '2p'

/dev/mapper/centos-root   17G  1.2G   16G   7% /

[root@localhost ~]#

 

 

删除第23行,这个删除只会影响屏幕输出,不会写到文件,因为没有指定-i选项:

[root@localhost ~]# cat student.xt

ID      Name    gender  Mark

1       xiaoliu M       98

2       lisi    M       99

3       wangwu  M       100

[root@localhost ~]# sed '2,3d' student.xt

ID      Name    gender  Mark

3       wangwu  M       100

[root@localhost ~]#

[root@localhost ~]# sed '1,3d' student.xt

3       wangwu  M       100

 

 

2第后追加一行:

[root@localhost ~]# sed '2a hello' student.xt

ID      Name    gender  Mark

1       xiaoliu M       98

hello

2       lisi    M       99

3       wangwu  M       100

[root@localhost ~]#

 

 

在第2行前插入一行

[root@localhost ~]# sed '2i hi!' student.xt

ID      Name    gender  Mark

hi!

1       xiaoliu M       98

2       lisi    M       99

3       wangwu  M       100

[root@localhost ~]#

 

 

将第2行替换掉

[root@localhost ~]# sed '2c replace row.' student.xt

ID      Name    gender  Mark

replace row.

2       lisi    M       99

3       wangwu  M       100

[root@localhost ~]#

 

 

字符串替换,将第4行的100分替换为96

[root@localhost ~]# sed '4s/100/96/g' student.xt

ID      Name    gender  Mark

1       xiaoliu M       98

2       lisi    M       99

3       wangwu  M       96

[root@localhost ~]#

 

 

-e选项支持多个动作,多个动作之间以分号分隔,如果没有指定行号的表示应用的所有内容。

[root@localhost ~]# sed -e 's/100/96/g;s/wangwu/zhaoliu/g' student.xt

ID      Name    gender  Mark

1       xiaoliu M       98

2       lisi    M       99

3       zhaoliu M       96

[root@localhost ~]#

 

 

 

9.3.字符处理命令

 

 

1、排序命令sort

 

语法:sort [选项] 文件名

 

选项:

选项

作用

-f

忽略大小写

-n

以数值型进行排序,默认使用字符串型排序

-r

反向排序

-t

指定分隔符,默认分隔符是制表符

-k n[,m]

按照指定的字段范围排序。从第n字段开始,m字段结束,默认到行尾。

 

 

         正序排序:

[root@localhost ~]# sort /etc/passwd

adm:x:3:4:adm:/var/adm:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

halt:x:7:0:halt:/sbin:/sbin/halt

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

polkitd:x:999:997:User for polkitd:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

root:x:0:0:root:/root:/bin/bash

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

test2:x:1001:1002::/home/test2:/bin/bash

test:x:1000:1000:This is a test user:/home/test:/bin/bash

[root@localhost ~]#

 

 

反向排序:

[root@localhost ~]# sort -r /etc/passwd

test:x:1000:1000:This is a test user:/home/test:/bin/bash

test2:x:1001:1002::/home/test2:/bin/bash

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

root:x:0:0:root:/root:/bin/bash

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

polkitd:x:999:997:User for polkitd:/:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

halt:x:7:0:halt:/sbin:/sbin/halt

games:x:12:100:games:/usr/games:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@localhost ~]#

        

        

         使用用户的ID进行排序,以数值型进行排序,列之间分隔为冒号:

         [root@localhost ~]# sort -n -t ":" -k 3,3 /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

polkitd:x:999:997:User for polkitd:/:/sbin/nologin

test:x:1000:1000:This is a test user:/home/test:/bin/bash

test2:x:1001:1002::/home/test2:/bin/bash

[root@localhost ~]#

 

 

2、统计命令wc

语法:wc [语法] 文件名

 

-l 只统计行数

-w 只统计单词

-m 只统计字符数

 

 

统计/etc/passwd文件的行数,单词,及字符数

[root@localhost ~]# wc /etc/passwd

 20  32 897 /etc/passwd

[root@localhost ~]# wc -l /etc/passwd

20 /etc/passwd

[root@localhost ~]# wc -w /etc/passwd

32 /etc/passwd

[root@localhost ~]# wc -m /etc/passwd

897 /etc/passwd

[root@localhost ~]# wc -lwm /etc/passwd

 20  32 897 /etc/passwd

[root@localhost ~]#

 

 

支持管道操作:

[root@localhost ~]# cat /etc/passwd|wc

     20      32     897

[root@localhost ~]#

 

 

 

9.4.条件判断

 

 

 

1、按照文件类型进行判断

 

测试选项

作用

-b 文件

判断该文件是否存在,并且是否为块设备文件,是块设备文件为真

-c 文件

判断该文件是否存在,并且是否为字符设备文件,是字符设备文件为真

-d 文件

判断该文件是否存在,并且是否为目录文件,是目录为真

-e 文件

判断该文件是否存在,存在为真

-f 文件

判断该文件是否存在,并且是否为普通文件,是普通文件为真

-L 文件

判断该文件是否存在,并且是否为符号链接文件,是符号 链接文件为真

-p 文件

判断该文件是否存在,并且是否为管道文件,是管道文件为真

-s 文件

判断该文件是否存在,并且是否为非空,非空为真

-S 文件

判断该文件是否存在,并且是否为套接字文件,是套接字文件为真

 

 

2、判断2种格式

a)  test –e /root/install.log

b)   [ -e testfile ],注意中括号给你表达式之间要有1个空格,必须要有。表达式与参数之间也要有1个空格

 

 

$?表示上1条命令执行结果,0表示执行成功

[root@localhost ~]# test -e testfile

[root@localhost ~]# echo $?

0

 

没有空格会报错:

[root@localhost ~]# [-e testfile]

-bash: [-e: command not found

[root@localhost ~]# [ -e testfile]

-bash: [: missing `]'

 

加上空格可以正确执行

[root@localhost ~]# [ -e testfile ]

[root@localhost ~]# echo $?

0

[root@localhost ~]#

 

 

3、按照文件权限进行判断

 

测试选项

作用

-r 文件

判断该文件是否存在,并且是否拥有读权限,有读权限为真

-w 文件

判断该文件是否存在,并且是否为拥有写权限,有写权限为真

-x 文件

判断该文件是否存在,并且是否为拥有执行权限,有执行权限为真

-u 文件

判断该文件是否存在,并且是否为拥有SUID权限,有SUID权限为真

-g 文件

判断该文件是否存在,并且是否为拥有SGID权限,有SGID权限为真

-k 文件

判断该文件是否存在,并且是否为拥有SBIT权限,有SBIT权限为真

 

 

判断是否有写权限和执行权限:

[root@localhost ~]# ll

total 1032

-rw-------. 1 root root    1283 Apr 22 16:09 anaconda-ks.cfg

drwxr-xr-x. 2 root root      83 May  5 19:57 sh

-rw-r--r--. 1 root root      62 May  6 17:02 student.xt

-rw-r--r--. 1 root root 1048576 May  5 13:49 testfile

 [root@localhost ~]# [ -w student.xt ] && echo yes || echo no

yes

[root@localhost ~]# [ -x student.xt ] && echo yes || echo no

no

[root@localhost ~]#

4、两个文件之间进行比较

 

测试选项

作用

文件1 –nt 文件2

判断文件1的修改时间是否比文件2新,如果为新则为真

文件1 –ot 文件2

判断文件1的修改时间是否比文件2旧,如果为旧则为真

文件1 –ef 文件2

判断文件1是否和文件2Inode号一致,可以理解为2个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法。

 

 

判断2个文件谁最新:

[root@localhost ~]# ll

total 1032

-rw-------. 1 root root    1283 Apr 22 16:09 anaconda-ks.cfg

drwxr-xr-x. 2 root root      83 May  5 19:57 sh

-rw-r--r--. 1 root root      62 May  6 17:02 student.xt

-rw-r--r--. 1 root root 1048576 May  5 13:49 testfile

[root@localhost ~]# [ student.xt -nt testfile ]

[root@localhost ~]# [ student.xt -nt testfile ]&&echo yes||echo no

yes

[root@localhost ~]#

5、两个整数之间比较

 

测试选项

作用

整数1 –eq 整数2

等于

整数1 –ne 整数2

不等于

整数1 –gt 整数2

大于

整数1 –lt 整数2

小于

整数1 –ge 整数2

大于等于

整数1 –le 整数2

小于等于

 

 

表达式与整数之间要有1个空格

[root@localhost ~]# [ 1 -eq 1 ]&&echo yes||echo no

yes

[root@localhost ~]# [ 1 -ne 1 ]&&echo yes||echo no

no

[root@localhost ~]#

 

6、字符串的判断

 

测试选项

作用

-z 字符串

判断字符串是否为空,为空则为真

-n 字符串

判断字符串是否为非空,非空返回真

字符串1 == 字符串2

2个字符串是否相等

字符串1 != 字符串2

2个字符串是否不相等。

 

 

name赋值为acc

[root@localhost ~]# name=acc

 

判断是否为空

[root@localhost ~]# [ -z "$name" ]&&echo yes||echo no

no

 

判断不存在的变量是否为空

[root@localhost ~]# [ -z "$name1" ]&&echo yes||echo no

yes

 

判断是否为非空

[root@localhost ~]# [ -n "$name" ]&&echo yes||echo no

yes

 

判断是否相等

[root@localhost ~]# [ "$name" == "acc" ]&&echo yes||echo no

yes

 

判断是否相等,输入不相等的字符串

[root@localhost ~]# [ "$name" == "acc1" ]&&echo yes||echo no

no

[root@localhost ~]#

 

 

7、多重条件判断

 

测试选项

作用

判断1 –a 判断2

逻辑与

判断1 –o 判断2

逻辑或

!判断

逻辑非

 

 

[root@localhost ~]# [ "$name" == "acc" -a 1 -gt 2 ]&&echo yes||echo no

no

[root@localhost ~]#

 

 

 

 

 

 

 

猜你喜欢

转载自wlcacc.iteye.com/blog/2422834