- shell脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令,如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开,但是不能超过最大命令行字符数255;显示当前日期和时间:
date
;显示当前是谁登录到了系统上:who
;
- 在创建shell脚本文件时,必须在文件的第一行指定要使用的shell,格式:
#!/bin/bash
:通常在shell脚本中,井号#用作注释行,shell并不会处理shell脚本中的注释行,但是,shell脚本文件的第一行是个例外,#
后面跟的感叹号!
会告诉shell用哪个shell来运行脚本;在指定了shell之后,就可以在文件的每一行中输入命令,然后加上一个回车符:
#!/bin/bash
data
who
- 可以根据需要,使用分号将两个命令放在一行上,但是在shell脚本中,你可以在独立的行中书写命令,shell会按根据命令在文件中出现的顺序进行处理;
- shell会通过PATH环境变量来查找命令,PATH环境变量被设置成只在一组目录中查找命令,要让shell找到脚本,可以采用:将脚本添加到PATH路径下;或者让shell脚本文件所处的目录添加到PATH环境变量中;在提示符中用绝对或相对目录来引用shell脚本文件;在执行shell脚本的时候会提示没有权限:shell指明了你还没有执行文件的权限,需要将文件改为可执行
chomd u+x 文件名
;
echo
指定字符串(默认情况下不需要使用引号来括起来文本字符串,但是如果字符串中有‘或“就需要使用);如果字符串中要使用单引号’就需要使用如:echo ”this's what“
;如果字符串中要使用双引号”,就需要使用如:echo 'this is "what" '
;想把文本字符串和命令输出显示在同一行中,可以使用如下:使用-n参数:echo -n “this is what:”
;
- 变量允许你临时性的将信息存储在shell脚本中,以便和脚本中的其他命令一起使用;
- 在脚本中,你可以在环境变量的名称前面加美元符号$来使用这些环境变量;要使用美元符号必须使用转义字符转义
\$
;通过${variable} 使用花括号是为了帮助识别美元符号后的变量名;
- shell脚本还允许在脚本中定义和使用自己的变量,定义变量允许临时存储数据并在整个脚本中使用,从而使shell脚本看起来更像一种真正的计算机程序;用户变量可以是任何由字母、数字、下划线组成的文本字符串,长度不超过20个,用户变量区分大小写; 使用等号将值赋给用户变量,在变量、等号、值之间不能出现空格
balue=12 blood=testing dad="what is it"
;shell 脚本会自动决定变量值的数据类型,在脚本的整个生命周期里,shell脚本中定义的变量会一直保持它的值,但在shell脚本结束时会被删除掉;用户变量可通过美元符号引用;
- shell脚本可以从命令输出中提取信息,并将其赋值给变量,把输出赋给变量之后,就可以在脚本中使用了;
将命令输出赋值给变量的方法 |
---|
反引号字符:在美式键盘上,和波浪号位于同一个键位;testing=·date· |
$()格式:testing=$(date) ;如:today=$(date +%y%m%d) (today为日期如170828),ls /usr/bin -al > log.$today |
- 命令替换会创建一个子shell来运行对应的命令,在命令行提示符下使用路径./运行的话,也会创建出子shell;要是运行命令的时候不加路径,就不会创建子shell;
- 最基本的重定向将命令的输出发送到一个文件中 bash shell用大于号
>
来完成这项功能,command > outputfile
,如果输出文件已经存在,重定向操作符会用新的数据覆盖原有的文件数据;如:date > testfile
;将命令输出追加到已有文件的尾部;使用>>
来追加信息;如:date >> testfile
;
- 将文件中的内容重定向到命令;输入重定向符号是
<
;command < filename
;如wc < filename
(wc命令可以对数据中的文本进行计数,默认情况下,它会输出3个值 1:文本的行数 2:文本的词数 3:文本的字节数);内联输入重定向符号<<
;
- 有时需要将一个命令的输出作为另一个命令的输入,这个过程叫做管道连接;将一个命令的输出重定向到另一个命令中
command1 | command2
;可以在一条命令中使用任意多条管道,可以持续的将命令的输出通过管道传给其他命令来细化操作;
- shell在运行的每个命令都使用退出状态码告诉shell它已经运行完毕,退出状态码在0~255的整数值,在命令结束运行时有命令传入到shell,可以捕获这个值并且在脚本中使用;
- Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码,它的值会变成shell所执行的最后一条命令的退出状态码:
echo $?
;按照惯例,一个成功结束的命令的退出状态码为0,如果命令结束时有错误,退出状态码就是一个正数值;
退出状态码 | 含义 |
---|---|
0 |
命令成功结束 |
1 |
一般性未知错误,某个命令提示了无效参数 |
2 |
不适合的shell命令 |
126 |
命令不可执行,没有命令执行的正确权限 |
127 |
没找到命令,无效命令 |
128 |
无效的退出参数 |
128+x |
与Linux信号x相关的严重错误 |
130 |
通过CTRL + C终止的命令 |
255 |
正常范围之外的退出状态码 |
- 默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出,可以改变这个默认行为,返回自己的退出状态码,exit命令允许你在脚本结束时指定一个退出状态码,在脚本末尾能执行的地方添加
exit 5
;
- 该命令显得比较笨拙;
expr 1 + 5
;
expr命令能识别少数的数学和字符串操作符 | 描述 |
---|---|
ARG1| ARG2 |
如果ARG1既不是null也不是零值,返回ARG1,否则返回ARG2 |
ARG1 & ARG2 |
如果没有参数是null或零值,返回ARG1,否则返回0 |
ARG1 <= ARG2 |
如果ARG1小于等于ARG2 返回1,否则返回0 |
ARG1 < ARG2 |
如果ARG1小于ARG2,返回1,否则返回0 |
ARG1 = ARG2 |
如果ARG1等于ARG2,返回1 否则返回0 |
ARG1 != ARG2 |
如果ARG1不等于ARG2 返回1,否则返回0 |
ARG1 >= ARG2 |
如果ARG1大于或等于ARG2 返回1 否则返回0 |
ARG1 > ARG2 |
如果ARG1大于ARG2 返回1 否则返回0 |
ARG1 + ARG2 |
返回ARG1和ARG2的算术运算和 |
ARG1 - ARG2 |
返回ARG1 和 ARG2的算术运算差 |
ARG1 * ARG2 |
返回ARG1和ARG2的算术乘积 |
ARG1 / ARG2 |
返回ARG1被ARG2除的算术商 |
ARG1 % ARG2 |
返回ARG1被ARG2除的算术余数 |
STRING :REGEXP |
如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配 |
match STRING REGEXP |
如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配 |
substr STRING POS LENGTH |
返回指定位置为POS、长度为LENGTH个字符的子字符串 |
index STRING CHARS |
返回在STRING中找到CHARS字符串的位置,否则返回0 |
length STRING |
返回字符串STRING 的数值长度 |
+TOKEN |
将TOKEN 解释成字符串,即使是关键字 |
(EXPRESSION) |
返回EXPRESSION的值 |
- 使用算术运算符时有时候需要使用\转义字符;
expr 5 \* 2
;
- 可以使用美元符号
$
和方括号[]
将数学表达式围起来如$[opeartion]
;如:val1=$[1 + 2]
;用方括号执行shell数学运算比用expr命令方便的多,这种技术也适用于脚本;不用担心shell会误解其他符号,shell会知道它不是通配符,因为在方括号内:如:var3=$[$var1 / $var2]
方括号运算的数值进行赋值;bash shell数学运算符只支持整数运算;
- 内建的bash计算器叫做
bc
;
bc能够识别 |
---|
数字(整型和浮点型) |
变量(简单变量和数组);进入bc;value=1 ;value * 4 |
注释(以#或c语言中的/**/开始的行) |
表达式 |
编程语言(如fi-then) |
函数 |
- 直接输入 bc即可,就能进入计算器;进入bc,输入
scale=4
就表示现在是保留4位小数,scale默认为0;quit
就能退出计算器;在脚本中使用bc;variable=$(echo ”option;expression“ | bc)
;option 允许设置变量,可以指定不止一个,多个变量有;
隔开;expression 数学表达式;如:var1=$(echo “scale=4;3.44 / 5”| bc)
;bc能够识别重定向输入; bash计算器中创建的变量只能在bash计算器中使用,不能再shell脚本中使用;