shell语法
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备份已完成”
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律