语言介绍Bash是一个Unixshell,由BrianFox于1987年为GNU项目编写。第一个正式版本于1989年发布,最初计划在GNU操作系统上使用,但它可以运行在大多数类Unix操作系统上,包括Linux和MacOSXv10.4到macOSMojave。作为默认shell,从macOSCatalina开始,默认shell被zsh取代。--来自维基百科语法和特性bash的命令语法是Bourneshell命令语法的超集。大量的Bourneshell脚本中的大部分都可以在bash中执行而无需修改。只有那些引用Bourne特殊变量或使用Bourne内置命令的脚本才需要修改。许多bash命令语法来自Kornshell(ksh)和Cshell(csh),例如命令行编辑、命令历史、目录堆栈、$RANDOM和$PPID变量,以及POSIX命令替换语法:$(...).作为交互式shell,按TAB键可以自动完成部分输入的程序名、文件名、变量名等。Bash的函数声明在使用'function'关键字时不兼容Bourne/Korn/POSIX脚本(Korn外壳有同样的问题)。但Bash也接受Bourne/Korn/POSIX函数声明语法。由于存在许多差异,Bash脚本很少会在Bourne或Korn解释器中运行,除非脚本是为了保持兼容性而编写的。但是,随着Linux的普及,这种方式越来越少了。但在POSIX模式下,Bash更符合POSIX标准。语法变量定义name="foo"注意变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名必须遵循以下规则:命名只能使用英文字母、数字和下划线,首字符不能以数字开头。中间不能有空格,可以使用下划线(\_)。不能使用标点符号。bash中的关键字不能使用(使用help命令查看保留关键字)。使用变量,只需要加美元符号$就可以打印:echo$nameprintresult:foo如果不加美元符号,就是字符串:print:echonameprintresult:name当然,花也可以在变量两边加上括号:name="foo"echo"Iamgoodat${name}Script"echo"Iamgoodat$nameScript"//这两句话的优点是等价的花括号是空格定义只读变量url="mo.fish"readonlyurrl="jandan.net"再次赋值时会报错:index.sh:line14:url:readonlyvariabledeletevariablename="foo"url="mo.fish"unseturlunsetname注意:只读变量不能删除,报错:index.sh:line14:unset:url:cannotunset:readonlyvariable普通变量删除后,打印结果为空。关于字符串,在shell中尽量使用双引号,因为单引号,变量无效,很重要,字符串拼接可以通过空格拼接:name="foo"url="mo.fish"echo$name$url字符串长度加上#name="foo"echo${#name}字符串截取使用冒号:url="mo.fish"echo${url:1:3}//print:o.f//先从0开始tothirdarray数组定义用括号表示数组,数组元素之间用“空格”符号隔开。arr=($name$url)echo${arr[1]}//echo${arr}等于echo${arr[0]}"打印所有数组是特殊的arr=($name$url)echo${arr[@]}获取数组长度类似于字符串:length=${#arr[@]}echo$length流控ifelseif与其他语言有些不同:if[$name==”foo"]thenecho"nameisfoo"fi//fi表示结束因为不像其他语言没有{}而是else和ifelse,这样写:if[$name!="foo"]thenecho"nameisfoo"elseecho"doesnotmatch"fiif[$name=="bar"];thenecho"nameisbar"elif[$name=="foo"];thenecho"nameisfoo"elseecho"doesnotmatch"fithisuse;then可能更符合我们的直觉forforloopin12345doecho"其值为:$loop"donewhileint=1while(($int<=5))doecho$intlet"int++"donefor和while都使用了一个简单的例子函数定义GrewerFn(){echo"Thisismyfirstshellfunction!"}执行是一个简单的操作:GrewerFn(){echo"Thisismyfirstshellfunction!"}GrewerFn只写调用参数的函数名GrewerFn(){echo"第一个参数是$1!"echo"第二个参数是$2!"echoo"Printallparameters$@!"}GrewerFn1"qwer""zxc"通过该方法可以传递参数,对$1、$2等参数的处理如下表:参数处理说明$#传递给脚本或函数参数个数$*在单个字符串中显示传递给脚本的所有参数$$正在运行的脚本的当前进程ID号$!后台运行的最后一个进程的ID号$@与$*相同,只是用引号括起来,用引号返回每个参数$-显示shell当前使用的选项,是同一个功能作为设置命令。$?显示最后一个命令的退出状态。0表示没有错误,任何其他值表示错误。read交互获取用户输入的方法很简单:readyourNameecho"younameis$yourName"后面可以跟参数,比如-p参数,可以直接在read命令行指定提示。read-p"输入网站名称:"websiteecho"您输入的网站名称是$website"有限字符:read-n1-p"是否继续[Y/N]?"答案案例$answerinY|y)echo"很好,继续";;N|n)echo"ok,goodbye";;*)echo"errorchoice";;esacselectPS3='Pleaseenteryourchoice:'options=("Option1""Option2""Option3""Quit")selectoptin"${options[@]}"docase$optin"Option1")echo"youchoosechoice1";;"选项2")echo"你选择了选项2";;"Option3")echo"youchoose$REPLYwhichis$opt";;“退出”)打破;;*)echo"无效选??项$REPLY";;--说说提示符PS3——在shell脚本中使用select时的提示符PS4——PS4-"set-x"用于修改trace输出的前缀。具体参考:https://os.51cto.com/art/2012...还有一个流行的expect,这里就不说了,需要下载,一般一些嵌入式环境不支持linux上的自动脚本场景:比如使用crontab执行定时任务,读取和修改文件。我在之前的一篇文章中也用过他:https://segmentfault.com/a/11...loginscripts等,可以省去很多麻烦的过程对于其他语言,可以这样做。shell的好处是原生支持初始化环境。可以使用脚本一键初始化整个linux环境。如果你接触过cli,你应该知道它的作用。结语。许多功能为我们提供了很多方便。没有环境的时候,也可以直接运行。学习这门语言可以帮助你在服务器领域大展拳脚。上面的一些例子来自https://www.runoob.com/linux/...
