一.重定向与管道操作
1.重定向操作
标准输入(STDIN):默认设备为键盘,文件编号为0,命令将从标准输入的文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认设备为显示器,文件编号为1,命令将执行后的输出结果发送到输出标准文件。
标准错误(STDERR):默认设备为显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件中。
因此重定向在此可以理解为改变了Linux操作系统的默认输入和输出的方向,并不由键盘输入内容或者将输出内容显示在显示器等。
①重定向输出
指的是将命令的输出结果保存到指定的文件当中,而不是显示在显示器上。如果重定向输出的目标文件夹不存在则会新建该文件。
其中“>”表示覆盖,会将原有内容替换掉
“>>”表示追加,当需要保留原有内容时使用>>
②重定向输入
指的是将命令中输入的途径从键盘改为指定的文件,不从键盘输入获取内容。
使用 “<”操作符。
③错误重定向
指将所有错误信息保存到指定文件中,使用“2>”(使用标准输入和输出时省略了0和1)
对于shell脚本还可以将无关紧要的信息保存至/dev/null中
追加:2> 覆盖:2>>
若需要将正常和错误输出信息都保留时,可使用&>将两类输出信息保存到同一个文件
2.管道操作
位于|左边的命令输出结果将作为|右边命令的输入对象
二.使用Shell变量
Shell变量用来存放系统和用户需要使用的特定参数值,可以根据用户的设定和系统环境变化而相应变化。
常见的Shell变量包括自定义变量,环境变量,位置变量,预定义变量。
1.自定义变量
①定义新的变量
基本格式为‘变量名=变量值’
例如:
[root@localhost ~]# product=python
[root@localhost ~]# version=2.7.13
②查看和引用变量的值
在变量名前添加前导符号‘$’,便可以引用一个变量的值。
使用echo命令可以查看变量,也可以在一条echo命令中同时查看多个变量值。
例如:
[root@localhost ~]# echo $product $version
python 2.7.13
当变量名称容易与后面的其他内容混淆时,需要用{}将其括起来,否则无法确定正确的变量名称。
例如:
[root@localhost ~]# echo ${product}2.69
python2.69
③变量赋值的特殊操作
双引号主要起界定字符的作用,特别是赋值内容中包含空格时必须使用双引号,其他情况双引号通常可以省略。
例如:
同时也可以在双引号内直接调用现有的变量值来赋给新的变量。
例如:
当要赋值的变量中包括$,\等本身可能具有特殊含义的字符时,而又不想使其发挥其特殊含义的作用时,应使用单引号。单引号内的所有内容包括特殊字符就只会被当作一般字符看待,被赋给新的变量。
例如:
如果赋值内容中包括单引号,则需要使用\进行转义,以免冲突。
允许将执行某个命令的屏幕输出结果赋值给变量,同时反撇号括起来的范围内也必须是能够执行的命令行,否则将会出错。
例如:
特别强调,若要在一行命令中实现嵌套命令的替换操作,应使用$()来代替反撇号操作。
例如:
以上命令分别查询了useradd命令的位置,该文件是由哪个安装包安装的,以及该安装包的安装路径和各配置文件的具体路径。
使用嵌套命令如下:
可以使用Bash的内置命令read来给变量赋值,同时也可用来提示用户输入信息,实现简单交互。
例如:
④设置变量的作用范围
使用export将指定的变量导出为全局变量
例如:
⑤数值变量的运算
shell的数值变量运算多用于脚本程序的过程控制,在Bash shell环境中,只能进行简单的整数运算,通过expr命令进行,运算符与变量之间需要有空格。
常见运算符:
+加法运算
-减法运算
\*乘法运算
/除法运算
%求模运算,也称取余运算,相除后的余数
2.特殊的Shell变量
①环境变量
指的是出于运行需要由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录,命令查找路径等。环境变量由Linux系统自动维护,会随着用户状态的改变而改变。
使用env命令可以查看当前工作环境的环境变量。
其中的PATH变量用于设置可执行程序的默认搜索路径。若希望能直接通过文件名称来运行之前的first.sh脚本,可以修改PATH变量以添加搜索路径,或者将first.sh脚本复制到现有搜索路径的某个文件夹下面。
具体操作如下:
环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。
另外每个用户还拥有自己的独立配置文件,如下:
若要长期设置某个环境变量,应在上述文件中设置并使用source加载配置文件执行。
例如:修改历史命令条数最大为400,并重新加载
②位置变量
为了在使用shell脚本时方便通过命令行为程序提供操作参数,bash引入了位置变量的概念。
当执行命令行操作时,第一个字段表示命令名或者脚本程序名,其余字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称位置参数,使用$1,$2...$9表示。例如ls -lh /root,其中-lh以$1表示,/root/以$2表示。而命令或者脚本本身的名称使用$0表示(预定义变量)
③预定义变量
是由bash程序预先定义好的一类特殊变量,用户只能使用预定义变量而不能创建新的预定义变量,也不能直接为预定义变量赋值。
常用的预定义变量如下:
$# :表示命令行中位置参数的个数
$* :表示所有位置参数的内容
$? :表示前一条命令执行后的返回状态,返回值0表示执行正确;返回任何非0值均表示出现异常。
$0 :表示当前执行脚本或者程序的名称
三.条件测试操作
要使得shell脚本具备一定的“智能”,就需要知道如何区分不同的情况以确定执行的各种操作。shell环境根据命令执行后的返回值($?)来判断是否执行成功。当返回值为0时表示成功,而非0值表示失败或异常。
使用test命令可以对特定条件进行测试,并根据返回值来判断条件是否成立。
形式有两种:① test 条件表达式
② [ 条件表达式 ]
1.文件测试
-d 测试是否为目录
-e 测试目录或者文件是否存在
-f 测试是否为文件
-r 测试当前用户是否有读取权限
-w测试当前用户是否有写入权限
-x 测试当前用户是否有执行权限
执行条件测试操作后可通过$?来查看返回状态值,0表示存在,非0表示不存在
例如:
同时也可以结合命令分隔符&&和echo命令一起使用,当条件成立时直接输出YES,例如:
2.整数值比较
-eq 第一个数等于第二个数
-nq 第一个数不等于第二个数
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-ge 第一个数大于等于第二个数
-le 第一个数小于等于第二个数
例如;查看可用内存
[root@localhost ~]# freecc=$(free -m | grep "Mem: " | awk '{print $4}')
[root@localhost ~]# [ $freecc -gt 500 ] && echo ${freecc}Mb
2422Mb
[root@localhost ~]#
3.字符串比较
= 第一个字符串与第二个字符串相同
!= 第一个字符串与第二个字符串不相同,其中!表示取反
-z 检查字符串是否为空,对于未定义或赋予空值的变量将视为空串
例如:
又如:
4.逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或只有其中一个成立等情况就需要有一个测试过程。
常用的逻辑测试如下:
&&:逻辑与,表示“而且”,只有前后两个两个条件都成立时整个测试命令的返回值才为0。
|| :逻辑或,表示“或者”,只有前后两个条件中有一个成立时,整个测试命令的返回值即为0。
! :逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0。
例如:
四.if条件语句
使用&&和||可以完成简单的判断操作,但当选择执行的命令语句较多时,这种方式就很复杂,因此需要使用if条件语句。
1.单分支if语句
If 条件测试操作
Then
命令序列
Fi
执行流程,首先判断条件测试操作的结果:
如果返回值为0,则表示条件成立,执行then后面的命令序列,一直遇到fi结束判断为止,并执行其他脚本代码;
如果返回值不为0,则忽略then后面的命令序列,直接跳至fi行以后执行其他的脚本代码。
2.双分支if语句
If 条件测试操作
Then
命令序列1
Else
命令序列2
Fi
执行流程,首先判断条件测试操作的结果:
如果条件成立,则执行then后面的命令序列1,并忽略else以及后面的命令序列2,直至遇见fi结束判断。
如果条件不成立,则忽略then以及后面的命令序列1,直接跳至else后面的命令序列2并执行,直至遇见fi结束判断。
3.多分支if语句
If 条件测试操作1
Then
命令序列1
Elif 条件测试操作2
Then
命令序列2
.......
Else
命令序列n
Fi
执行流程,首先判断条件测试操作的结果:
如果条件1成立,则执行命令序列1,如果不成立则判断条件测试操作2的结果,如果成立则执行命令序列2.....如果所有条件都不满足,则执行else后面的命令序列n,直至遇见fi结束判断。