【Linux中高级运维: 第52天——Shell编程】第2章:特殊变量+变量子串原理及应用+算术运算符+expr结合逻辑判断实践

特殊变量

$0	获取当前执行脚本的文件名,如果文件名带路径,则会显示出路径和文件名
$n	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#	可以显示传参到脚本中的参数个数
$*	传递给脚本或函数的所有参数。
$@	传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。
$?	测试返回值,上一条命令正确则输出0,非0则为False
$$	获取当前脚本的PID
$!	获取上一个后台脚本的PID
$_	上一个执行脚本的最后一个参数
如果传参数量大于$9,应该把脚本中的$9以上的用{}括起来,声明这个才	是变量,才可以正确引用,否则只会读到$后的一位。
[root@web01 /server/scripts]# set -- "I am" handsome oldboy.
[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]# cat kill.sh 
kill `cat /tmp/a.log`
[root@hosue /server/scripts/offic]# OLDBOY="I am oldboy" 
[root@hosue /server/scripts/offic]# echo $OLDBOY
I am oldboy
[root@hosue /server/scripts/offic]# echo ${OLDBOY}
I am oldboy
[root@hosue /server/scripts/offic]# echo ${#OLDBOY}         <---------------打印变量内容的长度
11
[root@hosue /server/scripts/offic]# echo ${OLDBOY:2:2}      <---------------偏移量2,后取两个
am
[root@hosue /server/scripts/offic]# echo ${OLDBOY:2}        <---------------偏移量2
am oldboy
[root@web01 /server/scripts]# OLDBOY=abcABC123ABCabc
[root@web01 /server/scripts]# echo $OLDBOY
abcABC123ABCabc
[root@web01 /server/scripts]# echo ${OLDBOY#a*C}     <-----从开头删除 条件:最短a*C范围内容
123ABCabc
[root@web01 /server/scripts]# echo ${OLDBOY##a*C}    <-----从开头删除 条件:最长a*C范围内容
abc
[root@web01 /server/scripts]# echo ${OLDBOY%a*C}        <-----从结尾删除 条件:最短a*C范围内容 
abcABC123ABCabc                                         <-----由于此处无匹配内容所以无动作
[root@web01 /server/scripts]# echo ${OLDBOY%a*c}        <-----从结尾删除 条件:最短a*c范围内容
abcABC123ABC
[root@web01 /server/scripts]# echo ${OLDBOY%%a*c}       <-----从结尾删除 条件:最长a*c范围内容
            										    <-----由于变量是以a开头以c结尾,所以输出空
[root@hosue /server/scripts/offic]# echo ${OLDBOY/abc/bcd}  <-----匹配第一个abc进行替换   
bcdABC123ABCabc
[root@hosue /server/scripts/offic]# echo ${OLDBOY//abc/bcd}  <-----匹配所有的abc进行替换
bcdABC123ABCbcd
获取变量内容长度的五种方法:
[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

有关计算字符串长度有一个企业面试案例,面试题目如下

请编写Shell脚本打印下面语句中字符数小于6的单词。
I am oldboy linux,welcome to our training.

[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
${参数:-word}
[root@localhost ~]# echo $test    #>==   此时test变量未赋值

[root@localhost ~]# echo ${test:-word}      #>==  可以看到test变量未赋值,输出了 word,表明test变量为空,返回 “-”后面定义的字符,但是需注意 不会将word赋值给test变量,只是一个标识。
word
[root@localhost ~]# test="abc"    #>==  将test变量赋值 abc,查看输出结果
[root@localhost ~]# echo $test
abc
[root@localhost ~]# echo ${test:-word}   #>==  此时test变量有赋值,所以输出了test变量的值。
abc
${参数:=word}
[root@localhost ~]# unset test
[root@localhost ~]# echo $test  #>==  test变量未赋值
[root@localhost ~]# A=${test:=word}
[root@localhost ~]# echo $A     #>==   未赋值,则将word赋值给变量test
word
如果test变量有赋值,则直接输出test的变量
[root@localhost ~]# test="5678"
[root@localhost ~]# echo $test
5678
[root@localhost ~]# B=${test:=word}
[root@localhost ~]# echo $B   #>==  test变量有赋值,直接输出值,不会将word赋值给$test
5678

以上两个特殊变量的区别:

${parameter:-word}: 如果parameter有赋值,输出值,无赋值,输出"-"后定义的字符,不会赋值给变量parameter,只是显示信息
${parameter:=word}: 如果parameter有赋值,输出值,无赋值,将"="后定义的字符,赋值给变量parameter
${parameter:?word}
如果变量未赋值 
[root@localhost ~]# unset test   #>==  取消test变量的赋值
[root@localhost ~]# echo ${test:? is not value}
-bash: test:  is not value    #>==  可以看到,未赋值情况下,输出了? 后定义的错误信息

如果有赋值
[root@localhost ~]# test="abcdefg"   #>==   给test变量赋值
[root@localhost ~]# echo $test
abcdefg
[root@localhost ~]# echo ${test:? test  is not have value}
abcdefg    #>==   test变量有值的情况下,直接输出了值
${parameter:+word}
[root@localhost ~]# unset test
[root@localhost ~]# echo $test 

[root@localhost ~]# echo ${test:+word}       #>==  test变量为赋值,输出了空

[root@localhost ~]# test=aaaaaaa
[root@localhost ~]# echo ${test:+word}  #>==  输出word,说明test变量有赋值,但不会将word赋值给test,只是输出信息,用于提示
word
[root@localhost ~]# echo $test   #>==  test变量还是最初定义的值
aaaaaaa

算术运算:

**	幂运算
*  /  %	乘  除   取余(取模)
~    |    &      ^	按位取反 按位异或  按位与 按位或
=  +=  -=  *=   /=   %=	赋值运算符 a+=1相当于a=a+1
shell的常见算术运算命令:
运算操作符和命令	意义
(( ))	用于整数运算的常用运算符
let	用于整数运算 类似于(())
expr	用于整数运算
$[ ]	用于整数运算
bc	计算器,用于整数和小数
declear	定义变量值和属性,-i参数可以运算
awk	用于整数和小数计算

数值运算:

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
11
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
9
[root@web01 /server/scripts]# echo $((a--))
4
[root@web01 /server/scripts]# echo $a
3
[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

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

read命令:

-p   在read读入的时候输入一段内容提示用户
-t    等待用户输入时间         

变量赋值的三种方式

1)定义式   a=1
2)read读入式   
3)脚本传参   $1=100

\/
1.test
2.[   ]
3.[[   ]]
4.((   ))
                                                           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值