shell语法

发布时间 2023-03-28 16:23:59作者: hesperid

Shell脚本一般是以sh结尾,比如test.sh,也可以用其他结尾

执行shell脚本:

1. sh test.sh

2. ./test.sh  (这个需要给脚本赋予可执行的权限  chmod +x test.sh)

定义变量:

name=”test”

age=18

class=(“1ban” “2ban” “3ban”)     #数组,用空格隔开

echo ${name}     #输出变量的值,一般需要用到$符号;不用也可以

echo ${class}       #输出数组的值,不指定的话,默认是取第一个值

echo ${class[*]}     #输出数组所有的值

echo ${class[1]}      #输出指定数组的值 

输入输出:

echo “请输入你的名字:”

read name             #echo是输出 ,read是输入内容,输入的内容被赋值给变量name

echo “你的名字是${name}”        #双引号,输出的内容会转义,会输出name变量的值

echo ‘你的名字是${name}’         #单引号,原样输出里面的内容,不会进行转义

 

数学运算:

age=18

a=`expr 1 + 1`    #需要进行加减乘除(加+ 减-  乘\*  除/)数学运算的时候,PS:乘*需要转义符号\,要用expr和符号`,并且以空格隔开

b=`expr ${age} + 1`    #还可以运算数值变量,这里的b值就是19

echo $a

echo $b

数字型判断、单条件判断 if:

字符运算符号: !=  =   $(是否为空)

数值型运算符号:-eq等于  -ne不等于   -lt小于  -gt大于   -lte小于等于  -gte大于等于

且或:-a是且  -o是或

例子1:

echo “请输入年龄”

read age

if [ $age -gt 18 ]     #if后跟[],里面都需要空格隔开,-gt是大于的意思

then         #if和elif后都需要跟then

echo “成年人”

elif [ $age -lt 18 ]

then

echo “未成年人”

else

echo “刚满18岁”

fi   #以fi结尾

例子2:

age=8

if [ $age -gt 10 -a ` expr $age % 2 ` -eq 0]    #如果age大于10 且age是偶数

then

echo “是大于10的偶数”

fi

例子3:

city=”Beijing”

if [ $city = “Beijing” ]

then

echo “城市是北京”

fi

取字符串的长度:

例子1:

name=”beijing”

class=(“1班” “2班” “3班”)

echo ${#name}      # 符号#是取字符串的长度

echo ${class[*]}      # 符号*是取变量class的所有元素

echo ${#class[*]}      #取字符串所有元素的个数

 

循环for while:

例子1:

for item in ${class[*]}    #循环数组class里的所有元素

do       #r如果符合循环条件,就输出下面的内容

echo $item     #输出每个元素

done

例子2:

for num in 1 2 3 4     #循环1234这几个数

do       #r如果符合循环条件,就输出下面的内容

echo $num

done

例子3:

count=0

while [ $count -lt 10 ]    #循环判断count是否小于10

do

echo $count

count=`expr $count + 1`    #如果不符合条件,就count+1

done

 

函数:

例子1:

oushu(){                  #函数的写法,用()和{}

number=$1              #$1就是把调用函数时入参的第一个参数赋值给number,是写在函数 里面的。如果是写在函数外面,就是获取执行脚本时输入的参数

if [ 0 -eq `expr $number % 2`]

then

echo “是偶数”

else

echo “是奇数”

fi

}

oushu 5              #调用函数,并传参的写法

oushu 5 4 6        #传多个参数的写法

 

例子2:判断一个文件是否大于100M,如果大于,就删掉它

delete(){

a=`expr 100 \* 1024` #变量a定一个100M的kb大小

file=$1 #取函数传参的第一个参数

size=`du -k $file | awk ‘{print $1}’` #符号`里是执行的linux命令,du -k $file | awk ‘{print $1}’ 这个命令是输出传参文件的kb大小(print $1是取出查出来的第一列),比如du -k $file输出的是4 test.sh,那么awk ‘{print $1}’取的就是4

If [ $size -gt $a ] #如果参数文件大于100M

then

return 0 #如果是,就输出0,否则输出1,shell函数返回值只能是整型数值,0表示成功,其他值表示失败

else

return 1

fi

}

If delete “test.sh” #判断一个函数是否成功,语法这么写

#给函数delete传参test.sh,这里传文件的路径,如果文件跟脚本是同级目录,就直接写文件名;判断如果函数返回值是0(表示成功)

then

rm -rf “test.sh” #如果函数成功,文件大小大于100M,就删除这个文件

fi

PS:

1、shell函数的返回值只能是整型数值,一般是用来表示函数执行成功与否的,0表示成功,其他值表示失败。因而如果想用函数返回值来返回函数执行结果是不合适的。

2、获取函数的返回值:第一个方法是定义全局变量,函数将计算结果赋给全局变量,然后脚本中其他地方访问全局变量,就可以获得函数返回的一个或多个执行结果了。如下例3

3、获取函数的返回值:第二个方法可以直接用$?的方式,如下例4

例子3:

abc=“qjbl” #定义一个全局变量

hanshu(){

num=$1

If [ $num -gt 0 ]

then

abc=“入参大于0” #在函数成功的判断里,重新赋值给全局变量

return 0

else

return 1

fi

}

hanshu 1

echo $abc #调用函数后,就可以输出全局变量的值,相当于获得函数的返回值

 

例子4:

hanshu(){

num=$1

If [ $num -gt 0 ]

then

return 0

else

return 1

fi

}

hanshu 1

result=$? #调用完函数之后,立马就用$?获取函数的返回值0或者其他值,并输出出来

echo $result

 重定向:

就是读取文件内容,或者把内容写到文件里去

例1:

content=`< test.sh` #``是执行命令,把同级目录下的test.sh文件里的内容赋值给 content

echo $content > test2.sh #输出content的值写到文件test2.sh里去

echo $content >> test2.sh #>是覆盖test2的内容,>>是追加内容

 

练习1: 启动mysql的脚本

arg=$1 #写在函数外面,即执行该脚本时,把第一个参数赋值给arg,比如mysql.sh test,就是把test赋值给arg

pid=`ps -ef|grep /opt/lampp/sbin/mysqlld |grep -v grep|awk ‘{print $2}’`

#这条命令是查询mysql的进程,并取出进程号,进程号一般是第二列,所以用 print $2;命令需要用``

start_command=“/opt/lampp/lampp startmysql” #启动mysql的命令

stop_command=“/opt/lampp/lampp stopmysql” #停止mysql的命令

start(){

if [ $pid ] #$pid是判断是否存在,如果存在就是true

then

echo “mysql已经是启动的”

else

$star_command #进程号不存在,就执行这条命令,$+linux命令就是执行这条命令

echo “mysql已启动”

fi

}

stop(){

if [ $pid ]

then

$stop_command #如果进程号存在,就说明已启动,就执行停止的命令

echo “mysql已停止”

else

echo “mysql已经是停止的”

fi

}

 

restart(){

stop

start #重启就是先掉用停止的函数,再调用启动的函数

}

 

if [ “$arg” = “stop” -o “$arg” = “start” -o “$arg” = “retsart” ]

#判断执行脚本时的参数如果时这三个里的一个,注意: 字符串判断需要加引号,比 如“$arg”,否则会被认为是执行命令

then

$arg       #如果参数是上面三个里的一个,就执行对应的函数,比如mysql.sh start,就执行start的函数

else

echo “请输入 start|stop|retsart”          #如果输入的不是这三个,就给个提示

fi

 

 

练习2:备份mysql

day=`date+%Y%m%d` #取日期,格式是20230323

file_name=“/temp/${day}_all_data.sql” #给一个绝对路径,命名sql脚本的名字

mysqldump -uroot -p123456 -A > $file_name #把数据库数据都导入到sql脚本里;mysqldump是备份数据库,-A是备份所有数据库的所有表

echo “mysql备份已完成”