1.概述Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以运行程序的接口。系统级程序,用户可以使用Shell来启动、暂停、停止甚至是编写一些程序。Shell是一个连接用户和Linux内核的应用程序,可以让用户更高效、更安全、更低成本地使用Linux内核。这就是壳牌的精髓。Shell也是一种非常强大的编程语言,易于编写、易于调试、灵活。Shell是一种用于解释和执行的脚本语言,Linux系统命令可以在Shell中调用。二、shell脚本的执行方法1、echo输出命令####(1)基本语法:echo[选项][输出内容]选项:-e:支持反斜杠控制字符转换控制字符作用\\outputitselfa输出警告音b退格键,也就是左边的删除键c取消输出行末尾的换行符。与“-n”选项一致,eESCAPE键f换页n换行r回车t制表符,即Tab键v垂直制表符0nnn按八进制ASCII码表输出字符。其中0为数字零,nnn为三位八进制数xhh,按照十六进制ASCII码表输出字符。其中hh为两位十六进制数####(2)case[root@localhost~]#echo"helloworld"helloworld2,第一个Shell脚本(一)需求:创建一个Shell脚本,输出helloworld(二)实用操作:[root@localhost~]#touchhelloworld.sh[root@localhost~]#vihelloworld.sh在helloworld.sh中输入以下内容#!**/**bin**/**bashecho"helloworld"三、脚本常用的执行方法第一种方法:输入脚本的绝对路径或相对路径1.首先给helloworld.sh脚本赋予+x权限[root@localhost~]#chmod777helloworld.sh2.执行脚本/root/helloWorld.sh./helloWorld.sh第二种:bash或sh+脚本(不需要给脚本+x权限)sh/root/helloWorld.shshhelloWorld.sh3.shell中的变量1)LinuxShell中的变量对于“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。2)系统变量:$HOME,$PWD,$SHELL,$USER等3)显示当前shell中的所有变量:set3.1,定义变量1)基本语法:variable=value2)Variable定义规则(1)变量名可以由字母、数字和下划线组成,但不能以数字开头。(2)等号两边不能有空格(3)变量名通常大写(4)双引号和单引号有区别。双引号仅删除空格,单引号删除所有特殊字符。3)CaseSTR="helloworld"A=8定义变量AunsetAUnset变量AreaonlyB=2声明静态变量B=2,不能unsetexport变量名,变量可以提升为全局环境变量,这可以被其他shell程序使用3.2,命令将返回值赋值给变量A=ls-labackticks,运行里面的命令,返回结果给变量AA=$(ls-la)相当于backticks3.3、设置环境变量1)基本语法:exportvariablename=variablevalue(功能说明:设置环境变量的值)echo$variablename(功能说明:查询环境变量的值)源配置文件(功能说明:让修改后的配置信息立即生效)2)案例:在/defineJAVA_HOME环境变量exportJAVA_HOME=/opt/java/jdk1.7.0_79exportPATH=$PATH:$JAVA_HOME/bin到etc/profile文件中查看环境变量JAVA_HOME的值[root@localhost~]#echo$JAVA_HOME/opt/java/jdk1.7.0_794,位置参数变量1)基本语法符号功能说明$nn是一个数字,$0代表命令本身,$1-$9代表第一个到第九个参数,十多个参数,十多个参数需要用大括号括起来,比如${10}$*这个变量代表中的所有参数命令行,$*将所有参数作为一个整体对待$@这个变量也代表命令行所有参数,但是$@将每个参数单独对待$#这个变量代表命令行所有参数的个数2)case(1)计算输入参数1和参数2的两个数之和,并输出到控制台#!/bin/bashnum1=$1num2=$2sum=$(($num1+$num2))#求和变量sum为num1加num2echo$sum#打印变量sum的值(2)打印输入参数Total,所有参数#!/bin/bashecho"一共of$#parameters"#用$#表示所有参数个数echo"Theparametersis:$*"#用$*表示所有参数echo"Theparametersis:$@"#用$@也表示所有参数(3)$*和$@#!的区别/bin/bashfori中的"$*"#$*把所有的参数看成一个整体,所以这个for循环只会循环一次doecho"的参数是:$i"donex=1foryin"$@"#$@"$@"#$@中的每个参数被认为是独立的,所以如果"$@"中有多个参数,就会循环多次doecho"Theparameter$xis:$y"x=$(($x+1))donea)$*和$@都表示传递给函数或脚本的所有参数,并且当它们没有被双引号括起来时"",都是以$1$2...$n开头的格式输出所有参数b)当用双引号"","$*"括起来时,会以"$1$2的形式将所有参数作为一个整体输出。..$n";"$@"将输出所有参数参数分隔,所有参数以"$1""$2"..."$n"的形式输出五、预定义变量1)基本语法:symbol功能说明$最后执行命令的返回状态如果这个变量的值为0,证明前面的命令执行正确;如果这个变量的值不为零(具体数字由命令自己决定),证明之前的命令执行错误$$currentprocess$!的进程号(PID)后台运行的最后一个进程的进程号(PID)2)case#!/bin/bash#输出当前进程的PID,即当前脚本执行时生成的进程PIDecho"当前进程为$$"#使用find命令在根目录下找到hello.sh文件。符号&表示将命令置于后台执行。find/root-namehello.sh&echo"最后一个守护进程是$!"echo"$?"4.运算符1.基本语法:(1)"$((运算表达式))"or"$[运算表达式]"(2)exprm+n注意expr运算符必须有空格2.案例:计算(2+3)X4的值(1)使用$[计算公式][root@localhost~]#S=$[(2+3)*4][root@localhost~]#echo$S(2)expr分布计算S=`expr2+3`expr$S\*4(3)expr一步完成计算expr`expr2+3`\*4echo`expr\`expr2+3\`\*4`5。条件判断1.判断语句1)基本语法:[condition](注意条件前后必须有空格)注意:不为空则返回true,可以用$?验证(0为真,>1为假)2)案例:[test]返回true[]返回false[condition]&&echoOK||echonotok如果满足条件,则执行下面语句比较-lt小于-le小于等于-eq等于-gt大于-ge大于等于-ne不等于2)根据文件权限判断符号含义-r有读权限-w有写权限-x有执行权限3)根据文件类型判断符号含义-f文件存在,是普通文件-e文件存在,是目录4)案例[root@localhost~]#[23-ge22][root@localhost~]#[-wstudent.txt][root@localhost~]#[-e/root/install.log]6.流程控制1.if判断1)基本语法:if[条件判断公式];thenprogramfiorif[条件判断公式]thenprogramfi注意事项:(1)[条件判断公式],括号之间必须有一个空格和条件判断公式2)Case#!/bin/bashread-p“请输入你的名字:”NAME#printf'%s\n'$NAMEif[$NAME=root]thenecho“hello${NAME},welcome!elif[$NAME=hunhaoxuan]thenecho“hello${NAME},welcome!”elseecho"sorry"fi2,casestatement1)基本语法:case$variablenamein"value1")如果值variableisequaltovalue1,thenexecuteprogram1;;"value2")if如果变量的值等于value2,thenexecuteprogram2;;...省略其他分支...*)Ifnone变量的值都是上面的,执行这个程序;;esac2)casecase$1instart)echo"starting";;stop)echo"stopping";;*)echo"Usage:{start|stop}"esac3,for循环1)基本语法1:forvariableinvalue1value2value3...doprogramdone2)Case:(1)printtime#!/bin/bash#Printtimefortimeinmorningnoonafternooneveningdoecho"Thistimeis$time!"done3)基本语法2:for((initialvalue;循环控制条件;变量变化))doprogramdone4)Case(1)Addfrom1to100#!/bin/bash#Addfrom1to100s=0for((i=1;i<=100;i=i+1))dos=$(($s+$i))doneecho"总和为:$s"4.while循环1)基本语法:while[条件判断]doprogramdone2)Case(1)Addfrom1to100#!/bin/bash#Addfrom1to100i=1s=0while[$i-le100]#如果变量i的值小于等于100、执行循环dos=$(($s+$i))i=$(($i+1))doneecho"总和为:$s"七.read读取控制台输入1.基本语法:read(option)(Parameters)选项:-p:指定读取值时的提示;-t:指定读取值时的等待时间(秒)参数变量:指定读取值的变量名2.case[root@localhost~]#read-p"pleaseinputyourname:"NAME请输入你的名字:hunhaoxuan[root@localhost~]#echo$NAMEhunhaoxuan八、功能一、系统功能1)basename基本语法basename[pathname][suffix]basename[string][suffix](功能说明:basename命令会删除所有前缀,包括last('/')字符,然后显示字符串。注意:suffix是后缀,如果指定了suffix,basename会替换pathname或者string去掉后缀。2)case[root@localhost~]#basename/opt/test.txttest.txt[root@localhost~]#basename/opt/test.txt.txttest3)dirname基本语法dirname文件绝对路径(功能说明:从给定的Remove从包含绝对路径的文件名中提取文件名(非目录部分),然后返回剩余路径(目录部分))4)case[root@localhost~]#dirname/opt/test.txt/opt2,Customfunction1)基本语法:[function]funname[()]{Action;[returnint;]}functionstart()/functionstart/start()注意:(1)必须在调用function函数之前声明,shell脚本是逐行运行的。不像其他语言那样先编译。(2)函数的返回值只能通过$?系统变量,可以显示和添加:returnreturn,如果不添加,将使用上一条命令的结果作为返回值。return后跟值n(0-255)2)情况(1)打印出所有小于你输入的数字(单个参数)#!/bin/bashfunctionLoopPrint(){count=0;while[$count-lt$1];做echo$count;表达式++计数;睡觉1;donereturn0;}read-p"请输入数字:"n;循环打印$n;(2)更多参数#!/bin/bashfunctionLoopPrint(){echo$2count=0;while[$count-lt$1];做echo$count;表达式++计数;睡觉1;donereturn0;}read-p"Pleaseinputthenum1:"n;read-p"请输入num2:"m;循环打印$n$m;本文作者:浑昊轩欢迎关注公众号本人保留所有权益,转载请注明出处。有故事有想法的朋友欢迎和我分享,也可以发到邮箱:lwqforit@163.com
