【Linux中高级运维: 第53天——Shell编程】第3章:read传参+条件测试与比较语句+字符串测试表达式+整数二元比较操作符+逻辑操作符+if判断语句+菜单的打印方式

a=1



$0
0=脚本名字
echo $0


    # Test syntax.
    if [ "$#" -eq 0 ]; then
        echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"
        return 1
    fi

$#案例

[root@web01 /server/scripts]# cat network 
if [ $# -eq 0 ]
then
    echo "Usage: $0 {start|stop|restart}"
fi
echo $1
[root@web01 /server/scripts]# set -- "I am" handsome oldboy.
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# echo $1
I am
[root@web01 /server/scripts]# echo $2
handsome
[root@web01 /server/scripts]# echo $3
oldboy.
[root@web01 /server/scripts]# echo $#
3
[root@web01 /server/scripts]# echo $*
I am handsome oldboy.
[root@web01 /server/scripts]# echo $@
I am handsome oldboy.
[root@web01 /server/scripts]# for i in "$*";do echo $i;done
I am handsome oldboy.
[root@web01 /server/scripts]# for i in "$@";do echo $i;done
I am
handsome
oldboy.

$$

[root@web01 /server/scripts]# cat oldboy.sh 
echo $0
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} $13 $14 $15
echo $#
echo $*
echo $@
echo $$|tee /tmp/a.log
sleep 30
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# cat kill.sh 
kill `cat /tmp/a.log`
${parameter}	返回变量$parameter的内容
${#parameter}	返回变量$parameter内容的长度(按字符),也适合特殊变量*
${parameter:offset}	在变量${parameter}中,从位置offset之后开始提取子串到结尾
${parameter:offset:length}	在变量${parameter}中,从位置offset之后开始提取长度为length的子串

#删除

${parameter#word}	从变量${parameter}【开头】开始删除最【短】匹配的word子串
${parameter##word}	从变量${parameter}【开头】开始删除最【长】匹配的word子串

${parameter%word}	从变量${parameter}结尾开始删除最短匹配的word子串
${parameter%%word}	从变量${parameter}结尾开始删除最长匹配的word子串

#类似sed替换

${parameter/pattern/string}	    使用string代替第一个匹配的pattern
${parameter//pattern/string}	使用string代替所有匹配的pattern
[root@web01 /server/scripts]# OLDBOY="I am oldboy" 
[root@web01 /server/scripts]# echo $OLDBOY
I am oldboy

[root@web01 /server/scripts]# echo ${#OLDBOY} #打印变量内容的长度。
11
[root@web01 /server/scripts]# echo ${OLDBOY:2:2}
am
[root@web01 /server/scripts]# echo ${OLDBOY:2}
am oldboy
[root@web01 /server/scripts]# echo ${OLDBOY:0:2}
I
[root@web01 /server/scripts]# echo ${OLDBOY:0:3}
I a
[root@web01 /server/scripts]# echo ${OLDBOY}
I am oldboy
[root@web01 /server/scripts]# echo ${OLDBOY}|grep -o oldboy
oldboy
[root@web01 /server/scripts]# echo ${OLDBOY:2:2}
am
[root@web01 /server/scripts]# echo ${OLDBOY:5:6}
oldboy
[root@web01 /server/scripts]# echo ${OLDBOY:5}
oldboy

获取变量内容长度的方法:

[root@web01 /server/scripts]# echo $OLDBOY|wc -L
22
[root@web01 /server/scripts]# echo ${#OLDBOY}
22
[root@web01 /server/scripts]# expr length "$OLDBOY"
22
[root@web01 /server/scripts]# echo $OLDBOY|awk '{print length}'
22
[root@web01 /server/scripts]# echo $OLDBOY|awk '{print length($0)}'
22
[root@web01 /server/scripts]# sh count.sh
I
am
linux
to
our
[root@web01 /server/scripts]# 

[root@web01 /server/scripts]# cat count.sh 
chars="I am oldboy linux welcome to our training."
for word in $chars
do
  if [ ${#word} -lt 6 ]
  then
      echo $word
  fi
done

做销售的男生或女生,经常出差。
乐乐在家

result是乐乐的女朋友

乐乐出差了,第三者插足了。unset

[root@web01 /server/scripts]# test=lele
[root@web01 /server/scripts]# echo $test
lele
[root@web01 /server/scripts]# result=${test:-unset}
[root@web01 /server/scripts]# echo $result
lele
[root@web01 /server/scripts]# unset test
[root@web01 /server/scripts]# echo $test

[root@web01 /server/scripts]# result=${test:-unset}
[root@web01 /server/scripts]# echo $result
unset

数值运算:

1)整数运算:

方法1:
[root@web01 /server/scripts]# a=1
[root@web01 /server/scripts]# let a=a+1
[root@web01 /server/scripts]# echo $a
2

方法2:推荐小括号
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# ((a=a+1))
[root@web01 /server/scripts]# echo $a
11

方法3:尽量不用做运算
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# expr $a + 111
121
[root@web01 /server/scripts]# b=`expr $a + 111`
[root@web01 /server/scripts]# echo $b
121

方法4:
[root@web01 /server/scripts]# a=11
[root@web01 /server/scripts]# echo $[$a+11]
22
[root@web01 /server/scripts]# echo $[a+11]
22
[root@web01 /server/scripts]# c="$[a+11]"
[root@web01 /server/scripts]# echo $c
22

方法5:
[root@web01 /server/scripts]# a=8
[root@web01 /server/scripts]# declare -i a=a+10
[root@web01 /server/scripts]# echo $a
18

整数或者小数运算:

bc

[root@web01 /server/scripts]# echo 1+2|bc
3
[root@web01 /server/scripts]# echo 1.1*2|bc
2.2
[root@web01 /server/scripts]# echo 3/2|bc
1
[root@web01 /server/scripts]# echo 3%2|bc
1
[root@web01 /server/scripts]# echo 3.33*9.99|bc
33.26
[root@web01 /server/scripts]# echo "scale=4;3.33*9.99"|bc
33.2667

[root@web01 /server/scripts]# echo 3^2|bc
9

awk

[root@web01 ~]# echo 1.1 2|awk '{print $1*$2}'
2.2
[root@web01 ~]# echo 1.1 2|awk '{print $1%$2}'
1.1
[root@web01 ~]# echo 4 2|awk '{print $1%$2}'
0

(()) 逻辑判断

[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# ((a++))
[root@web01 /server/scripts]# echo $a
11
[root@web01 /server/scripts]# ((a++))
[root@web01 /server/scripts]# echo $a
12
[root@web01 /server/scripts]# ((a--))
[root@web01 /server/scripts]# echo $a
11
[root@web01 /server/scripts]# ((a--))
[root@web01 /server/scripts]# echo $a
10
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
9
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
8
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
7
[root@web01 /server/scripts]# echo $a
7
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# echo $((--a))
6
[root@web01 /server/scripts]# echo $a
6
[root@web01 /server/scripts]# echo $((--a))
5
[root@web01 /server/scripts]# echo $a
5
[root@web01 /server/scripts]# echo $((--a))
4
[root@web01 /server/scripts]# echo $a
4
[root@web01 /server/scripts]# echo $((a--))
4
[root@web01 /server/scripts]# echo $a
3
[root@web01 /server/scripts]# echo $((a--))
3
[root@web01 /server/scripts]# echo $a
2
[root@web01 /server/scripts]# ((8>7))
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# ((8<7))
[root@web01 /server/scripts]# echo $?
1
[root@web01 /server/scripts]# ((8<7&&6>5))
[root@web01 /server/scripts]# echo $?
1
[root@web01 /server/scripts]# ((8<9&&6>5))
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# ((8<7||6>5))
[root@web01 /server/scripts]# echo $?
0

expr功能:

1)计算
[root@web01 /server/scripts]# expr 10 + 10
20

2)获取字符串长度
[root@web01 /server/scripts]# a="oldgirl"
[root@web01 /server/scripts]# echo $a
oldgirl
[root@web01 /server/scripts]# expr length "$a"
7

3)判断字符串是否为整数数字或字符
[root@web01 /server/scripts]# a=1
[root@web01 /server/scripts]# expr $a + 1 &>/dev/null
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# a=oldboy
[root@web01 /server/scripts]# expr $a + 1 &>/dev/null
[root@web01 /server/scripts]# echo $?
2

4)用来判断文件扩展名是否符合指定扩展名

[root@web01 /server/scripts]# cat judge.sh 
  if expr "$1" : ".*\.avi$" >/dev/null ; then
    echo "好兴奋啊"
  else
    echo "好失望啊"
  fi

[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# sh judge.sh oldboy.avi
好兴奋啊
[root@web01 /server/scripts]# sh judge.sh oldboy.log
好失望啊
[root@web01 ~]# read -p "请输入一个数字:" n
请输入一个数字:100
[root@web01 ~]# echo $n
100

[root@web01 ~]# read -t 10 -p "请输入两个数字:" n m
请输入两个数字:100 110
[root@web01 ~]# echo $n
100
[root@web01 ~]# echo $m
110

read读入的本质就是给变量赋值,多了交互式提示而已。

变量赋值的三种方式:

1)定义式
a=1

2)read读入式
read -t 10 -p "请输入两个数字:" n m
n=110 m=100

3)脚本传参
$1=100

练习:

01-dingyi.sh

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))"

变通:02-read.sh

改成read读入两个数

变通2:03-chuancan.sh

改成命令行传入两个数
[root@web01 /server/scripts]# cat 02-read.sh 
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@web01 /server/scripts]# cat 03-chuancan.sh 
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@web01 /server/scripts]# test -f a && echo ddd >a ||echo 0
0
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# cat a
cat: a: 没有那个文件或目录
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# touch a
[root@web01 /server/scripts]# test -f a && echo ddd >a ||echo 0
[root@web01 /server/scripts]# cat a
ddd
[root@web01 /server/scripts]# test -x count.sh && ./count.sh ||echo "没有执行权限"
没有执行权限
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# ls count.sh 
count.sh
[root@web01 /server/scripts]# ls count.sh  -l
-rw-r--r-- 1 root root 131 5月  28 10:36 count.sh
[root@web01 /server/scripts]# chmod +x count.sh 
[root@web01 /server/scripts]# ls count.sh  -l
-rwxr-xr-x 1 root root 131 5月  28 10:36 count.sh

[root@web01 /server/scripts]# test -x count.sh && ./count.sh ||echo "没有执行权限"
I
am
linux
to
our

[root@web01 /server/scripts]# [ -x count.sh ] && ./count.sh ||echo "没有执 行权限"
I
am
linux
to
our

[root@web01 /server/scripts]# [[ -x count.sh ]] && ./count.sh ||echo "没有 执行权限"
I
am
linux
to
our

文件测试表达式用法:对文件的属性进行判断,然后根据结果进行处理

[root@web01 /server/scripts]# touch oldboy.txt
[root@web01 /server/scripts]# [ -f oldboy.txt ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# rm -f oldboy.txt 
[root@web01 /server/scripts]# [ -f oldboy.txt ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# mkdir oldboy
[root@web01 /server/scripts]# [ -f oldboy ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# [ -e oldboy ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# [ -d oldboy ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# [ -L oldboy ] && echo 1 || echo 0
0
[ 条件1 ] && {
    命令1     
	命令2     
	命令3 
}
如果条件成立,那么执行三个命令。

if [ 条件1 ]   
then     
	命令1     
	命令2     
	命令3 
fi

[ 条件1 ] || {
    命令1     
	命令2     
	命令3 
}
如果表达式不成立,那么执行三个命令。


[ -L oldboy ] && echo 1 || echo 0

[ 条件1 ] && {
    命令1     
	命令2     
} || { 
	命令3 
}
如果条件成立,那么执行命令1命令2,否则执行命令3。


# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 6

# if the ip configuration utility isn't around we can't function.
[ -x /sbin/ip ] || exit 1

字符串测试表达式

[root@web01 /server/scripts]# [ -n "oldboy" ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# [ -z "oldboy" ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# a="oldboy"
[root@web01 /server/scripts]# [ -z "$a" ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# unset a
[root@web01 /server/scripts]# echo $a

[root@web01 /server/scripts]# [ -z "$a" ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# [ "$a" = "oldboy" ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# a="oldboy"
[root@web01 /server/scripts]# [ "$a" = "oldboy" ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# [ "$a" = "oldgir" ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# b="oldgirl"
[root@web01 /server/scripts]# [ "${#a}" = "${#b}" ] && echo 1 || echo 0
0
[root@web01 /server/scripts]# b="oldgir"
[root@web01 /server/scripts]# [ "${#a}" = "${#b}" ] && echo 1 || echo 0
1
[root@web01 /server/scripts]# sh 02-read.sh 

作业:

[root@web01 /server/scripts]# cat 02-read.sh 
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@web01 /server/scripts]# cat 03-chuancan.sh 
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))"
对传入的参数或者read读入的变量内容判断,如果不符合计算条件,提示用户,并退出。

[root@web01 /server/scripts]# sh 02-read.sh 
请输入两个整数:
02-read.sh:行2: -: 语法错误: 期待操作数 (错误符号是 "-"[root@web01 /server/scripts]# read -p "请输入一个数:" n
请输入一个数:oldboy
[root@web01 /server/scripts]# [ -z "$n" ] &&echo "没有任何输入"||echo "$n"
oldboy
[root@web01 /server/scripts]# read -p "请输入一个数:" n
请输入一个数:
[root@web01 /server/scripts]# [ -z "$n" ] &&echo "没有任何输入"||echo "$n"
没有任何输入
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# read -p "请输入一个数:" n
请输入一个数:oldboy
[root@web01 /server/scripts]# expr $n + 100 &>/dev/null
[root@web01 /server/scripts]# echo $?
2
[root@web01 /server/scripts]# read -p "请输入一个数:" n
请输入一个数:110
[root@web01 /server/scripts]# expr $n + 100 &>/dev/null
[root@web01 /server/scripts]# echo $?
0
[ 条件1 ] && {
    命令1     
	命令2     
	命令3 
}
如果条件成立,那么执行三个命令。

if [ 条件1 ]   
then     
	命令1     
	命令2     
	命令3 
fi

[ 条件1 ] || {
    命令1     
	命令2     
	命令3 
}
如果表达式不成立,那么执行三个命令。


[ -L oldboy ] && echo 1 || echo 0

[ 条件1 ] && {
    命令1     
	命令2     
} || { 
	命令3 
}
如果条件成立,那么执行命令1命令2,否则执行命令3。
[root@web01 /server/scripts]# cat 02-read.sh 
read -p "请输入两个整数:" a b
expr $a + $b + 999 &>/dev/null
[ $? -ne 0 ]&&{
   echo "其中有一个输入不是数字."
   exit 1
}
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))"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值