志在指尖
用双手敲打未来

shell脚本基本命令(shell命令大全)

shell脚本基本命令

Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里已备查看。
1Shell中的特殊符号
1.1$美元符号。用来表示变量的值。如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。
1.2#井号。除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中,从#号开始的部分就不执行了。
1.3“”双引号。shell不会将一对双引号之间的文本中的大多数特殊字符进行解释,如#不再是注释的开头,它只表示一个井号“#”。但$仍然保持特殊含义。(在双引号中的$加变量名,即:$PARAM_NAME,依然会转换成变量的值。)
1.3.1双引号对于某些特殊符号是不起作用的,例如:”,$,\,`(反引号)
1.3.2双引号和单引号不能嵌套。即:echo‘””’输出””,echo“’’”输出’’
1.4‘’单引号。shell不会将一对单引号之间的任何字符做特殊解释。(在双引号中的$加变量名,即:$PARAM_NAME,不会转换成变量的值。)
1.4.1echo“$HOME”(结果:/home/xiongguoan)
1.5“倒引号。命令替换。在倒引号内部的shell命令首先被执行,其结果输出代替用倒引号括起来的文本,不过特殊字符会被shell解释。
1.5.1echo‘$HOME’(结果:$HOME)
1.6\斜杠。用来去掉在shell解释中字符的特殊含义。在文本中,跟在\后面的一个字符不会被shell特殊解释,但其余的不受影响。
1.7[]中括号,主要是用来测试条件的,通常放在if语句的后面。(不过还是不太明白),但是中括号本身不会在测试语句执行后消失。
1.7.1echo[$HOME](结果:出现错误)
1.7.2echo[$HOME](结果:[/home/xiongguoan])(注意:HOME后面有空格哦。)
1.7.3echo[$HOME–eq‘/xiong’](结果:[/home/xiongguoan–eq/xiong])
1.8{}大括号,主要是和$符号配合,作为字符串连接来使用
1.8.1echo${HOME}ismydir(结果:/home/xiongguoanismydir)
2预定义的变量
2.1特殊变量
$shell变量名的开始,如$var
|管道,将标准输出转到下一个命令的标准输入
$#记录传递给Shell的自变量个数
#注释开始
&在后台执行一个进程
?匹配一个字符
*匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
$-使用set及执行时传递给shell的标志位
$!最后一个子进程的进程号
$?取最近一次命令执行后的退出状态(返回码)
$*传递给shellscript的参数
$@所有参数,个别的用双引号括起来
$0当前shell的名字
$n(n:1-)位置参数
$$进程标识号(ProcessIdentifierNumber,PID)shell
>输出重定向
<输入重定向
>>输出重定向(追加方式)
[]列出字符变化范围,如[a-z]
2.2代值变量
*任意字符串
?一个任意字符
[abc]a,b,c三者中之一
[a-n]从a到n的任一字符
2.3特殊字符的表达
\b退回
\c打印一行时没有换行符这个我们经常会用到
\f换页
\r回车
\t制表
\v垂直制表
\\反斜线本身
2.4其他字符
2.4.1分号
;表示一行结束
2.4.2圆括号
()表示在新的子shell中执行括号内的命令(这样可以不改变当前shell的状态。)
但是圆括号在单/双引号内失去作用,只作为普通字符。
2.4.3花括号
2.4.3.1分割命令的用法
与圆括号相似,但是:1.花括号内的命令在当前shell中执行;2.花括号必须作为命令的第一个字符出现。
2.4.3.2引用变量的用法
在$后面,表示变量名的开始和结束
2.4.4方括号
相当与test命令,用来执行测试条件,通常用在需要判断条件的语句后面,例如:if,while等等。
3设置变量
3.1格式:VARNAME=value(i.e.PARAM=’hello’)
3.2注意:
3.2.1等号的前后不能有空格
3.2.2如果变量的值是一个命令的执行结果,请加上反引号(`)。
4引用变量
4.1$VARNAME
4.1.1e.i.echo$HOME(结果:/home/xiongguoan)
4.2变量默认值
4.2.1在引用一个变量的时候可以设定默认值。如果在此之前,该变量已经设定了值,则此默认值无效。如果此时变量没有被设定值,则使用此默认值(但是没有改变此变量的值)。
4.2.2echoHello${UNAME:-there}#其中there是UNAME的默认值
4.2.3其他关于默认值与判读变量的方法:

shell命令大全

新建一个后缀名为.sh的文件就可以开启shell脚本之旅了
shell脚本的首行要这样写:#!/usr/bin/bash
或者可以写成:#!/usr/bin/envbash
#!/usr/bin/envbash的
优点:
1.用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同),只要程序在你的$PATH中;
2.它会根据你的环境寻找并运行默认的版本,提供灵活性。(保存用户信息的文件/etc/passwd)
缺点:
有可能在一个多用户的系统中,别人在你的$PATH中放置了一个bash,可能出现错误。
大部分情况下,/usr/bin/env是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;而指定具体位置的方式#!/usr/bin/bash,在某些情况下更安全,因为它限制了代码注入的可能。
常用命令
1.echo
echo是比较常用的shell脚本的命令,用来输出一段字符串
#!/bin/bash
echo”HelloWorld!”
2.eval
eval可以用来执行一段linux命令,用shell脚本来执行Linux
命令,eval不可或缺
比如:用脚本来实现监测服务器上服务的运行状态
应用实例
我做的这个功能不仅要进行监测,还要去判断当前服务器的操作系统类型,根据不同的操作系统执行相应的linux命令,因为不同系统能使用的Linux命令也不同,项目在不同系统上的服务名称都不一样,这个功能调用公司写好的一个方法就可以实现了,我就只拿出监测服务器上的服务运行状态,如果服务未启动或异常关闭,自动重新启动的一个脚本(需要设定定时任务来定时运行这个脚本来监测)
#!/usr/bin/envbash
result=$(eval”systemctlstatusrabbitmq-server.service”)
active=”active(running)”
if[[$result==*$active*]]
then
echo”rabbitmqhasstarted”
else
eval”systemctlstartrabbitmq-server.service”
echo”rabbitmqstartsucceed”
fi
这段代码对于初学者来说就可以说明很多脚本的常见写法了shell脚本基本命令
1.$
$用来取值,这里要注意,需要取的是执行命令后的返回结果,需要加上括号
2.ifelse
这里的ifelse用来做判断,需要注意的是在判断条件中的==两边都要有空格,如果没有空格会导致判断结果一直为true,这里又涉及到了判断一个字符串是否包含另一个字符串,方式有很多,这里不过多介绍,就说以下这三种:
a.用字符串运算符
strA=”chenglong”
strB=”eng”
if[[$strA=~$strB]]
then
echo”包含”
else
echo”不包含”
fi
b.用通配符*,也就是上面例子中用到的方式
A=”chenglong”
B=”eng”
if[[$A==*$B*]]
then
echo”包含”
else
echo”不包含”
fi
c.用casein语句
thisString=”abcde”#源字符串
searchString=”ab”#搜索字符串
case$thisStringin
*”$searchString”*)echoEnemySpot;;
*)echonope;;
esa
3.sed-i
sed命令的语法有很多种,我这次只用到了sed-i,就先只介绍这一种吧
sed-i就是用来操作文本文件的
sed-i’s/原字符串/新字符串/’/opt/test.txt
sed-i’s/原字符串/新字符串/g’/opt/test.txt
1
2
这是test.txt文件的内容:
#cattest.txt
s
ssss
这是执行这两条命令的结果
sed-i’s/d/886/’/opt/test.txt
执行结果
886
886sss
sed-i’s/d/886/g’/opt/test.txt
执行结果
886
886886886886

去掉“行首”带“¥”的首个字符¥
sed-i’s/^¥//’file
1
特定字符串的行前插入新行
sed-i’/特定字符串/i新行字符串’file
1
特定字符串的行后插入新行
sed-i’/特定字符串/a新行字符串’file
1
实例:
sed-i’/Service/aRestart=always’/usr/lib/systemd/system/rabbitmq-server.service
1
这段代码就是在/usr/lib/systemd/system/rabbitmq-server.service这个文件中查找“Service”,并在这个特定字符串之后新增一行“Restart=always”,这里需要注意,实际上rabbitmq-server.service文件中的特定字符串是[Service],如果脚本中也输入[Service],会造成执行脚本后,rabbitmq-server.service文件中原来的每一行下面都增加了一行Restart=always。
特定字符串的删除
sed-i’/字符串/d’file
1

未经允许不得转载:IT技术网站 » shell脚本基本命令(shell命令大全)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载