变量数值计算
(())命令
i=$((i+1)) #运算后赋值
echo $((i=i+1)) #输出最终的变量值
b=$((1+2**3-4%3)) b=8
自加:
[root@sf106232 ~]# echo $((a+=1))1[root@sf106232 ~]# echo $((a+=1))2[root@sf106232 ~]# echo $((a+=1))3 |
自减:
[root@sf106232 ~]#
echo
$((a+=1))4[root@sf106232 ~]#
echo
$((a-=1))3[root@sf106232 ~]#
echo
$((a-=1))2 |
判断:
[root@sf106232 ~]#
echo
$((10<1)) #错误输出00[root@sf106232 ~]#
echo
$((10>1)) #正确输出11[root@sf106232 ~]#
if
((8>7&&5==5)) ;then echo
yes ; fiyes[root@sf106232 ~]#
if
((8>7&&5==6)) ;then echo
yes ; else
echo no ; fino |
a++
[root@sf106232 ~]# a=10[root@sf106232 ~]#
echo
$((a++)) ##输出当前的值,然后自加10[root@sf106232 ~]#
echo
$((a++))11 |
a--
[root@sf106232 ~]#
echo
$((a++))13[root@sf106232 ~]#
echo
$((a))14[root@sf106232 ~]#
echo
$((a--))14[root@sf106232 ~]#
echo
$((a--))13 |
传参的使用
[root@sf106232 ~]# sh test.sh 2 8a+b=10[root@sf106232 ~]# cat test.sh
#!/bin/bash
a=$1b=$2echo
"a+b=$(($a +$b))" |
计算器功能
[root@sf106232 ~]# sh test.sh 1+23[root@sf106232 ~]# sh test.sh 1/20[root@sf106232 ~]# sh test.sh 1%21[root@sf106232 ~]# sh test.sh 3**29[root@sf106232 ~]# cat test.sh
#!/bin/bash
echo
$(($1)) |
方法二:
#!/bin/bash
#echo
$(($1))print_usage(){printf $"USAGE: sh $0 NUM1 {+|-|*|/} NUM2\n"exit
1}if
[ $# -ne 3 ] ## 传参个数为三为正确then
print_usagefifirstnum=$1secondnum=$3op=$2if
[ ! -n "`echo $firstnum|sed 's/[0-9]//g'`"] ## 判断是否为整数, -n 是判断是否为空值。不为空值说明不是整数。then print_usagefiif
[ "$op"
!= "+"
] && [ "$op"
!= "-"
]&& [ "$op"
!= "*"
] && [ "$op"
!= "/"
];then print_usagefiif
[ ! -n "`echo $secondnum|sed 's/[0-9]//g'`"];then ## 判断是否为整数, -n 是判断是否为空值。不为空值说明不是整数。 print_usagefiecho
"${firstnum}${op}${secondnum}=$((${firstnum}${op}${secondnum}))" |
执行结果:
[root@sf106232 ~]# sh test.sh 2 \* 42*4=8[root@sf106232 ~]# sh test.sh 2 + 42+4=6[root@sf106232 ~]# sh test.sh 2 - 42-4=-2[root@sf106232 ~]# sh test.sh 2 / 42/4=0 |
let的用法
[root@sf106232 ~]# i=2[root@sf106232 ~]# i=i+8[root@sf106232 ~]#
echo
$ii+8[root@sf106232 ~]# unset i[root@sf106232 ~]# i=2[root@sf106232 ~]# let i=i+8[root@sf106232 ~]#
echo
$i10 |
expr用法
expr 14 % 9 # 整数运算SUM=`expr 2 \* 3` # 乘后结果赋值给变量LOOP=`expr
$LOOP
+ 1` # 增量计数(加循环即可) LOOP=0expr length
"bkeep zbb"
# 计算字串长度expr
substr
"bkeep zbb" 4 9 # 抓取字串expr index
"bkeep zbb"
e # 抓取第一个字符数字串出现的位置expr 30 / 3 / 2 # 运算符号有空格expr bkeep.doc :
'.*'
# 模式匹配(可以使用expr通过指定冒号选项计算字符串中字符数)expr bkeep.doc :
'\(.*\).doc'
# 在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名 |
例子:
expr $i + 6 &>/dev/null
[root@sf106232 ~]# cat 1111.sh
#!/bin/bash
expr
$1
+ 1 >/dev/null 2>&1 [ $? -eq 0 ] &&
echo
int||echo
chars #返回值为0输出int 否则输出chars[root@sf106232 ~]# sh 1111.sh 3int[root@sf106232 ~]# sh 1111.sh hhchars[root@sf106232 ~]# sh 1111.sh test
chars |
例子2:
持续判断:
[root@sf106232 ~]# cat 11111.sh
#!/bin/bashwhile
true do read -p
"please input:"
a expr
$a
+ 0 >/dev/null 2>&1 [ $? -eq 0 ] &&
echo
int || echo
charsdone |
结果:
[root@sf106232 ~]# sh 11111.sh
please input:12intplease input:32intplease input:testcharsplease input:34intplease input:34.4chars |
例子3
判断文件扩展名是否符合要求
#!/bin/bash
if expr "$1" : ".*\.pub" &>/dev/null
then
echo "you are using $1"
else
echo "please use *.pub file"
fi
测试:
root@sf106232 ~]# sh j.sh id_dsa
please use *.pub file
[root@sf106232 ~]# sh j.sh id_dsa.pub
you are using id_dsa.pub
[root@sf106232 ~]# sh j.sh .pub
you are using .pub
利用expr计算字符串的长度
[root@sf106232 ~]# expr length "$char"
7
[root@sf106232 ~]# echo ${#char}
7
[root@sf106232 ~]# echo ${char}|wc -L
7
打印语句中字符数不大于6的单词。
i like cool36o.org this is test hellohello
[root@sf106232 ~]# cat j1.sh
for n in i like cool36o.org this is test hellohello
do
if [ `expr length "$n"` -le 6 ]
then
echo $n
fi
done
结果:
[root@sf106232 ~]# sh j1.sh
i
like
this
is
test
方法2:
for n in i like cool36o.org this is test hellohello
do
if [ `echo ${n} |awk '{print length($0)}'` -le 6 ] ##awk中的length函数计算字符串的长度。
then
echo $n
# printf $n "\n"
fi
结果是一样的。
read
read:shell变量输入read命令
-p :设置提示信息
-t : 设置输入等待时间,默认为s
例子:
[root@sf106232 ~]# read -t 10 -p
"this is a test:"
a1 a2 ##超过10s时退出this is a test:11 22[root@sf106232 ~]#
echo
$a111[root@sf106232 ~]#
echo
$a222[root@sf106232 ~]#
|
例子2:加减乘除
这个例子思路还是不错的。
[root@sf106232 script]# cat read_size02.sh
#!/bin/basha=$1b=$2Usage() { echo
$"USAGE:sh $0 num1 num2" exit
1}if
[ $# -ne 2 ] ; then Usage
fiexpr
$a
+ 1 >/dev/null 2>&1[ $? -ne 0 ] && Usageexpr
$b
+ 1 >/dev/null 2>&1[ $? -ne 0 ] && Usageecho
"a-b=$(($a-$b))"echo
"a+b=$(($a+$b))"echo
"a*b=$(($a*$b))"echo
"a**b=$(($a**$b))"if
[ $b
-eq 0 ] then echo
"$b is not allow to run" echo
"a/b=error" echo
"a%b=error"else echo
"a/b=$(($a/$b))" echo
"%b=$(($a%$b))"fi |
结果:
[root@sf106232 script]# sh read_size02.sh 1 2a-b=-1a+b=3a*b=2a**b=1a/b=0%b=1[root@sf106232 script]# sh read_size02.sh 1 0a-b=1a+b=1a*b=0a**b=10 is not allow to runa/b=errora%b=error[root@sf106232 script]# sh read_size02.sh
USAGE:sh read_size02.sh num1 num2 |
shell脚本条件测试
test条件测试
-c<文件>:如果文件为一个字符特殊文件,则为真;
-d<文件>:如果文件为一个目录,则为真;
-e<文件>:如果文件存在,则为真;
-f<文件>:如果文件为一个普通文件,则为真;
-g<文件>:如果设置了文件的SGID位,则为真;
-G<文件>:如果文件存在且归该组所有,则为真;
-k<文件>:如果设置了文件的粘着位,则为真;
-O<文件>:如果文件存在并且归该用户所有,则为真;
-p<文件>:如果文件为一个命名管道,则为真;
-r<文件>:如果文件可读,则为真;
-s<文件>:如果文件的长度不为零,则为真;
-S<文件>:如果文件为一个套接字特殊文件,则为真;
-u<文件>:如果设置了文件的SUID位,则为真;
-w<文件>:如果文件可写,则为真;
-x<文件>:如果文件可执行,则为真。
[root@sf106232 script]# test -f test.sh1 &&echo
true ||echo
false #判断文件是否存在,存在输出true,不存在输出false.false[root@sf106232 script]# test -f test.sh &&echo
true ||echo
false true[root@sf106232 script]# test -f test.sh &&
echo
11[root@sf106232 script]# test -f test.sh1 ||
echo
00字符串测试[root@sf106232 script]# test -z
""
&&echo
1 || echo
0 #被测试的字符串为空,成立,返回值为1.1[root@sf106232 script]# test -z
"test"
&&echo
1 || echo
00 |
[[]]
[root@sf106232 script]# [[
exec.sh -ot play.sh ]] &&echo
1 || echo
0 ##exec.sh比play.sh旧,输出1sb,sdd[root@sf106232 script]# [[
exec.sh -nt play.sh ]] &&echo
1 || echo
0 ##exec.sh比play.sh新,输出1,否则输出0shauige |
特殊条件测试表达式
[ 条件1 ]&& {
命令1
命令2
....
}
[[ 条件1 ]]&& {
命令1
命令2
....
}
test 条件1 && {
命令1
命令2
....
}
例子:
[root@sf106232 script]# cat 6_29.sh
[ -f /etc ] || {echo
1echo
2 echo
3}[root@sf106232 script]#
[root@sf106232 script]# sh 6_29.sh
123 |
字符串测试表达式
-z "字符串" ###字符串长度为0 , 为真。
"串1"="串2" 为真。or "串1"=="串2" 为真。
"串1"!="串2" 为真。
注释:字符串的比较需加"".
[root@sf106232 script]# [ -n
"abc"
] && echo
1 || echo
01[root@sf106232 script]# [ -n
""
] && echo
1 || echo
00[root@sf106232 script]# [ -z
"abc"
] && echo
1 || echo
00[root@sf106232 script]# [ -z
""
] && echo
1 || echo
01[root@sf106232 script]# [
"abc"
= "abc"
] || echo
0 && echo
11[root@sf106232 script]# [
"abc"
= "abcd"
] && echo
1 || echo
0 0[root@sf106232 script]# [
"abc"
== "abc"
] && echo
1 || echo
0 1[root@sf106232 script]# [
"abc"
!= "abc"
] && echo
1 || echo
0 0[root@sf106232 script]# [
"abc"
!= "abcd"
] && echo
1 || echo
0 1 |
逻辑操作符
-a and 两端都为真,结果为真。 ## [[]] &&
-o or 两端有一个为真 ,结果为真 ## [[]] ||
! not 两端相反,结果为真 ## [[]] !
例子:
[root@sf106232 script]# [ -f /etc/hosts -a -f /etc/services ] &&
echo
1 || echo
01[root@sf106232 script]# [ -f /etc/hosts && -f /etc/services ] &&
echo
1 || echo
0-bash: [: missing `]'0[root@sf106232 script]# [[ -f /etc/hosts && -f /etc/services ]] &&
echo
1 || echo
01[root@sf106232 script]# [ 5 -eq 6 -o 5 -gt 3 ] &&
echo
1 || echo
01[root@sf106232 script]# [ 5 -eq 6 -o 5 -gt 6 ] &&
echo
1 || echo
00[root@sf106232 script]# (( 5==6 || 5>3 )) &&
echo
1 || echo
01[root@sf106232 script]# (( 5==6 || 5<3 )) &&
echo
1 || echo
00 |
例子2:
- [root@sf106232 script]# for n in `ls /etc/init.d/*`;do egrep -wn "\[\[ " $n && echo $n ; done
- 274: if [[ "$OS_VER" < "10.5.0" ]]
- /etc/init.d/elasticsearch
- 560: if [[ "$x" =~ "^/dev/" ]] ; then
- /etc/init.d/functions
- 144: if [[ "$dst" =~ "^/dev/mapper" ]] \
- /etc/init.d/halt
- 41: if [[ "$rootopts" =~ "_netdev" ]] ; then
- /etc/init.d/iscsi
- 51: if [[ "$rootopts" =~ "_netdev" ]] ; then
- /etc/init.d/iscsid
- 78: if ! [[ "$SYSLOGADDR" =~ "^([0-9]{1,3}\.){3}[0-9]{1,3}$" ]]; then
- /etc/init.d/netconsole
- 185: if [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev|_rnetdev" ]] ; then
- /etc/init.d/network
例子3:
输入一个数,等于1就打印1 ,等于2就打印2 ,否则就提示错误,退出。
[root@sf106232 script]# sh 6_29.sh
please input a char:11[root@sf106232 script]# sh 6_29.sh
please input a char:22[root@sf106232 script]# sh 6_29.sh
please input a char:3error[root@sf106232 script]# cat 6_29.sh
#!/bin/bashecho
-n "please input a char:"read
var[
"$var"
== "1"
] && { echo
1 exit
0 }[
"$var"
== "2"
] && { echo
2 exit
0}[
"$var"
!= "1"
-a "$var"
!= "2"
] && { echo
error exit
1} |
[root@sf106232 script]# sh 6_29.sh
error[root@sf106232 script]# sh 6_29.sh 11[root@sf106232 script]# sh 6_29.sh 22[root@sf106232 script]# cat 6_29.sh
#!/bin/bash#echo
-n "please input a char:"#read
varvar=$1[
"$var"
== "1"
] && { echo
1 exit
0 }[
"$var"
== "2"
] && { echo
2 exit
0}[
"$var"
!= "1"
-a "$var"
!= "2"
] && { echo
error exit
1} |
例子4:
[root@sf106232 script]# cat 6_29_1.sh#!/bin/bashread -p
"please input two num:"
a b#1[ -z
"$a"
] || [ -z "$b"
] && { echo
" please input two num again." exit
1}#2expr
$a
+ 10 >/dev/null 2>&1 RETVAL1=$?expr
$b
+ 10 >/dev/null 2>&1RETVAL2=$?test
$RETVAL1
-eq 0 -a $RETVAL2
-eq 0 || { echo
"pls two "num" again." exit}#3[
$a
-eq $b
] && { echo
"$a = $b" exit
0}[
$a
-gt $b
] && { echo
"$a > $b " exit
0}[
$a
-lt $b
] && { echo
"$a < $b " exit
0}结果:[root@sf106232 script]# sh 6_29_1.sh
please input two num:23.2 23. 3pls two num again.[root@sf106232 script]# sh 6_29_1.sh
please input two num:23 .^H^H^H^H^H^Hpls two num again.[root@sf106232 script]# sh 6_29_1.sh
please input two num:23.1 23pls two num again.[root@sf106232 script]# sh 6_29_1.sh
please input two num:23 1223 > 12
|
写法2:
[root@sf106232 script]# cat 6_29_1.sh
#!/bin/bash#read -p
"please input two num:"
a b#1a=$1b=$2[ $# -ne 2 ] && { echo
"USAGE:$0 NUM1 NUM2" exit
1 }#2expr
$a
+ 10 >/dev/null 2>&1 RETVAL1=$?expr
$b
+ 10 >/dev/null 2>&1RETVAL2=$?test
$RETVAL1
-eq 0 -a $RETVAL2
-eq 0 || { echo
"pls two "num" again." exit}#3[
$a
-eq $b
] && { echo
"$a = $b" exit
0}[
$a
-gt $b
] && { echo
"$a > $b " exit
0}[
$a
-lt $b
] && { echo
"$a < $b " exit
0}结果:[root@sf106232 script]# sh 6_29_1.sh 12USAGE:6_29_1.sh NUM1 NUM2[root@sf106232 script]# sh 6_29_1.sh 12 1312 < 13
[root@sf106232 script]# sh 6_29_1.sh 12 13.1pls two num again.[root@sf106232 script]# sh 6_29_1.sh 13 1213 > 12
|
利用判断表达式展示菜单操作
[root@sf106232 script]# cat 6_29_2.sh
#!/bin/bash#*****************************************************# Author: suixiaofeng# blog:http://blog.cool360.org# Email: 258818040@qq.com
# Last modified: 2017-06-29 20:43# Filename: 6_29_2.sh# Description:
#****************************************************cat <<
END 1.panxiaoting 2.gongli 3.fanbinbingENDread -p
"Which do you like? input the num:"
a[
"$a"
= "1"
] && { echo
"I guess ,you like panxiaoting" exit
0}[
"$a"
= "2"
] && { echo
"I guess ,you like gongli " exit
0 }[
"$a"
== "3"
] && { echo
" I guess , you like fangbinbing" exit
0 }[[ !
"$a"
=~ [1-3] ]] && { echo
" I guess,you are not man." exit
0}[root@sf106232 script]# sh 6_29_2.sh
1.panxiaoting 2.gongli 3.fanbinbingWhich
do
you like? input the num:3 I guess , you like fangbinbing[root@sf106232 script]# sh 6_29_2.sh
1.panxiaoting 2.gongli 3.fanbinbingWhich
do
you like? input the num:4 I guess,you are not man. |
模拟安装lnmp环境
[root@sf106232 script]# cat 6_29_4.sh
#!/bin/bash#*****************************************************# Author: suixiaofeng# blog:https://blog.cool360.org# Email: 258818040@qq.com
# Last modified: 2017-06-29 21:08# Filename: 6_29_4.sh# Description:
#****************************************************path=/u02/script[ ! -d
"$path"
] && { mkdir
-p "$path"}cat <<
END 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you chiose:ENDread numexpr
$num
+ 1 &>/dev/null[ $? -ne 0 ] && {
echo
"the num you input must be {1|2|3}" exit
1}[
$num
-eq 1 ] && { echo
"start installing lamp." sleep 2; [ -x
"$path/lamp.sh"
] || { echo
"$path/lamp.sh does not exist or can not be exec." exit
1 } $path/lamp.sh exit
$?}[
$num
-eq 2 ] && { echo
"start installing lnmp." sleep 2; [ -x
"$path/lnmp.sh"
] || { echo
"$path/lnmp.sh does not exist or can not be exec." exit
2 } $path/lnmp.sh exit
$?}[
$num
-eq 3 ] && { echo
bye. exit
3 }[[ !
$num
=~ [1-3] ]] && { echo
"the num you input must be {1|2|3}" echo
"Input ERROR ! " exit
4}结果:[root@sf106232 script]# sh 6_29_4.sh
1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you chiose:2start installing lnmp.start install lAmp..[root@sf106232 script]# sh 6_29_4.sh
1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you chiose:3bye.[root@sf106232 script]# sh 6_29_4.sh
1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you chiose:4the num you input must be {1|2|3}Input ERROR !
|
echo " I guess,you are not man."
exit 0
}
Shell脚本变量与运算

65

被折叠的 条评论
为什么被折叠?



