教大家简单的Shell脚本入门操作
Shell脚本运作方式与解释型语言相当,如果有语言基础,学起Shell脚本就非常容易,但是Shell与常见的语言不同,一些常见的函数在Shell中需要组合一些命令得以实现工具推荐
Shell似乎没有定制的IDE,这里推荐VSCode搭配对应的插件:shellman智能提示和自动补全,在插件页面有介绍常用代码片段的触发关键词,作者在Shellmanreborn中写到了Shellman诞生的故事,挺有趣的shellcheck语法静态检查工具,插件安装后需要本地安装shellcheck,参考shellcheckInstalling,MacOS可以使用brewinstallshellcheck,这样在写Shell的时候,语法有误的地方就会以波浪线的方式提示shellformat代码整理,Win快捷键:AltShiftF,MacOS快捷键:optionshiftFCodeRunner脚本运行,右键RunCode,Win快捷键:CtrlAltN,MacOS快捷键:controloptionN运行shell脚本
新建脚本:test。sh!usrbinenvbash使用echo打印字符串或者变量echohelloworld
可以用CodeRunner运行,就会输出:helloworld
在Shell脚本的第一行一般会写!binbash这个是Shebang,!后面是解释器的绝对路径,脚本将用该解释器执行。还有一种写法是:!usrbinenvbash,usrbinenv是env命令的绝对路径,而env命令用于显示系统中已存在的环境变量,其中包含了PATH,会在PATH包含的目录依次找bash,常见的命令行解释器有:sh,bash,zsh(MacOS默认解释器)
如果在Linux或类Unix下运行,有这么几种方式:先给脚本添加执行权限:chmodxtest。sh,然后运行脚本:。test。sh,这种方式执行会读取Shebang,用指定的解释器执行脚本shtest。sh,使用sh这个解释器执行脚本,当然也可以用其他方式执行,比如:bashtest。sh。与第一种方式相同,当前的shell是父进程,生成一个子shell进程(子进程会继承父进程的环境变量),在子shell中执行脚本,脚本执行完毕,退出的shell回到当前shellsource点命令方式:sourcetest。sh等效于。test。sh。source让脚本在当前shell执行,不生成新的子进程。使用source执行脚本,脚本中对于环境变量的修改会作用于当前shell,这就是为什么我们在修改了一些配置如:。bashrc,执行source。bashrc后配置就生效了exec方式:有需要先给脚本添加执行权限:chmodxtest。sh,执行exec。test。sh,也是让脚本在同一个进程上执行不生成新的子进程,与source的区别就是,在脚本执行完成后进程会被结束基础命令
可以按照〔BashShell〕Shell学习笔记学习,这篇文章讲得非常详细,本篇博客也是在学习这篇文章后写下的获取输入
使用read命令,从标准输入流(stdin)获取输入!usrbinenvbashreadvarecho{var}
运行脚本,输入任意字符,回车确认,输入的值会赋值给变量var,并打印出该变量输出!usrbinenvbashvar1输出变量echo{var}输出字符串显示部分字符需要转义echohelloworldhelloworld换行使用e参数:使转义字符生效使用换行echoenewline
也可以让shell输出不同颜色的字符,可以参考:shell脚本中echo显示内容带颜色!usrbinenvbashechoe33〔30m黑色字33〔0mechoe33〔31m红色字33〔0mechoe33〔32m绿色字33〔0mechoe33〔33m黄色字33〔0mechoe33〔34m蓝色字33〔0mechoe33〔35m紫色字33〔0mechoe33〔36m天蓝字33〔0mechoe33〔37m白色字33〔0m变量使用两边不能有空格varhelloworldnum100在引用变量时,这种方式可以,但是推荐下面一种echovar推荐在使用字符串变量时,在两侧加上双引号,否则如果变量字符串中存在空格,则字符串会被切分echovar如果涉及字符串拼接,可以在变量名两侧加上花括号echo变量为:{var}。将变量设置为只读,再次修改会报错readonlyvarvarwolrd删除变量,不能删除readonly修饰的变量unsetnum
变量赋值时,变量名命名规则和其他语言类似,注意变量赋值时两边不能有空格
使用时在变量名前加上,推荐所有的变量都使用{}的方式使用变量运算
算术运算:Bash原生不支持数学运算,可以使用awk和expr
注意乘号需要加上转义:,而且运算符两侧必须空格a10b3valexprabechoab:valvalexprabechoab:valvalexprabechoab:valvalexprbaechoba:valvalexprbaechoba:val执行命令
()与(反引号)都可以用于执行命令,并会将执行的结果返回,shellcheck推荐使用第一种()的方式!usrbinenvbashresultdateYmdecho{result}result(dateYmd)echo{result}运算符
关系运算符只支持数字,如果字符串为数字也可以,关系运算符包括:
运算符
含义
eq
等于
ne
不等于
gt
大于
lt
小于
ge
大等于
le
小等于
条件表达式必须放在〔〕中,并且〔的右侧,和〕的左侧必须留有空格
布尔运算符列表:
运算符
含义
!
非
o
或(or)
a
与(and)!usrbinenvbasha10b3c1if〔{a}ne{b}〕thenecho相同elseecho不相同fiif〔{a}gt{b}a{b}gt{c}〕thenechoabbcfi
其他常用判断:直接在〔〕中放字符串变量如〔{str}〕则就是判断str这个字符串是否非空f判断是否为普通文件,如:〔ffile〕d判断是否为文件夹,如:〔dfile〕字符串截取
字符截取的格式:{string:start:length}
索引从0开始,可以省略:length这样就截取到最后,注意空格要空在:后,否则可能提示:badsubstitution!usrbinenvbashstringhelloworldecho{string:1:3}ell截取到最后echo{string:1}elloworld数组!usrbinenvbash1。定义数组:使用括号声明,用空格分隔开,也可以换行隔开arr(123)strArr(firstsecond)2。读取数组:通过下标读取,下标从0开始计算echo{arr〔0〕}使用或者读取所有元素echo{arr〔〕}echo{arr〔〕}读取数组长度读取全部元素前面加上echo{arr〔〕}echo{arr〔〕}遍历下标for((i0;i{strArr〔〕};i))doecho{strArr〔i〕};done;forin遍历元素forelementin{strArr〔〕}doechoelementdone3。修改数组元素strArr〔0〕modifyecho{strArr〔0〕}4。删除元素unsetarr〔1〕echo{arr〔〕}echo{arr〔〕}13!使用unset要注意,这其实并不是真正删除了该元素,而只是将该元素置空,所以使用下标遍历会出问题,如下echo数组遍历:for((i0;i{arr〔〕};i))doechoindex{i}{arr〔i〕};done;index01index1解决unset无法真正删除的方法:重新赋值给新的数组echo数组遍历:arr({arr〔〕})for((i0;i{arr〔〕};i))doechoindex{i}{arr〔i〕};done;index01index13判断语句
使用if和fi定义判断的边界,使用then,elif,else定义条件!usrbinenvbash!usrbinenvbasha10b20if〔ab〕thenecho相等elseecho不相等fiif〔ab〕thenecho相等elif〔altb〕thenechoa小于belseecho其他情况fi函数
调用函数时,我们可以传入参数,可以通过n来获取参数,这里的n表示需要取的参数的索引,当n10时,需要使用{n}来获取参数
传递给函数的参数个数,和显示所有传递给函数的参数,?表示函数的返回值,也可以用于获取上一个命令的退出状态,执行成功会返回0,失败返回1定义函数!usrbinenvbashfunWithParam(){echo参数个数:参数个数:11echo传递给函数的所有参数:传递给函数的所有参数:1234567893473echo11超过9的参数需要用{}接收参数,否则直接显示数值echo1010echo{11}73}调用函数:函数名后面直接跟上参数funWithParam1234567893473echo?0输入输出重定向
使用将应该输出到终端上的数据重定向输出到文件,默认为覆盖文件,使用追加写入文件
使用将默认从键盘输入的数据,定向为从文件输入who命令用于显示系统中有哪些使用者正在上面将结果输入who。txtwhowho。txtwcl作用是计算文本行数wclwho。txt
一般情况下,每个UnixLinux命令运行时都会打开三个文件:标准输入(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据标准输出(stdout):stdout的文件描述符为1,Unix程序默认向stdout输出数据标准错误输出(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息
所以一般我们后台启动应用并且输出日志文件都使用:nohupjavajarxxx。jarnohup。log21
nohup:(nohangup)保证在退出帐户或者关闭终端之后继续运行相应的进程
nohup。log:将javajarxxx。jar的输出追加到nohup。log文件
21:将javajarxxx。jar的标准错误输出也重定向到标准输入
:让进程在后台运行
默认情况下,commandfile将stdout重定向到file,commandfile将stdin重定向到file。
如果希望stderr重定向到file,可以这样写:坑梳理变量赋值时,变量名命名规则和其他语言类似,注意变量赋值时两边不能有空格数组unset元素,并不是真正的移除元素获取参数时,当n10时,需要使用{n}来获取参数常见的特殊Shell环境变量表示当前Shell进程的ID,即pid0表示当前脚本的绝对路径传递给脚本或函数的参数个数n传递给脚本或函数的参数?上个命令的退出状态和传递给脚本或函数的所有参数nn代表19其中任意一个数字,传递给脚本或函数该位置的参数
和区别:!usrbinenvbashfunctionasterisk(){echoforvarindoechovardone}functionmail(){echoforvarindoechovardone}asteriskabcmailabc
输出abcabc
当和直接使用效果相同,都是接收一份数据如上所示的例子,接收到的就是:abc,一份数据,以空格隔开。加了双引号后会将每个参数都当成一份独立的数据
原文链接:https:www。cnblogs。comaaronlinvp15764053。html