模块一:shell 脚本基础

一、shell脚本介绍

(一)脚本案例及介绍:

#!/bin/bash

LOG_DIR=/var/log

ROOT_UID=0
if ["$UID -ne "$ROOT_UID"]
then
    echo "must be root run this script."
    exit 1
 fi

 cd $ 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脚本解释器:

[[email protected] ~]# echo $SHELL
/bin/bash
[[email protected] ~]# 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

实例:

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

实例:

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

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

[[email protected] scripts01]# cat test1.sh
user=`whoami`
[[email protected] scripts01]# sh test1.sh
[[email protected] scripts01]# echo $user

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

[[email protected] scripts01]# cat 1.sh
sh test1.sh
echo $user

[[email protected] scripts01]# cat 1.sh
. ./test1.sh
echo $user

[[email protected] 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"
[email protected]:获取脚本的所有参数。每个参数是一个整体:"$1","$2","$3"
当需要接收脚本后所有参数,但是又不知道个数的时候,使用$*,$#
两者区别:
[[email protected] scripts]# cat test.sh
#!/bin/bash
for arg in "$*"
do
 echo $arg
done

echo ------
for arg1 in "[email protected]"
do
  echo $arg1
done

echo $#

[[email protected] scripts]# bash test.sh "i am" oldboy teacher.
i am oldboy teacher.
------
i am
oldboy
teacher.
3
[[email protected] scripts]# 

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

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

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

[[email protected] scripts]# oldboy="i am oldboy"
[[email protected] scripts]# echo ${oldboy}
i am oldboy
${#变量}:获取变量字符个数。
[[email protected] scripts]# echo ${#oldboy}
11
[[email protected] scripts]# echo ${oldboy}|wc -L
11
计算变量字符个数方法2:
[[email protected] scripts]# expr length "$oldboy"
11
计算变量字符个数方法3:
[[email protected] scripts]# echo $oldboy| awk '{print length }'
11
[[email protected] scripts]# echo $oldboy| awk '{print length($0) }'
11
[[email protected] scripts]# echo $oldboy| awk '{print length($1) }'
1
获取变量第二个参数后参数:
[[email protected] scripts]# echo ${oldboy:2}
am oldboy
[[email protected] scripts]# echo ${oldboy:2:2}
am
[[email protected] scripts]#

${参数#字符串}:匹配开头,删除最短匹配。
[[email protected] scripts]# OLDBOY=abcABC12345ABCabc
[[email protected] scripts]# echo ${OLDBOY}
abcABC12345ABCabc
[[email protected] scripts]# echo ${OLDBOY#a*C}
12345ABCabc
${参数##字符串}:匹配开头,删除最长匹配。
[[email protected] scripts]# echo ${OLDBOY##a*C}
abc
${参数%字符串}:匹配结尾,删除最短匹配。
[[email protected] scripts]# echo ${OLDBOY%a*c}
abcABC12345ABC
${参数%%字符串}:匹配结尾,删除最长匹配。
[[email protected] scripts]# echo ${OLDBOY%%a*c}

[[email protected] scripts]# 

${变量/part/string}:使用string替换part第一个匹配项。
[[email protected] scripts]# oldboy="i am oldboy oldboy"
[[email protected] scripts]# echo ${oldboy/oldboy/oldgirl}
i am oldgirl oldboy
${变量//part/string}:使用string替换part所有匹配项。
[[email protected] scripts]# echo ${oldboy//oldboy/oldgirl}
i am oldgirl oldgirl
[[email protected] scripts]# 

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

result=${变量:-word}:当变量为空时候,将word赋值给result。冒号可以省略。
[[email protected] scripts]# result=${test:-UNSET}
[[email protected] scripts]# echo $result
UNSET
[[email protected] scripts]# echo $test

企业应用:
[[email protected] scripts]# find ${path:-/tmp} -name  "*.log" -mtime +7| xargs rm -f
[[email protected] scripts]#

result=${变量:=word},变量为空时候,work复制给result,同时复制给变量。
[[email protected] scripts]# result=${test:=UNSET}
[[email protected] scripts]# echo ${result}
UNSET
[[email protected] scripts]# echo ${test}
UNSET
[[email protected] scripts]# 

${变量:?word}:当变量为空时候,提示word。

[[email protected] scripts]# result=${test1:?变量为空}
-bash: test1: 变量为空
[[email protected] scripts]# echo $result
UNSET
[[email protected] scripts]# echo $test1

[[email protected] scripts]# test1=oldboy
[[email protected] scripts]# result=${test1:?变量为空}
[[email protected] scripts]# echo $result
oldboy
[[email protected] scripts]#

${变量:+word}:如果前面变量为空,什么不做,如果不为空,进行覆盖。
[[email protected] scripts]# result1=${test2:+wordk}
[[email protected] scripts]# echo ${result1}

[[email protected] scripts]# echo ${test2}

[[email protected] scripts]# test2=2
[[email protected] scripts]# result1=${test2:+wordk}
[[email protected] scripts]# echo ${result1}
wordk
[[email protected] scripts]# echo ${test2}
2
[[email protected] scripts]# 

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

(一)算数运算符:

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

(二)编程常见运算命令

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

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

判断一个是否为整数:

[[email protected] ~]# expr 2 + 3
5
[[email protected] ~]# expr 2 + a
expr: non-numeric argument
  [email protected] ~]# echo $?
2
[[email protected] ~]# a=2
[[email protected] ~]# expr 2 + $a &>/dev/null
[[email protected] ~]# echo $?
0
[[email protected] ~]# a=oldboy
[[email protected] ~]# expr 2 + $a &>/dev/null
[[email protected] ~]# echo $?
2
[[email protected] ~]#
判断参数是否为整数:
[[email protected] scripts]# cat judge.sh
#!/bin/bash
expr 2 + $1 &>/dev/null
if [ $? -eq 0 ]
then
   echo "$1 is 整数"
else
   echo "$1 is not 整数"
fi

[[email protected] scripts]# sh judge.sh 4
4 is 整数
[[email protected] scripts]# sh judge.sh j
j is not 整数
[[email protected] scripts]# 

expr判断文件扩展名:

[[email protected] scripts]# cat judge1.sh
#!/bin/bash
expr "$1" : ".*\.txt" &>/dev/null
if [ $? -eq 0 ]
then
   echo "$1 is 文本"
else
   echo "$1 is not 文本"
fi

[[email protected] scripts]# sh judge1.sh old.txt
old.txt is 文本
[[email protected] scripts]# sh judge1.sh old.log
old.log is not 文本
[[email protected] scripts]# 

expr计算字符串长度:

[[email protected] scripts]# oldboy="i am oldboy"
[[email protected] scripts]# echo ${#oldboy}
11
[[email protected] scripts]# expr length "$oldboy"
11
[[email protected] scripts]# 

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

(一)read介绍

read 读入,读取用户输入。

-p 提示

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

[[email protected] scripts]# read -t 30 -p "请输入一个数字:" a
请输入一个数字:14
[[email protected] scripts]# echo $a
14

read 读入的作用:交互。

[[email protected] 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))"
[[email protected] scripts]#
[[email protected] scripts]# sh test5.sh
a-b=4
a+b=8
a*b=12
a/b=3
a**b=36
a%b=0

[[email protected] 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))"

[[email protected] scripts]# sh test5.sh
请输入两个参数:4 5
a-b=-1
a+b=9
a*b=20
a/b=0
a**b=1024
a%b=4

[[email protected] 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))"
[[email protected] scripts]#
[[email protected] scripts]#
[[email protected] 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 的企业应用:

[[email protected] 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 ]
then
   echo "usage:$0{1|2|3}"
   exit 1
fi

if [ $num -eq 1 ]
then
   echo "install lamp..."
elif [ $num -eq 2 ]
then
   echo "install lnmp ..."
elif [ $num -eq 3 ]
then
   echo "bye..."
   exit
else
   echo "usage:$0{1|2|3}"
   exit 1
fi

[[email protected] scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:a
usage:select.sh{1|2|3}
[[email protected] scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:4
usage:select.sh{1|2|3}
[[email protected] scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:3
bye...
[[email protected] scripts]# sh select.sh
1.install lamp
2.install lnmp
3.exit
请输入一个序号:2
install lnmp ...
[[email protected] scripts]# 

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

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

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

语法1:test

语法2:[ ] #中括号两端必须要有空格

语法3:[[]] #两端必须要有空格

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

语法5:(命令表达式)

语法6:命令表达式

①[]条件表达式
[[email protected] scripts]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[[email protected] scripts]# [ -e /etc/host1 ] && echo 0 || echo 1
1
②test条件表达式:test和[]功能相同
[[email protected] scripts]# test -e /etc/host1  && echo 0 || echo 1
1
[[email protected] scripts]# test -e /etc/hosts  && echo 0 || echo 1
0
[[email protected] scripts]# # [] == test
③[[]]双中括号条件表达式,两边需要空格
[[email protected] scripts]# [[ -e /etc/host1 ]] && echo 0 || echo 1
1
[[email protected] scripts]# [[ -e /etc/hosts ]] && echo 0 || echo 1
0
④双括号条件表达式,两边需要空格
[[email protected] scripts]# (( -e /etc/hosts )) && echo 0 || echo 1
-bash: ((: -e /etc/hosts : division by 0 (error token is "/hosts ")
1
⑤双括号一般用于计算:
[[email protected] scripts]# ((3>5)) && echo 0 || echo 1
1
[[email protected] scripts]# ((3<5)) && echo 0 || echo 1
0
[[email protected] scripts]# #(())用于计算
⑥expr 表达式:使用括号
[[email protected] scripts]# (expr 1 + 2 &>/dev/null) && echo 0 || echo 1
0
[[email protected] scripts]# (expr 1 + 2 &>/dev/null) && echo 0 || echo 1
0
[[email protected] scripts]# (expr 1 + a &>/dev/null) && echo 0 || echo 1
1
⑦expr 表达式:使用反引号
[[email protected] scripts]# `expr 1 + a &>/dev/null` && echo 0 || echo 1
1
[[email protected] scripts]# `expr 1 + 2 &>/dev/null` && echo 0 || echo 1
0
[[email protected] 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:文件为目录且存在
[[email protected] scripts]# [ -d /etc/hosts ] && echo 0 || echo 1
1
[[email protected] scripts]# [ -d /etc ] && echo 0 || echo 1
0
-f:判断为文件且存在
[[email protected] scripts]# [ -f /etc/hosts ] && echo 0 || echo 1
0
-e:判断存在,为目录或者文件
[[email protected] scripts]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[[email protected] scripts]# [ -e /etc ] && echo 0 || echo 1
0
-r:判断文件为可读:
[[email protected] scripts]# [ -r /etc/hosts ] && echo 0 || echo 1
0
[[email protected] scripts]# ll /etc/hosts
-rw-r--r--. 2 root root 352 Nov 19  2018 /etc/hosts
-x:判断文件为可执行:
[[email protected] scripts]# [ -x /etc/hosts ] && echo 0 || echo 1
1
[[email protected] scripts]# chmod +x /etc/hosts
[[email protected] scripts]# [ -x /etc/hosts ] && echo 0 || echo 1
0
-s:判断文件大小不为0:
[[email protected] scripts]# [ -s /etc/hosts ] && echo 0 || echo 1
0
[[email protected] scripts]# touch oldboy.log
[[email protected] scripts]# [ -s oldboy.log ] && echo 0 || echo 1
1
应用示例:crond
[[email protected] scripts]# cat /etc/init.d/crond 

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

n:not zero ,[-n "字符串" ] 字符串长度不为0,表达式为真。
z:zero,[-z "字符串" ] 字符串长度为0,表达式为真。
["字符串1"==“字符串2”] 两个字符串相同为真。
[“字符串1”!=“字符串2”] 两个字符串不相同为真。
注意:
1、字符串就用双引号。
2、等号可以用一个或者两个。
3、等号两端必须要有空格。

[[email protected] scripts]# [ -n "oldboy" ] && echo 1 || echo 0
1
[[email protected] scripts]# [ -z "oldboy" ] && echo 1 || echo 0
0
[[email protected] scripts]# char="oldboy"
[[email protected] scripts]# [ -n "$char" ] && echo 1 || echo 0
1
[[email protected] scripts]# unset char
[[email protected] scripts]# [ -n "$char" ] && echo 1 || echo 0
0
[[email protected] scripts]# [ "dd"=="ff" ] && echo 1 || echo 0
1
[[email protected] scripts]# [ "dd" == "ff" ] && echo 1 || echo 0
0
[[email protected] scripts]# [ "dd" == "dd" ] && echo 1 || echo 0
1
[[email protected] scripts]# [ "dd" != "ff" ] && echo 1 || echo 0
1
[[email protected] scripts]# [ "dd" != "dd" ] && echo 1 || echo 0
0
[[email protected] scripts]#
实例应用:
cat /etc/init.d/crond
cat /etc/init.d/network 

实例:

[[email protected] 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 ]
then
   echo "usage:$0{1|2|3}"
   exit 1
fi

if [ $num -eq 1 ]
then
   echo "install lamp..."
elif [ $num -eq 2 ]
then
   echo "install lnmp ..."
elif [ $num -eq 3 ]
then
   echo "bye..."
   exit
else
   echo "usage:$0{1|2|3}"
   exit 1
fi

[[email protected] scripts]# 

(五)整数测试表达式

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

实例

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

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

[[email protected] 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
}

[[email protected] scripts]# 

================
使用if语句:
[[email protected] 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 ]
then
   echo "$a小于$b."
elif [ $a -gt $b ]
then
   echo "$a大于$b."
else
   echo "$a等于$b."
fi
[[email protected] scripts]# 

(七)逻辑测试表达式

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

实例:

[[email protected] scripts]# [ 1 -eq 1 -a -f /etc/hosts ] && echo 1 || echo 0
1
[[email protected] scripts]# [ 1 -eq 2 -a -f /etc/hosts ] && echo 1 || echo 0
0
[[email protected] scripts]# [ 1 -eq 2 -o -f /etc/hosts ] && echo 1 || echo 0
1
[[email protected] scripts]# [ 1 -eq 2 ] -o [ -f /etc/hosts ] && echo 1 || echo 0
-bash: [: too many arguments
0
[[email protected] scripts]# [ 1 -eq 2 ] || [ -f /etc/hosts ] && echo 1 || echo 0
1
[[email protected] scripts]# [ 1 -eq 2 ] && [ -f /etc/hosts ] && echo 1 || echo 0
0
[[email protected] scripts]# [[ 1 -eq 2 || -f /etc/hosts ]] && echo 1 || echo 0
1
[[email protected] scripts]# [[ 1 -eq 2 && -f /etc/hosts ]] && echo 1 || echo 0
0

原文地址:https://www.cnblogs.com/cuiyongchao007/p/12239418.html

时间: 2024-11-06 13:21:35

模块一:shell 脚本基础的相关文章

关于shell脚本基础编程第四篇

shell脚本基础编程第四篇本章主要内容:函数 函数 function:             function 名称 { 命令 ; } 或 name () { 命令 ; }           定义 shell 函数.               创建一个以 NAME 为名的 shell 函数.当作为一个简单的命令启用时,           NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令.当 NAME           被启用时,参数作为 $1...$n 被传递

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

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

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

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

shell脚本基础学习(转)

看到别人的学习总结,觉得不错转了过来(转自TryFly) 一.shell脚本基础 ? ?shell脚本是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正则表达式,管道命令以及重定向向等功能,以达到我们所想要的处理目的.它的基本用途有: 1.自动化常用命令 2.执行系统管理和故障排除 3.创建简单的应用程序 4.处理文本或文件 ... 二.创建shell脚本 第一步.使用文本编辑器来创建文本文件 第一行必须包括shell 声明序列:#!

shell脚本基础进阶(四)----作业

20150913-15作业 1.描述shell程序的运行原理(可附带必要的图形说明) shell脚本基础进阶(一)----shell介绍 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟) shell脚本基础进阶(二)----变量及运算符 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") shell脚本基础进阶(三)----流程控制语句

Linux运维之道之ENGINEER1.4(shell脚本基础)

ENGINEER1.4 SHELL脚本基础 认识shell环境 bash shell的使用方式 交互式: --人工干预,智能化程度高 --逐条解释执行,效率低 非交互式: --需要提前设计,智能化难度大: --批量执行,效率高: --方便在后台及悄悄地执行: 什么是shell脚本:提前设计可执行语句,用来完成特定任务的文件 --解释型程序 --顺序,批量执行 规范shell脚本的一般组成: #!环境声明 #注释文本 可执行代码 ----------------------------------

续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,

一. Vim续写 ?1.命令扩展模式的位置定界 ??起始位置 cmd 终止位置???Cmd:????y复制????d删除????Gu变大写????gu变小写??例如:0y$命令意味着:????0 先到行头????Y 从这里开始拷贝????$ 拷贝到本行行尾最后一个字符????Ye 从当前位置拷贝到本单词的最后一个字符 ?2.扩展命令模式:地址定界 ? ?# 具体第#行,? ?#1,#2 从开头数第#1行到第#2行? ?#1,+#2 从开头数的第#1行到从第#1行开始数的第#2行? ? ?例:2,

Shell脚本基础(一)

前言:随着Linux系统在企业中的应用越来越多,服务器的自动化管理也越来越变得重要,在一些复杂的Linux维护工作中,大量的重复性的输出和交互式操作不但费时费力,而且容易出错,所以Shell脚本,可以批量处理,自动化完成一系列维护工作,大大减轻管理员的负担. 一,Shell脚本基础知识1,编写第一个shell脚本1),vim first.sh[[email protected] ~]# mkdir /shell //创建一个shell目录[[email protected] ~]# vim fi

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

Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽量不要使用"_"下划线开头 最好做到见名知意 不能使用程序中的保留字,列如if,for等 1.3变量类型 字符型 数值型 整型浮点型 布尔型 条件是和否 #$echo $a 引用 abc 撤销 unset +(变量名)a 1.4变量操作 * 设置变量 * 引用变量 * 撤销变量 单引号和双

shell脚本基础、变量

shell脚本基础 知识要点 掌握Shell脚本的基础知识 学会使用Shell变量 学会编写简单的Shell脚本 Shell脚本的应用环境 学习shell脚本的基本流程 看.想.写 shell脚本用在什么地方 编写常用系统维护工具菜单 重要的性能参数.进程和日志分析 自动实现数据备份计划 自动批量搭建特定系统环境 防火墙自动配置脚本 服务器的配置文件安全比对 对批量设备进行远程巡检 Shell脚本的组成元素 shell脚本的基本组成 声明和注释* 系统命令 文本处理工具(grep.cut.sed