Skip to content

Latest commit

 

History

History
107 lines (90 loc) · 8.98 KB

README-base.md

File metadata and controls

107 lines (90 loc) · 8.98 KB

使用多个命令

  • shell脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令,如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开,但是不能超过最大命令行字符数255;显示当前日期和时间:date;显示当前是谁登录到了系统上:who

创建shell脚本文件

  • 在创建shell脚本文件时,必须在文件的第一行指定要使用的shell,格式:#!/bin/bash:通常在shell脚本中,井号#用作注释行,shell并不会处理shell脚本中的注释行,但是,shell脚本文件的第一行是个例外,#后面跟的感叹号会告诉shell用哪个shell来运行脚本;在指定了shell之后,就可以在文件的每一行中输入命令,然后加上一个回车符:
#!/bin/bash
data
who
  • 可以根据需要,使用分号将两个命令放在一行上,但是在shell脚本中,你可以在独立的行中书写命令,shell会按根据命令在文件中出现的顺序进行处理;

让bash shell找到脚本文件

  • shell会通过PATH环境变量来查找命令,PATH环境变量被设置成只在一组目录中查找命令,要让shell找到脚本,可以采用:将脚本添加到PATH路径下;或者让shell脚本文件所处的目录添加到PATH环境变量中;在提示符中用绝对或相对目录来引用shell脚本文件;在执行shell脚本的时候会提示没有权限:shell指明了你还没有执行文件的权限,需要将文件改为可执行 chomd u+x 文件名

显示消息echo

  • 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 正常范围之外的退出状态码

exit命令

  • 默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出,可以改变这个默认行为,返回自己的退出状态码,exit命令允许你在脚本结束时指定一个退出状态码,在脚本末尾能执行的地方添加 exit 5

执行数学运算

expr命令

  • 该命令显得比较笨拙; 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=1value * 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脚本中使用;