一.test测试
在Shell脚本中,test
命令用于进行条件测试。它也可以通过方括号[]
来表示,因为test
实际上是[
命令的一个别名。
格式1:test 条件表达式
格式2:[ 条件表达式 ]
注意[ ]空格,否则会失败
测试 是否成功使用 $? 返回值
[ 操作符 文件或目录 ]
help test
示例:
测试是否执行成功0为成功,其余为不成功
以下是一些常见的test
条件测试知识点:
1.数值比较
1.-eq
:等于 ,第一个数等于(Equal)第二个数
2.-ne
:不等于,第一个数不等于(Not Equal)第二个数
3.-gt
:大于,第一个数大于(Greater Than)第二个数
4.-lt
:小于,第一个数小于(Lesser Than)第二个数
5.-ge
:大于等于,第一个数小于或等于(Lesser or Equal)第二个数
6.-le
:小于等于,第一个数大于或等于(Greater or Equal)第二个数
++ 自身变量+1
-- 自身变量-1
+=5 自身变量+5
-=5 自身变量-5
*=5 自身变量*5
/=5 自身变量/5
%=5 自身变量%5
示例:
2.字符串比较
1.=
:等于,字符串内容相同
2.!=
:不等于,字符串内容不同,! 号表示相反的意思
3.-z
:长度为零,字符串内容为空
4.-n
:长度不为零,字符是否存在
5.<
:小于(在ASCII值中比较)
6.>
:大于(在ASCII值中比较)
3.文件检查
1.-e
:测试目录或文件是否存在(Exist)
2.-f
:测试是否为文件(File)
3.-d
:测试是否为目录(Directory)
4.-s
:文件大小不为零,是否存在且非空
5.-r
:测试当前用户是否有权限读取(Read)
6.-w
:测试当前用户是否有权限写入(Write)
7.-x
:测试当前用户是否有权限执行(eXcute)
8.-L: 测试是否为软连接文件
4.逻辑操作符
1.-a
:逻辑与
2.-o
:逻辑或
3.!
:逻辑非
5.其他
1.-nt
:比某个文件新
2.-ot
:比某个文件旧
3.-ef
:两个文件是同一个文件(通过inode号判断)
6.逻辑测试(短路运算)
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
逻辑运算中的短路测试是指在进行逻辑运算时,如果能够确定整个表达式的值而无需计算所有部分,则可以提前停止计算,从而提高效率。在逻辑运算中,当使用逻辑与(&&)和逻辑或(||)操作符时,存在短路测试的情况。
逻辑与(&&)的短路测试:
- 如果第一个操作数为假(false),则整个表达式的结果必定为假,因此不会再计算第二个操作数,直接返回结果。
- 只有当第一个操作数为真(true)时,才会计算第二个操作数,并返回整个表达式的结果。
逻辑或(||)的短路测试:
- 如果第一个操作数为真(true),则整个表达式的结果必定为真,因此不会再计算第二个操作数,直接返回结果。
- 只有当第一个操作数为假(false)时,才会计算第二个操作数,并返回整个表达式的结果。
短路测试的应用可以提高代码的效率,特别是在条件语句中,可以根据短路测试的特性来优化代码。例如,在条件判断中,将不太可能发生的情况放在前面可以利用短路测试来减少不必要的计算。
示例:
// 短路测试示例 int a = 5; int b = 0; // 使用逻辑与(&&),如果a为假,则不会计算b的值 if (a != 0 && 10 / a > b) {System.out.println("条件成立"); } else {System.out.println("条件不成立"); } // 使用逻辑或(||),如果a为真,则不会计算b的值 if (a == 0 || 10 / a > b) {System.out.println("条件成立"); } else {System.out.println("条件不成立"); }
在上述示例中,如果a为0,则不会进行除法运算,因为在逻辑与和逻辑或中,第一个操作数为假或者真时,不会再计算第二个操作数。
常见条件
-a或&&:逻辑与,“而且”的意思全真才为真
-o或||:逻辑或,“或者”的意思一真即为真
!:逻辑否
|| 只有前面不成立时才会执行后面的操作
7.双中括号
在Shell编程中,双中括号([[ ... ]]
)是一种用于条件测试的语法结构,通常用于if语句或while循环中。它相比于单中括号([ ... ]
)在功能上更加强大,支持更多的条件测试和比较操作,并且在语法上更加灵活。
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
8.()和{ }用法
在Shell编程中,()
和 {}
是两种不同的语法结构,各自有着不同的用途和功能。
1.小括号()
- 命令组合:小括号可以将一系列命令组合在一起,形成一个子shell。在子shell中执行的命令不会影响到当前shell的环境。
(cd /path/to/directory && ls)
- 数组赋值:小括号也可以用来定义数组,并为数组赋值。
arr=(apple banana orange)
- 算术扩展:小括号可以用于算术扩展,对其中的表达式进行算术运算。
result=$((3 + 5))
2.大括号{ }
- 代码块:大括号可以用来创建代码块,在代码块中可以包含一系列命令,作为一个整体来执行。
{
echo "Hello"
echo "World"
}
- 参数扩展:大括号可以用于参数扩展,对大括号中的内容进行扩展。
echo file{1..5}.txt # 输出:file1.txt file2.txt file3.txt file4.txt file5.txt
- 函数定义:大括号也可以用于定义函数,函数体内的命令都将被视为函数的内容。
my_function() {
echo "This is a function"
}
- 变量名扩展:大括号也可用于扩展变量名,通常用于避免歧义。
var="Hello"
echo "${var}World"
总的来说,小括号和大括号在Shell编程中有着不同的用途,能够提供一些方便的功能和语法结构,使得Shell脚本更加灵活和强大。
9.echo命令
echo -n 表示不换行输出
echo -e 表示输出转义符
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入"\"本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
10.date
date查看当前系统时间
-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F 完整日期格式,等价于 %Y-%m-%d
% T 时间(24小时制)(hh:mm:ss)
二.if语句的结构
1.if语句结构类型
(1)单支结构
程序执行到语句判断,进行判断,如果是就进行执行,否就直接结束
单分支
if 判断条件;
then 条件为真的分支代码
fi
(2)双支结构
程序执行到语句判断,进行判断,如果是就执行语句1,否就执行语句2.然后结束
双分支
if 判断条件; then条件为真的分支代码
else条件为假的分支代码
fi
(3)多支结构
多分支
if 判断条件1
then条件1为真的分支代码
elif 判断条件2
then条件2为真的分支代码
elif 判断条件3;then条件3为真的分支代码
...
else以上条件都为假的分支代码 托底
fi
2.if语句相关解析
if
后面是一个条件,它可以是命令的返回状态码、字符串比较、数值比较等等。在方括号[ ]
中的条件可以是各种表达式,如-f filename
表示判断文件是否存在、$var -eq 10
表示判断变量是否等于 10 等等。then
关键字指示如果条件为真,则执行紧随其后的代码块。elif
是else if
的缩写,用于添加额外的条件检查。可以有零个或多个elif
部分。else
用于处理所有前面的条件都不满足的情况。它是可选的。fi
是if
的倒写,用于结束if
结构。
3.多分支举例
成绩单
三.case语句
case
语句是一种在 Shell 脚本中用于多重条件判断的结构。它通常与 esac
一起使用,用于测试一个变量与多个模式之间的匹配情况
基本语法:
case 变量名 in模式1)命令序列1;;模式2)命令序列2;;...)命令序列...;;*)默认命令序列;;
esac
变量名
:要测试的变量名。模式1
、模式2
等:模式用于匹配变量的值。如果变量的值与某个模式匹配,则执行相应的命令序列。命令序列1
、命令序列2
等:与每个模式匹配时要执行的命令序列。;;
:用于终止每个模式的命令序列。*
:通配符,用于匹配所有未被前面模式匹配的情况。默认命令序列
:当变量值与所有模式都不匹配时要执行的命令序列。- ?:任意单个字符
四.循环语句
1.for循环语句
for
循环是一种在编程中常用的循环结构,用于重复执行一段代码直到满足特定条件为止
for循环由三个关键部分组成:
- 初始化(Initialization):在循环开始之前执行一次的语句,用于初始化循环变量或设置起始条件。
- 循环条件(Condition):在每次循环迭代之前被检查的条件。如果条件为真,则继续执行循环体;如果条件为假,则退出循环。
- 迭代(Iteration):在每次循环结束后执行的语句,用于更新循环变量的值。
语法结构类型
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环
for
循环的基本工作流程如下:
- 执行初始化部分。
- 检查循环条件。如果条件为真,则执行循环体;如果条件为假,则退出循环。
- 执行循环体。
- 执行迭代部分。
- 返回步骤 2,重复以上过程,直到循环条件为假为止。
for
循环通常用于需要固定次数的迭代,或者在已知起始点和结束点的情况下。然而,它也可以用于迭代数组、集合等数据结构中的元素。
示例
(1)由1加到100的总和
(2)批量添加用户
#!/bin/bash
uname=20
for ((i=1; i<=uname; i++))
douseradd $iecho "123" |passwd --stdin $i &>/dev/null
done
2.while循环
while
循环是编程中常用的一种循环结构,它在指定条件为真(true)时重复执行代码块。
while循环通常的语法
while condition:# 在条件为真时执行的代码块
在这个语法中,condition
是一个表达式,当它的值为真时,循环中的代码块会被执行。每次执行完代码块后,条件会再次被检查,如果条件仍然为真,循环将继续执行;直到条件变为假(false)时,循环停止。