一、shell脚本介绍

(一)脚本案例及介绍:

#!/bin/bashLOG_DIR=/var/logROOT_UID=0
if ["$UID -ne "$ROOT_UID"]
thenecho "must be root run this script."exit 1ficd $ LOG_DIR || {echo "cannot change to necessary directory"exit 1}cat /dev/null>message && {echo "logs cleaned up."exit 0}echo "logs cleaned fail."exit 1

(二)shell脚本解释器:

[root@web01 ~]# echo $SHELL
/bin/bash
[root@web01 ~]# ll  /bin/sh
lrwxrwxrwx. 1 root root 4 Oct 10  2018 /bin/sh -> bash

解释器默认为bash,如果脚本中不标明解释器,默认调用bash。

批量注释方法1:ctrl+shift+v,光标向下移动,shitf+a,第一行前#,esc。

批量注释方法2:将要注释的内容写在下面符号内::<<EOF XXX EOF.冒号表示什么的都不做。

批量注释方法3:cat >/dev/null<<EOF XXX EOF

(三)shell执行方法:

方法1:bash,sh

方法2:/path/script-name 或者./script-name

方法3:source script-name 或者.script-name

方法4:sh<script-name 或者 cat scripts-name | sh

实例:

[root@web01 scripts01]# bash test.sh
i am oldboy teacher.
[root@web01 scripts01]# sh test.sh
i am oldboy teacher.
[root@web01 scripts01]# ./test.sh
-bash: ./test.sh: Permission denied
[root@web01 scripts01]# /server/scripts01/test.sh
-bash: /server/scripts01/test.sh: Permission denied
[root@web01 scripts01]# ls -l test.sh
-rw-r--r-- 1 root root 127 Jan 18 23:12 test.sh
[root@web01 scripts01]# chmod +x test.sh
[root@web01 scripts01]# /server/scripts01/test.sh
i am oldboy teacher.
[root@web01 scripts01]# sh < test.sh
i am oldboy teacher.
[root@web01 scripts01]# cat test.sh | sh
i am oldboy teacher.
[root@web01 scripts01]#

实例:

[root@web01 scripts01]# chkconfig --list | grep 3:on | awk '{print "chkconfig", $1,"off"}'
chkconfig crond off
chkconfig network off
chkconfig rsyslog off
chkconfig sshd off
[root@web01 scripts01]# chkconfig --list | grep 3:on | awk '{print "chkconfig", $1,"off"}' | bash
[root@web01 scripts01]# chkconfig --list | grep 3:on

方法3:source script-name 或者.script-name

[root@web01 scripts01]# cat test1.sh
user=`whoami`
[root@web01 scripts01]# sh test1.sh
[root@web01 scripts01]# echo $user[root@web01 scripts01]#
# sh 相当于在当前shell下新开启一个子shell,所以echo $user,在当前开启shell下执行。
[root@web01 scripts01]# source test1.sh
[root@web01 scripts01]# echo $user
root
[root@web01 scripts01]#
#source 相当于在当前shell下执行。
父shell
子shell
使用source 和.来执行脚本,相当于在一个shell执行脚本,可以相互调用。
使用bash或者sh执行脚本,开启一个新的shell,或者开启子shell。
[root@web01 scripts01]# vim 1.sh
sh test1.sh
echo $user
[root@web01 scripts01]# sh 1.sh[root@web01 scripts01]# cat 1.sh
sh test1.sh
echo $user[root@web01 scripts01]# cat 1.sh
. ./test1.sh
echo $user[root@web01 scripts01]# sh 1.sh
root
使用source 和.可以相互调用父shell和子shell。

(四)shell执行过程:

父shell脚本-外部命令-子脚本-父shell

父shell和子shell之间不能相互调用:如果希望相互调用,使用source和点.来执行。

shell脚本编程规范和习惯:

①开头加解释器:#!/bin/bash

②附带作者及版权信息:oldboy at dddd

③脚本扩展名:.sh

④脚本存放固定位置:/server/scripts

⑤脚本中不使用中文。

⑥成对的符号一次书写完成。中括号,两边需空格

⑦循环格式一次性输入完成。

二、变量的基础知识(书本第三章)

shell中变量中不定义变量类型。shell变量是否为了方便调用。

shell变量:环境变量(全局变量),普通变量(局部变量)

shell 不区分类型,使用的时候区分变量类型。

(一)shell变量分类:

环境变量:全局变量,显示环境变量:echo $变量;env;set

定义环境变量:系统固有:PS1,PATH,HOME,UID

方法1

export OLDBOY=1;

方法2

OLDBOY=1

export OLDBOY

永久生效的方法:

添加至/etc/profile ; . /etc/profile

方法3

declare -x A=1

取消环境变量:unset 变量

环境变量的文件:

全局文件

/etc/profile

/etc/bashrc

用户环境变量文件

~/.bashrc

~/.bash_profile

环境变量生效的的顺序:

①~/.bash_profile

②~ /.bashrc

③/etc/bashrc

④/etc/profile

登录shell:

先加载/etc/profile ;/.bash_profile,然后加载/.bashrc ;再次加载/etc/bashrc(生效顺序相反)

普通变量:局部变量。

当前用户或者脚本中生效。

①字符串变量

②变量名:字母,数字,下划线,不能以数字开头。

变量名定义规则:见名知意。首字母,下划线连接单词。

③变量内容:字符串,

单引号:所见即所得。

不用引号,双引号:先解析变量或者命令,然后输出。

双引号可以把要定义的内容作为一个整体。纯数字不加引号。

命令变量:反引号,括号

变量名=`ls`
变量名=$(ls)

普通变量总结:

①在脚本中定义普通字符串变量,尽量把变量的内容使用双引号。

②纯数字的变量内容可以不加引号。

③希望变量的内容原样输出需要加单引号。

④希望变量值引用命令并获取命令的结果就用反引号或者$()

⑤$db_t,若变量后面有其他字符连接的时候,就必须给变量加上大括号{},例如$db_t就要改成${db}_t。

⑥变量名的定义要有一定的命令规范,并且要见名知意。

⑦变量定义使用赋值符号(=),赋值符号两端不要有空格。

三、SHELL变量知识进阶与实践(4章)

(一)shell特殊位置变量

$0:获取脚本的名字,如果脚本前跟着路径的话,那就获取路径加上脚本名字。
企业应用:一般在脚本最后,使用$0获取脚本的路径和名字给用户。$n:获取脚本后的第n个参数,n大于9以后,数字需要用大括号括起来。
企业应用:脚本中,提取第n个参数。$#:脚本后所有参数的个数。
企业应用:判断参数个数。$*:获取shell脚本中所有的参数。所有单数是一个整体:"$1,$2,$3"
$@:获取脚本的所有参数。每个参数是一个整体:"$1","$2","$3"
当需要接收脚本后所有参数,但是又不知道个数的时候,使用$*,$#
两者区别:
[root@centos6-kvm3 scripts]# cat test.sh
#!/bin/bash
for arg in "$*"
doecho $arg
doneecho ------
for arg1 in "$@"
doecho $arg1
doneecho $#[root@centos6-kvm3 scripts]# bash test.sh "i am" oldboy teacher.
i am oldboy teacher.
------
i am
oldboy
teacher.
3
[root@centos6-kvm3 scripts]#

(二)shell进程特殊状态变量

$?:获取上一个命令的返回值,返回值为0,表示成功,非0,表示失败。
$$:获取当前执行脚本的进程号。
$!:获取上一个后台工作的进程的进程号。
$_:获取在此前执行命令或者脚本的最后一个参数。

(三)shell变量子串知识及实践(变量内容)

[root@centos6-kvm3 scripts]# oldboy="i am oldboy"
[root@centos6-kvm3 scripts]# echo ${oldboy}
i am oldboy
${#变量}:获取变量字符个数。
[root@centos6-kvm3 scripts]# echo ${#oldboy}
11
[root@centos6-kvm3 scripts]# echo ${oldboy}|wc -L
11
计算变量字符个数方法2:
[root@centos6-kvm3 scripts]# expr length "$oldboy"
11
计算变量字符个数方法3:
[root@centos6-kvm3 scripts]# echo $oldboy| awk '{print length }'
11
[root@centos6-kvm3 scripts]# echo $oldboy| awk '{print length($0) }'
11
[root@centos6-kvm3 scripts]# echo $oldboy| awk '{print length($1) }'
1
获取变量第二个参数后参数:
[root@centos6-kvm3 scripts]# echo ${oldboy:2}
am oldboy
[root@centos6-kvm3 scripts]# echo ${oldboy:2:2}
am
[root@centos6-kvm3 scripts]#${参数#字符串}:匹配开头,删除最短匹配。
[root@centos6-kvm3 scripts]# OLDBOY=abcABC12345ABCabc
[root@centos6-kvm3 scripts]# echo ${OLDBOY}
abcABC12345ABCabc
[root@centos6-kvm3 scripts]# echo ${OLDBOY#a*C}
12345ABCabc
${参数##字符串}:匹配开头,删除最长匹配。
[root@centos6-kvm3 scripts]# echo ${OLDBOY##a*C}
abc
${参数%字符串}:匹配结尾,删除最短匹配。
[root@centos6-kvm3 scripts]# echo ${OLDBOY%a*c}
abcABC12345ABC
${参数%%字符串}:匹配结尾,删除最长匹配。
[root@centos6-kvm3 scripts]# echo ${OLDBOY%%a*c}[root@centos6-kvm3 scripts]# ${变量/part/string}:使用string替换part第一个匹配项。
[root@centos6-kvm3 scripts]# oldboy="i am oldboy oldboy"
[root@centos6-kvm3 scripts]# echo ${oldboy/oldboy/oldgirl}
i am oldgirl oldboy
${变量//part/string}:使用string替换part所有匹配项。
[root@centos6-kvm3 scripts]# echo ${oldboy//oldboy/oldgirl}
i am oldgirl oldgirl
[root@centos6-kvm3 scripts]#

(四)shell特殊变量扩展知识

result=${变量:-word}:当变量为空时候,将word赋值给result。冒号可以省略。
[root@centos6-kvm3 scripts]# result=${test:-UNSET}
[root@centos6-kvm3 scripts]# echo $result
UNSET
[root@centos6-kvm3 scripts]# echo $test企业应用:
[root@centos6-kvm3 scripts]# find ${path:-/tmp} -name  "*.log" -mtime +7| xargs rm -f
[root@centos6-kvm3 scripts]#result=${变量:=word},变量为空时候,work复制给result,同时复制给变量。
[root@centos6-kvm3 scripts]# result=${test:=UNSET}
[root@centos6-kvm3 scripts]# echo ${result}
UNSET
[root@centos6-kvm3 scripts]# echo ${test}
UNSET
[root@centos6-kvm3 scripts]# ${变量:?word}:当变量为空时候,提示word。[root@centos6-kvm3 scripts]# result=${test1:?变量为空}
-bash: test1: 变量为空
[root@centos6-kvm3 scripts]# echo $result
UNSET
[root@centos6-kvm3 scripts]# echo $test1[root@centos6-kvm3 scripts]# test1=oldboy
[root@centos6-kvm3 scripts]# result=${test1:?变量为空}
[root@centos6-kvm3 scripts]# echo $result
oldboy
[root@centos6-kvm3 scripts]#${变量:+word}:如果前面变量为空,什么不做,如果不为空,进行覆盖。
[root@centos6-kvm3 scripts]# result1=${test2:+wordk}
[root@centos6-kvm3 scripts]# echo ${result1}[root@centos6-kvm3 scripts]# echo ${test2}[root@centos6-kvm3 scripts]# test2=2
[root@centos6-kvm3 scripts]# result1=${test2:+wordk}
[root@centos6-kvm3 scripts]# echo ${result1}
wordk
[root@centos6-kvm3 scripts]# echo ${test2}
2
[root@centos6-kvm3 scripts]#

四、shell变量的数据计算(5章)

(一)算数运算符:

+,-
*,/,%
**:幂运算,最先计算。
++,--
!,&&,||
<,>,<=
==,!=,=
<<,>>:向左,右移位。
~,|,&,^:按位取反,按位异或,按位与,按位或
=,+=,-=,*=,/=,%=

(二)编程常见运算命令

只适合整数:
①(())
[root@centos6-kvm3 ~]# i=$a+1
[root@centos6-kvm3 ~]# echo $i
1+1
[root@centos6-kvm3 ~]# echo $((a+3))
4
[root@centos6-kvm3 ~]# echo $((2**3))
8
[root@centos6-kvm3 ~]# echo $((1+2**3-5%3))
7
[root@centos6-kvm3 ~]# ((i++))
[root@centos6-kvm3 ~]# echo $i
3
②let
[root@centos6-kvm3 ~]# a=1
[root@centos6-kvm3 ~]# i=$a+1
[root@centos6-kvm3 ~]# let i=$a+1
[root@centos6-kvm3 ~]# echo $i
2
③expr
[root@centos6-kvm3 ~]# expr 2 + 3
5
[root@centos6-kvm3 ~]# expr 2*2
2*2
[root@centos6-kvm3 ~]# expr 2 * 2
expr: syntax error
[root@centos6-kvm3 ~]# expr 2 \* 2
4
④$[]
[root@centos6-kvm3 ~]# echo $[2-3]
-1
[root@centos6-kvm3 ~]# echo $[1+3]
4
既适合整数,又适合小数:
①bc
[root@centos6-kvm3 ~]# bc
1+2
3
2-1
1
[root@centos6-kvm3 ~]# echo 1.1+2| bc
3.1
②awk
[root@centos6-kvm3 ~]# echo 2.1 1.4| awk '{print $1*$2}'
2.94
[root@centos6-kvm3 ~]# echo 2.1 1.4| awk '{print $1-$2}'
0.7

(三)expr的企业级实战案例详解

判断一个是否为整数:

[root@centos6-kvm3 ~]# expr 2 + 3
5
[root@centos6-kvm3 ~]# expr 2 + a
expr: non-numeric argumentoot@centos6-kvm3 ~]# echo $?
2
[root@centos6-kvm3 ~]# a=2
[root@centos6-kvm3 ~]# expr 2 + $a &>/dev/null
[root@centos6-kvm3 ~]# echo $?
0
[root@centos6-kvm3 ~]# a=oldboy
[root@centos6-kvm3 ~]# expr 2 + $a &>/dev/null
[root@centos6-kvm3 ~]# echo $?
2
[root@centos6-kvm3 ~]#
判断参数是否为整数:
[root@centos6-kvm3 scripts]# cat judge.sh
#!/bin/bash
expr 2 + $1 &>/dev/null
if [ $? -eq 0 ]
thenecho "$1 is 整数"
elseecho "$1 is not 整数"
fi[root@centos6-kvm3 scripts]# sh judge.sh 4
4 is 整数
[root@centos6-kvm3 scripts]# sh judge.sh j
j is not 整数
[root@centos6-kvm3 scripts]#

expr判断文件扩展名:

[root@centos6-kvm3 scripts]# cat judge1.sh
#!/bin/bash
expr "$1" : ".*\.txt" &>/dev/null
if [ $? -eq 0 ]
then echo "$1 is 文本"
elseecho "$1 is not 文本"
fi[root@centos6-kvm3 scripts]# sh judge1.sh old.txt
old.txt is 文本
[root@centos6-kvm3 scripts]# sh judge1.sh old.log
old.log is not 文本
[root@centos6-kvm3 scripts]#

expr计算字符串长度:

[root@centos6-kvm3 scripts]# oldboy="i am oldboy"
[root@centos6-kvm3 scripts]# echo ${#oldboy}
11
[root@centos6-kvm3 scripts]# expr length "$oldboy"
11
[root@centos6-kvm3 scripts]#

五、bash内置核心命令read基础及实践

(一)read介绍

read 读入,读取用户输入。

-p 提示

-t 等待用户输入的时间。

[root@centos6-kvm3 scripts]# read -t 30 -p "请输入一个数字:" a
请输入一个数字:14
[root@centos6-kvm3 scripts]# echo $a
14

read 读入的作用:交互。

[root@centos6-kvm3 scripts]# vim test5.sh
#!/bin/bash
a=6
b=2
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a/b=$(($a/$b))"
echo "a**b=$(($a**$b))"
echo "a%b=$(($a%$b))"
[root@centos6-kvm3 scripts]#
[root@centos6-kvm3 scripts]# sh test5.sh
a-b=4
a+b=8
a*b=12
a/b=3
a**b=36
a%b=0[root@centos6-kvm3 scripts]# vim test5.sh
#!/bin/bash
read -p "请输入两个参数:" a b
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a/b=$(($a/$b))"
echo "a**b=$(($a**$b))"
echo "a%b=$(($a%$b))"[root@centos6-kvm3 scripts]# sh test5.sh
请输入两个参数:4 5
a-b=-1
a+b=9
a*b=20
a/b=0
a**b=1024
a%b=4[root@centos6-kvm3 scripts]# vim test5.sh
#!/bin/bash
a=$1
b=$2
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a/b=$(($a/$b))"
echo "a**b=$(($a**$b))"
echo "a%b=$(($a%$b))"
[root@centos6-kvm3 scripts]#
[root@centos6-kvm3 scripts]#
[root@centos6-kvm3 scripts]# sh test5.sh 5 9
a-b=-4
a+b=14
a*b=45
a/b=0
a**b=1953125
a%b=5

(二)read 的企业应用:

[root@centos6-kvm3 scripts]# cat select.sh
#!/bin/bash
cat << EOF
1.install lamp
2.install lnmp
3.exit
EOF
read -p "请输入一个序号:" num
expr 2 + $num &>/dev/null
if [ $? -ne 0 ]
thenecho "usage:$0{1|2|3}"exit 1
fiif [ $num -eq 1 ]
thenecho "install lamp..."
elif [ $num -eq 2 ]
thenecho "install lnmp ..."
elif [ $num -eq 3 ]
thenecho "bye..."exit
elseecho "usage:$0{1|2|3}"exit 1
fi[root@centos6-kvm3 scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:a
usage:select.sh{1|2|3}
[root@centos6-kvm3 scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:4
usage:select.sh{1|2|3}
[root@centos6-kvm3 scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:3
bye...
[root@centos6-kvm3 scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:2
install lnmp ...
[root@centos6-kvm3 scripts]#

六、shell脚本的条件测试与比较(6章)

(一)条件表达式的常见语法

1、条件表达式6种写法,if,while

语法1:test<测试表达式>

语法2:[ <测试表达式>] #中括号两端必须要有空格

语法3:[[<测试表达式>]] #两端必须要有空格

语法4:((测试表达式)) #两端必不需要空格

语法5:(命令表达式)

语法6:命令表达式

①[]条件表达式
[root@centos6-kvm3 scripts]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# [ -e /etc/host1 ] && echo 0 || echo 1
1
②test条件表达式:test和[]功能相同
[root@centos6-kvm3 scripts]# test -e /etc/host1  && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# test -e /etc/hosts  && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# # [] == test
③[[]]双中括号条件表达式,两边需要空格
[root@centos6-kvm3 scripts]# [[ -e /etc/host1 ]] && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# [[ -e /etc/hosts ]] && echo 0 || echo 1
0
④双括号条件表达式,两边需要空格
[root@centos6-kvm3 scripts]# (( -e /etc/hosts )) && echo 0 || echo 1
-bash: ((: -e /etc/hosts : division by 0 (error token is "/hosts ")
1
⑤双括号一般用于计算:
[root@centos6-kvm3 scripts]# ((3>5)) && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# ((3<5)) && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# #(())用于计算
⑥expr 表达式:使用括号
[root@centos6-kvm3 scripts]# (expr 1 + 2 &>/dev/null) && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# (expr 1 + 2 &>/dev/null) && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# (expr 1 + a &>/dev/null) && echo 0 || echo 1
1
⑦expr 表达式:使用反引号
[root@centos6-kvm3 scripts]# `expr 1 + a &>/dev/null` && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# `expr 1 + 2 &>/dev/null` && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]#

(二)条件表达式的编辑语法:

1)、[<测试表达式>] && 命令1 ||命令2

如果前面表达式成功,那么执行命令1,否则执行命令2

if [ <测试表达式>]
then命令1
else命令2
fi

2)、当命令很多的时候,我们可以使用大括号把所有命令括起来。如下:

[ <测试表达式> ] && {

命令1

命令2

}||{

命令3

命令4

}

3)、只保留执行成功的

[ <测试表达式>] &&{

命令1

命令2

命令3

}

4)、只保留执行失败的

[<测试表达式>] || {

命令1

命令2

命令3

}

(三)文件测试表达式

man test

-d:文件为目录且存在
[root@centos6-kvm3 scripts]# [ -d /etc/hosts ] && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# [ -d /etc ] && echo 0 || echo 1
0
-f:判断为文件且存在
[root@centos6-kvm3 scripts]# [ -f /etc/hosts ] && echo 0 || echo 1
0
-e:判断存在,为目录或者文件
[root@centos6-kvm3 scripts]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# [ -e /etc ] && echo 0 || echo 1
0
-r:判断文件为可读:
[root@centos6-kvm3 scripts]# [ -r /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# ll /etc/hosts
-rw-r--r--. 2 root root 352 Nov 19  2018 /etc/hosts
-x:判断文件为可执行:
[root@centos6-kvm3 scripts]# [ -x /etc/hosts ] && echo 0 || echo 1
1
[root@centos6-kvm3 scripts]# chmod +x /etc/hosts
[root@centos6-kvm3 scripts]# [ -x /etc/hosts ] && echo 0 || echo 1
0
-s:判断文件大小不为0:
[root@centos6-kvm3 scripts]# [ -s /etc/hosts ] && echo 0 || echo 1
0
[root@centos6-kvm3 scripts]# touch oldboy.log
[root@centos6-kvm3 scripts]# [ -s oldboy.log ] && echo 0 || echo 1
1
应用示例:crond
[root@centos6-kvm3 scripts]# cat /etc/init.d/crond

(四)字符串测试表达式的常见功能说明

n:not zero ,[-n "字符串" ] 字符串长度不为0,表达式为真。
z:zero,[-z "字符串" ] 字符串长度为0,表达式为真。
["字符串1"==“字符串2”] 两个字符串相同为真。
[“字符串1”!=“字符串2”] 两个字符串不相同为真。
注意:
1、字符串就用双引号。
2、等号可以用一个或者两个。
3、等号两端必须要有空格。[root@centos6-kvm3 scripts]# [ -n "oldboy" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ -z "oldboy" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# char="oldboy"
[root@centos6-kvm3 scripts]# [ -n "$char" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# unset char
[root@centos6-kvm3 scripts]# [ -n "$char" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [ "dd"=="ff" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ "dd" == "ff" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [ "dd" == "dd" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ "dd" != "ff" ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ "dd" != "dd" ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]#
实例应用:
cat /etc/init.d/crond
cat /etc/init.d/network

实例:

[root@centos6-kvm3 scripts]# cat select1.sh
#!/bin/bash
cat << EOF
1.install lamp
2.install lnmp
3.exit
EOF
read -p "请输入一个序号:" num
[ -z "$num" ] && exit 1 #判断内容是否为空
expr 2 + $num &>/dev/null
if [ $? -ne 0 ]
thenecho "usage:$0{1|2|3}"exit 1
fiif [ $num -eq 1 ]
thenecho "install lamp..."
elif [ $num -eq 2 ]
thenecho "install lnmp ..."
elif [ $num -eq 3 ]
thenecho "bye..."exit
elseecho "usage:$0{1|2|3}"exit 1
fi[root@centos6-kvm3 scripts]#

(五)整数测试表达式

在[]及test中使用的比较表达式 在(())和[[]]中使用的比较符号 说明
-eq ==或者= 等于equal
-ne != 不等于not equal
-gt > 大于greater then
-ge >= 大于等于greater equal
-lt < 小于 less then
-le <= 小于等于 less equal

实例

[root@centos6-kvm3 ~]# [ 2 -eq 3 ] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [ 2 -gt 3 ] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [ 2 -lt 3 ] && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# [ 2 > 3 ] && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# [ 2 \> 3 ] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [[ 2 > 3 ]] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [[ 2 -gt 3 ]] && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# [[ 2 -lt 3 ]] && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# (( 2 -lt 3 )) && echo 0 || echo 1
-bash: ((: 2 -lt 3 : syntax error in expression (error token is "3 ")
1
[root@centos6-kvm3 ~]# (( 2 > 3 )) && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# (( 2 < 3 )) && echo 0 || echo 1
0
[root@centos6-kvm3 ~]# test 2 -gt 3 && echo 0 || echo 1
1
[root@centos6-kvm3 ~]# test 2 -lt 3 && echo 0 || echo 1
0
[root@centos6-kvm3 ~]#
总结:
1、双中括号中使用 字母表达式。
2、双括号中不适合字母表达式,只适合符号表达式。
3、test表达式只适合符号表达式。

(六)测试题:使用read的交互方式,来比较两个整数的大小。

[root@centos6-kvm3 scripts]# cat test3.sh
#!/bin/bash
read -p "请输入两个整数:" a b
[ -z "$b" ] && {echo "请输入两个整数。"exit 1
}
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ] && {echo "请输入两个整数。"exit 2
}
[ $a -lt $b ] && {echo "$a小于$b."exit 0
}
[ $a -gt $b ] && {echo "$a大于$b."exit 0
}[ $a -eq $b ] && {echo "$a等于$b."exit 0
}[root@centos6-kvm3 scripts]# ================
使用if语句:
[root@centos6-kvm3 scripts]# cat test4.sh
#!/bin/bash
read -p "请输入两个整数:" a b
[ -z "$b" ] && {echo "请输入两个整数。"exit 1
}
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ] && {echo "请输入两个整数。"exit 2
}
if [ $a -lt $b ]
thenecho "$a小于$b."
elif [ $a -gt $b ]
thenecho "$a大于$b."
else echo "$a等于$b."
fi
[root@centos6-kvm3 scripts]#

(七)逻辑测试表达式

在[]和test中使用操作符 在[[]]和(())中使用操作符 说明
-a && and 与
-o || or 或
! ! not 非

实例:

[root@centos6-kvm3 scripts]# [ 1 -eq 1 -a -f /etc/hosts ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ 1 -eq 2 -a -f /etc/hosts ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [ 1 -eq 2 -o -f /etc/hosts ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ 1 -eq 2 ] -o [ -f /etc/hosts ] && echo 1 || echo 0
-bash: [: too many arguments
0
[root@centos6-kvm3 scripts]# [ 1 -eq 2 ] || [ -f /etc/hosts ] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [ 1 -eq 2 ] && [ -f /etc/hosts ] && echo 1 || echo 0
0
[root@centos6-kvm3 scripts]# [[ 1 -eq 2 || -f /etc/hosts ]] && echo 1 || echo 0
1
[root@centos6-kvm3 scripts]# [[ 1 -eq 2 && -f /etc/hosts ]] && echo 1 || echo 0
0

模块一:shell 脚本基础相关推荐

  1. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  2. SHELL脚本 基础一

    SHELL脚本基础 基本都是干货,都是通过书和视频总结的一小部分,里面应该有一些错误: SHELL变量 1.变量:临时储存数据的,该数据是可以进行变化的数据 2.变量的使用:1.多次重复使用的数据,并 ...

  3. Shell 脚本基础学习 (四)

    现在我们来讨论编写一个脚本的一般步骤.任何优秀的脚本都应该具有帮助和输入参数.并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意.这时候,在写一 ...

  4. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  5. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  6. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  7. linux脚本变量运算符,linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)...

    Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽 ...

  8. shell脚本基础 (一)

    shell脚本基础 (一) 如何编写shell脚本: shell脚本存放的路径举例:vi /root/first.sh 1.理清任务: 2.申明shell环境: 3.注释: 4.写粗糙的脚本: 5.完 ...

  9. 详细介绍Linux shell脚本基础学习(一)

    2019独角兽企业重金招聘Python工程师标准>>> Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础 ...

  10. linux 脚本编写 -eq,关于shell脚本基础编程第四篇

    shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...

最新文章

  1. 我用Transformer修复代码bug
  2. shell特殊符号cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号下
  3. 使用pip来安装pyOpenSSL
  4. 机器人学 —— 机器人视觉(极几何)
  5. php中mysql和mysqli_php mysqli中-和::有什么区别?
  6. 强行终止python_中国的真实离婚率:一点也不高,反而低的惊人 | 用python计算离婚率...
  7. eventsource前台怎么接收一个对象数据_Java开发经验总结篇(1)——数据保存的整洁方法...
  8. ros中move_group的参数动态设置
  9. ORACLE SQLSERVER2005分页
  10. Boost.Asio取消异步操作
  11. [CF1073E]Segment Sum
  12. 路由器互通过程(简述)
  13. java兵临城下_再谈java事件监听机制
  14. Windows server 2016 / Windows 10关于域管理员帐号权限不足的问题
  15. IDEA配置更加流畅 写代码起飞停不下来~
  16. RN开发研究入门篇(一)项目搭建
  17. 数据库设计工具-----PD
  18. python — pip 下载速度慢解决方法(含Anaconda、spyder 下载包的方法)
  19. idea maven 本地仓库配置报错
  20. servlet生成验证码和点击刷新验证码

热门文章

  1. 炫酷的汽车幻化为粒子效果分享
  2. 面向NLP的AI产品方法论——寻找语音交互的业务场景
  3. LIF-MDF6000-6KMG80I FPGA现场可编程门阵列 封装BGA
  4. 如何测试tcp端口是否开放
  5. Java实现阴历日历表(附带星座)
  6. Windows系统局域网共享磁盘、共享文件方法
  7. 一天练习一个小C/C++程序(一) 控制台版“金山打字”游戏
  8. ubuntu取消桌面回收站,移动磁盘等图标
  9. 卸载金蝶标准版提示灾难性故障_如何卸载异常金蝶程序
  10. 五镜头倾斜摄像专业航测相机