当前位置: 首页 > Linux

shell脚本基础知识

时间:2023-04-06 20:29:30 Linux

mac终端运行shell脚本,自己写脚本,比如aa.sh打开终端执行方法一:输入命令./aa.sh方法二:直接拖aa.sh进入终端注意事项:如果不成功,报问题:#PermissiondeniedNopermission解决方法:修改文件aa.sh的权限:chmod777aa.sh然后执行上面第二步的操作。变量定义变量#不带美元符号的变量名your_name="elaine"#重新定义your_name="newname"第一个字符必须是字母(a-z,A-Z)。中间不能有空格,可以使用下划线(_)。不能使用标点符号。bash中的关键字不能使用(使用help命令查看保留关键字)。只读变量#!/bin/bashmyUrl="http://lingmissing.github.io"readonlymyUrlmyUrl="http://www.google.com"运行脚本,结果如??下:/bin/sh:名称:此变量是只读的。使用变量your_name="qinjx"echo$your_nameecho${your_name}echo"yournameis${your_name}-l"变量名外的花括号是可选的,可以加花括号是为了帮助解释器识别边界的变量。删除变量unsetvariable_name变量删除后不能再使用。unset命令不能删除只读变量。#!/bin/shmyUrl="http://lingmissing.github.io"unsetmyUrlecho$myUrlvariabletypelocalvariable:局部变量定义在脚本或命令中,只在当前shell实例中有效,启动的程序其他shell无法访问局部变量。环境变量:所有的程序,包括shell启动的程序,都可以访问环境变量,有些程序需要环境变量来保证其正常运行。必要时,Shell脚本还可以定义环境变量。Shell变量:Shell变量是由shell程序设置的特殊变量。shell变量有的是环境变量,有的是局部变量。这些变量保证了shell的正常运行。Stringsinglequotestr='thisisastring'单引号中的任何字符将原样输出,单引号字符串中的变量无效。单引号字符串中不能出现单引号(单引号使用转义字符后不行)双引号your_name='qinjx'str="Hello,Iknowyourare\"$your_name\"!\n"那里可以be变量用双引号转义字符拼接stringyour_name="qinjx"greeting="hello,"$your_name"!"greeting_1="hello,${your_name}!"echo$greeting$greeting_1得到字符串长度string="abcd"echo${#string}#Output4提取子串下面的例子从字符串的第2个字符开始截取4个字符:string="runoobisagreatsite"echo${string:1:4}#输出unoosearchsubstringsearchcharacter"iors":string="runoobisagreatcompany"echo`exprindex"$string"is`#输出8个数组bash支持一维数组(不支持多维数组)),并且不限制数组的大小。定义一个数组#格式:arrayname=(value1value2...valuen)array_name=(value0value1value2value3)#orarray_name=(value0value1value2value3)#orarray_name[0]=value0array_name[1]=value1array_name[n]=valuen读取数组#格式:${数组名[下标]}valuen=${array_name[n]}#使用@符号获取数组中的所有元素echo${array_name[@]}获取长度thearray#获取数组元素个数length=${#array_name[@]}#或length=${#array_name[*]}#获取数组单个元素的长度lengthn=${#array_name[n]}以“#”开头的注释行是注释,将被解释器忽略。#------------------------#这正在评论#作者:elaine#站点:lingmissing.github.io#口号:学习的不仅是技术,更是梦想!#--------------------------------------------#####用户配置区开始########这里可以添加脚本描述信息#######用户配置区结束#####参数传递脚本是:$n。n代表一个数字,1是执行脚本的第一个参数,2是执行脚本的第二个参数,依此类推...echo"Shell传递参数实例!";echo"执行的文件名:$0";echo"第一个参数是:$1";echo"第二个参数是:$2";echo"第三个参数是:$3";执行$./test.sh123#打印执行的文件名:./test.sh第一个参数为:1第二个参数为:2第三个参数为:3参数处理说明$#传递给脚本的参数个数$*显示传递给脚本的所有参数在单个字符串参数中.例如“$*”用“”括起来,则所有参数将以“$1$2...$n”的形式输出。$$脚本运行的当前进程的ID号$!后台运行的最后一个进程ID号$@与$*相同,但使用时加引号,每个参数用引号返回。例如"$@"用""括起来,所有参数将以“$1”“$2”...“$n”的形式输出。$-显示当前Shell使用的选项,与set命令功能相同。$?显示最后一个命令的退出状态。0表示没有错误,任何其他值表示错误。基本运算算术运算符关系运算符布尔运算符字符串运算符文件测试运算符expr是一个表达式计算工具,可以完成表达式求值运算。#!/bin/bashval=`expr2+2`echo"两数之和为:$val"执行脚本,输出结果为两数之和:4注意:两数之间必须有空格expressionandtheoperator必须包含表达式,注意这个字符不是常用的单引号算术运算符运算符说明example+addition`expr$a+$b`-subtraction`expr$a-$b`*multiplication`expr$a*$b`/除法`expr$b/$a`%余数`expr$b%$a`=赋值a=$b==等于[$a==$b]!=不等于[$a!=$b]#!/bin/sha=10b=20val=`expr$a+$b`echo"a+b:$val"val=`expr$a-$b`echo"a-b:$val"val=`expr$a\*$b`echo"a*b:$val"val=`expr$b/$a`echo"b/a:$val"val=`expr$b%$a`echo"b%a:$val"if[$a==$b]thenecho"aisequaltob"fiif[$a!=$b]thenecho"aisnotequaltob"fi执行后输出a+b:30a-b:-10a*b:200b/a:2b%a:0aisnotequaltob乘号(*)前必须加反斜杠()才能实现乘法;if...then...fi是一个条件语句,后面会解释。MAC中shell的expr语法为:$((expression)),其中表达式中的“*”不需要对符号“”进行转义。关系运算符运算符说明示例-eq检查两个数是否相等,如果相等则返回真。[$a-eq$b]-ne检查两个数字是否相等,如果不相等则返回真。[$a-ne$b]-gt检查左边的数是否大于右边的数,如果是,则返回真。[$a-gt$b]-lt检查左边的数字是否小于右边的数字,如果是,则返回真。[$a-lt$b]-ge检查左边的数是否大于或等于右边的数,如果是,则返回真。[$a-ge$b]-le检查左边的数是否小于等于右边的数,如果是,则返回真。[$a-le$b]布尔运算符运算符说明示例!不操作[!false]-o或操作[$a-lt20-o$b-gt100]-a和操作[$a-lt20-a$b-gt100]自||在markdown中被识别为分表,这里逻辑运算符用O代替。运算符说明示例&&逻辑与[[$a-lt100&&$b-gt100]]O逻辑或[[$a-lt100O$b-gt100]]字符串运算符运算符说明示例=检查两个字符串是否等于,等于返回真。[$a=$b]!=检查两个字符串是否相等,如果不相等则返回真。[$a!=$b]-z检测字符串长度是否为0,为0返回true[-z$a]-n检测字符串长度是否为0,不为0返回true0.[-n$a]str检查字符串是否为空,如果不为空则返回true。[$a]filetestoperatoroperatordescriptionexample-bfile检查文件是否为块设备文件,如果是则返回true。[-b$file]-cfile检查文件是否为字符设备文件,如果是则返回真。[-c$file]-dfile检查文件是否为目录,如果是则返回真。[-d$file]-ffile检查文件是否为普通文件(既不是目录也不是设备文件),如果是则返回真。[-f$file]-gfile检测文件是否设置了SGID位,如果是则返回true。[-g$file]-kfile检查文件是否有粘滞位(StickyBit),如果有,返回true。[-k$file]-pfile检查文件是否为命名管道,如果是则返回真。[-p$file]-ufile检查文件是否设置了SUID位,如果是则返回true。[-u$file]-rfile检查文件是否可读,如果是则返回真。[-r$file]-wfile检查文件是否可写,如果是则返回真。[-w$file]-xfile检查文件是否可执行,如果是则返回真。[-x$file]-sfile检查文件是否为空(文件大小是否大于0),不为空则返回true。[-s$file]-efile检查文件(包括目录)是否存在,如果存在则返回true。[-e$file]#!/bin/shfile="/var/www/runoob/test.sh"if[-r$file]thenecho"文件可读"elseecho"文件不可读"fiif[-w$file]thenecho"文件可写"elseecho"文件不可写"fiif[-x$file]thenecho"文件可执行"elseecho"文件不可执行"fiif[-f$file]thenecho"文件是普通文件"elseecho"文件是特殊文件"fiif[-d$file]thenecho"文件是目录"elseecho"文件不是目录"fiif[-s$file]thenecho"fileisnotempty"elseecho"Thefileisempty"fiif[-e$file]thenecho"文件存在"elseecho"文件不存在"fi执行脚本,输出如下如下:文件可读,文件可写,可执行文件为普通文件,文件不目录文件不为空,文件存在。echo命令显示正常字符串:echo"Itisatest"#orechoItisatest显示转义字符echo"\"Itisatest\""显示变量echo"$nameItisateset"显示行breakecho-e"OK!\n"#-e打开转义并显示没有换行符echo-e"OK!\c"#-e打开转义\c输出字符串,因为它没有换行符echo'$name\"'显示执行结果echo`date`echo`date+%Y%m%d`扩展名:打印带颜色的字符串#字体颜色选项说明echo"\033[30mblackwords\033[0m"echo"\033[31m红色字符\033[0m"echo"\033[32m绿色字符\033[0m"echo"\033[33m黄色字符\033[0m"echo"\033[34m蓝色字符\033[0m"echo"\033[35m紫色字符\033[0m"echo"\033[36m天蓝色字符\033[0m"echo"\033[37m白色字符\033[0m"echo"\033[40;37m黑底白字\033[0m"echo"\033[41;37m红底白字\033[0m"echo"\033[42;37m白字绿底\033[0m"echo"\033[43;37m黄底白字\033[0m"echo"\033[44;37m蓝底白字\033[0m"echo"\033[45;37m紫底白字\033[0m"echo"\033[46;37m天蓝底白字\033[0m"echo"\033[47;30m白底黑字\033[0m"#控制选项说明\33[0m关闭所有属性\33[1m设置高度亮度\33[4m下划线\33[5m闪烁\33[7m反转显示\33[8m空白\33[30m--\33[37m设置前景color\33[40m--\33[47m设置背景颜色\33[nA光标向上n行\33[nB光标向下n行\33[nC光标向右n行\33[nD光标向左n行\33[y;xH设置光标位置\33[2J清屏\33[K清除光标到行尾\33[s保存光标位置\33[u恢复光标位置\33[?25l隐藏光标\33[?25h显示光标printfcommandprintfformat-string[arguments...]参数说明:format-string:用于格式控制字符串arguments:用于参数列表,默认printf不会像echo那样自动添加换行符,我们可以手动添加n。$echo"Hello,Shell"Hello,Shell$printf"Hello,Shell\n"Hello,Shell$转义序列描述a警告字符,通常是ASCIIBEL字符b回溯c抑制(不显示)输出中的任何尾随换行符(仅在%b格式说明符的控制下在参数字符串中有效),参数中剩余的任何字符、任何后续参数以及格式字符串中剩余的任何字符都将被忽略fformfeednlinefeedrcarriagereturn(回车)t水平制表符v垂直制表符\文字反斜杠字符ddd表示八进制值为1到3位的字符。只在格式字符串中有效0ddd表示1到3个八进制值字符#!/bin/shprintf"%-10s%-8s%-4s\n"namegenderweightkgprintf"%-10s%-8s%-4.2f\n"GuoJingnan66.1234printf"%-10s%-8s%-4.2f\n"YangGuonan48.6543printf"%-10s%-8s%-4.2f\n"GuoFunu47.9876执行脚本,输出结果如下显示:姓名、性别、体重kg郭靖男66.12杨郭男48.65郭富女47.99%s%c%d%f都是格式替换字符%-10s表示宽度为10个字符(-表示左对齐,没有表示右对齐),任何字符都会显示在10个字符宽以内,不足则自动补空格,超出则显示全部内容。%-4.2f指格式化为小数,其中.2指保留2位小数。testcommandnum1=100num2=100iftest$[num1]-eq$[num2]thenecho'两个数相等!'elseecho'两个数不相等!'fi流控制ifstatement#ififconditionthencommand1command2...commandNfi#orif[$(ps-ef|grep-c"ssh")-gt1];然后回声“真”;fi#ifelseifconditionthencommand1command2...commandNelsecommandfi#ifelse-ifelseifcondition1thencommand1elifcondition2thencommand2elsecommandNfiforloopforvarinitem1item2...itemNdocommand1command2...commandNdone#orforvarinitem1item1;2do...命令N...完成;例如#Loopnumbersforloopin12345doecho"Thevalueis:$loop"done#Loopstringsforstrin'Thisisastring'doecho$strdonewhile语句while循环执行一系列命令直到条件为假时停止。whileconditiondocommanddone#case#!/bin/shint=1while(($int<=5))doecho$intlet"int++"doneuntilLoopuntil循环执行一系列命令直到条件为真并停止。untilconditiondocommandonecasestatementcasevalueinmode1)command1command2...commandN;;模式2)命令1命令2...命令N;;esac#!/bin/shecho'请输入一个1到4之间的数字:'echo'你输入的数字是:'readaNumcase$aNumin1)echo'你选择了1';;2)echo'你选择了2';;3)echo'你选择了3';;4)echo'你选择了4';;*)echo'Youdidnotenteranumberbetween1and4';;esacbreakbreak命令允许跳出所有循环(终止所有后续循环的执行)。#!/bin/shwhile:doecho-n"Enteranumberbetween1and5:"readaNumcase$aNumin1|2|3|4|5)echo"Thenumberyouenteredis$aNum!";;*)echo"您输入的数字不在1到5之间!游戏结束"break;;esacdonecontinuecontinue命令与break命令类似,只有一点不同,它不会跳出所有循环,只会跳出当前循环。#!/bin/shwhile:doecho-n"Enteranumberbetween1and5:"readaNumcase$aNumin1|2|3|4|5)echo"你输入的数字是$aNum!";;*)echo"您输入的数字不在1到5之间!"continueecho"游戏结束";;用两个分号表示中断。函数[函数]函数名[()]{动作;[returnint;]}#!/bin/shdemoFun(){echo"Thisismyfirstshellfunction!"}echo"-----FunctionstartExecute-----"demoFunecho"-----Functioncompleted-----"#!/bin/bashfunWithReturn(){echo"此函数将把两个输入数字相加..."echo"输入第一个数字:"readaNumecho"输入第二个数字:"readanotherNumecho"这两个数字是$aNum和$anotherNum!"return$(($aNum+$anotherNum))}funWithReturnecho"两个输入数字的和是$?!"函数参数funWithParam(){echo"第一个参数是$1!"echo"第二个参数是$2!"echo"第十个参数是$10!"echo"第十个参数是${10}!"echo"第十一个参数是${11}!"echo"参数总数为$#!"echo"Outputallparameters$*asastring!"}funWithParam1234567893473常用系统内置命令mkdir创建文件夹touch创建文件mvdir移动或重命名目录zip压缩文件zip-q-r-e-m-o[yourName].zipsomeThing-q表示不显示压缩进度状态-r表示所有子目录和子文件都压缩成zip//这个比较重要,否则只压缩something文件夹,和里面没有压缩-e表示你的压缩文件需要加密,终端会提示你输入密码-m表示压缩后删除原文件-o表示将所有压缩文件的最后修改时间设置为当前压缩时间结合系统自带命令(点击查看)#!/bin/shmkdirshell_tutcdshell_tutfor((i=0;i<10;i++));做头chtest_$i.txtdone转载自菜鸟教程