特殊变量
$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.(( ))