>[success] # test
~~~
1.'test'可用于测试表达式,支持测试的范围包括:字符串比较,算术比较,文件存在性、属性、类型等判断。
例如,判断文件是否为空、文件是否存在、是否是目录、变量是否大于5、字符串是否等于"longshuai"、字符串是
否为空等等。在shell中,几乎所有的判断都使用test实现
2.'[]'完全等价于test,只是写法不同
3.'[[]]'基本等价于'[]',它支持更多的条件表达式,还允许在双中括号内使用逻辑运算符"&&"、"||"、"!"和"()"
举个例子
$ [ a < b ]
-bash: b: No such file or directory
$ [[ a < b ]]
第一个示例返回错误,因为 bash 尝试将文件 b 重定向到命令 [ a ]。第二个例子实际上做
了你所期望的。字符 < 不再具有文件重定向运算符的特殊含义。
~~~
>[info] ## test/[] 用法
~~~
1.test expression 等同于[ expression ],注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误
~~~
>[danger] ##### 文件条件判断
* 文件类型
| 选 项 | 作 用 |
| --- | --- |
| \-b filename | 判断文件是否存在,并且是否为块设备文件。 |
| \-c filename | 判断文件是否存在,并且是否为字符设备文件。 |
| \-d filename | 判断文件是否存在,并且是否为目录文件。 |
| \-e filename | 判断文件是否存在。 |
| \-f filename | 判断文件是否存在,井且是否为普通文件。 |
| \-L filename | 判断文件是否存在,并且是否为符号链接文件。 |
| \-p filename | 判断文件是否存在,并且是否为管道文件。 |
| \-s filename | 判断文件是否存在,并且是否为非空。 |
| \-S filename | 判断该文件是否存在,并且是否为套接字文件。 |
* 文件权限判断
| 选 项 | 作 用 |
| --- | --- |
| \-r filename | 判断文件是否存在,并且是否拥有读权限。 |
| \-w filename | 判断文件是否存在,并且是否拥有写权限。 |
| \-x filename | 判断文件是否存在,并且是否拥有执行权限。 |
| \-u filename | 判断文件是否存在,并且是否拥有 SUID 权限。 |
| \-g filename | 判断文件是否存在,并且是否拥有 SGID 权限。 |
| \-k filename | 判断该文件是否存在,并且是否拥有 SBIT 权限。 |
* 文件比较
| 选 项 | 作 用 |
| --- | --- |
| filename1 -nt filename2 | 判断 filename1 的修改时间是否比 filename2 的新。 |
| filename -ot filename2 | 判断 filename1 的修改时间是否比 filename2 的旧。 |
| filename1 -ef filename2 | 判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
* 举个例子
~~~
1.[-e 1.txt] # // 判断文件1.txt 是否存在 等同于test -e 1.txt
2.[ -e 1.txt ]&&echo "yes"|| echo "no" # 像写其他语言一样使用条件与
3.[ -r read.txt ]&&echo "read yes"|| echo "no" # 查看文件是否有读的权限
4.[ read.txt -ot write.txt ]&&echo "read is older than write"|| echo "no" # 比较两个文件修改时间
5.判断文件是否存在并且判断当前输入url 是否为空不是创建文件并且写入
#!/bin/bash
read filename
read url
if test -w $filename && test -n $url
then
echo $url > $filename
echo "写入成功"
else
echo "写入失败"
fi
~~~
>[danger] ##### 与数值比较相关的 test 选项
~~~
1.两个整数之间的判定,支持正负数,但不支持小数
~~~
| 选项 | 含义 |
| --- | --- |
| 整数1 -eq 整数2 | 判断整数1是否和整数2相等 |
| 整数1 -ne 整数2 | 判断整数1是否和整数2不相等 |
| 整数1 -gt 整数2 | 判断整数1是否大于整数2 |
| 整数1 -lt 整数2 | 判断整数1是否小于整数2 |
| 整数1 -ge 整数2 | 判断整数1是否大于等于整数2 |
| 整数1 -le 整数2 | 判断整数1是否小于等于整数2 |
* 举个例子
~~~
[ 2 -eq 2 ]&&echo "2==2"|| echo "no"
[ 3 -ne 2 ]&&echo "2!=2"|| echo "no"
[ 3 -gt 2 ]&&echo "2>2"|| echo "no"
[ 1 -lt 2 ]&&echo "2<2"|| echo "no"
[ 2 -ge 2 ]&&echo "2>=2"|| echo "no"
[ 2 -le 2 ]&&echo "2<=2"|| echo "no"
~~~
>[danger] ##### 字符串比较
~~~
1.==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,
管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符
~~~
| 选 项 | 作 用 |
| --- | --- |
| \-z str | 判断字符串 str 是否为空。 |
| \-n str | 判断宇符串 str 是否为非空。 |
| str1 = str2
str1 == str2 | `=`和`==`是等价的,都用来判断 str1 是否和 str2 相等。 |
| str1 != str2 | 判断 str1 是否和 str2 不相等。 |
| str1 \\> str2 | 判断 str1 是否大于 str2。`\>`是`>`的转义字符,这样写是为了防止`>`被误认为成重定向运算符。 |
| str1 \\< str2 | 判断 str1 是否小于 str2。同样,`\<`也是转义字符。 |
* 举个例子
~~~
#!/bin/bash
read str1
read str2
#检测字符串是否为空变量 $str1 和 $str2 都被双引号包围起来,这样做是为了防止 $str1 或者 $str2 是空字符串时出现错误
if [ -z "$str1" ] || [ -z "$str2" ]
then
echo "字符串不能为空"
exit 0
fi
#比较字符串
if [ $str1 = $str2 ]
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
~~~
>[danger] ##### 逻辑运算
| 选项 | 含义 |
| --- | --- |
| 判断1 -a 判断2 | 逻辑与 |
| 判断1 -o 判断2 | 逻辑或 |
| !判断 | 逻辑非 |
* 例子
~~~
[ 2 -gt 1 -a 3 -gt 2 ]&&echo "yes"|| echo "no"
[ 2 -gt 1 -a 3 -gt 4 ]&&echo "yes"|| echo "no"
[ 2 -gt 1 -o 3 -gt 4 ]&&echo "yes"|| echo "no"
[ ! 3 -gt 4 ]&&echo "yes"|| echo "no"
#检测字符串是否为空
if [ -z "$str1" -o -z "$str2" ] #使用 -o 选项取代之前的 || ,面的代码我们使用两个[]命令,并使用||运算符将它们连接起来,这里我们改成-o选项,只使用一个[]命令就可以了
then
echo "字符串不能为空"
exit 0
fi
~~~
>[info] ## [[]]
~~~
1.[[ ]] 是 Shell 内置关键字,不是命令
1.1.不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错。
1.2.不需要、也不能对 >、< 进行转义,转义后会出错
2.[[ ]] 支持逻辑运算符,说明
[ -z "$str1" ] || [ -z "$str2" ] 或者 [ -z "$str1" -o -z "$str2" ]如果使用'[[]]'=>[[ -z $str1 || -z $str2 ]]
注意,[[ ]] 剔除了 test 命令的-o和-a选项,你只能使用 || 和 &&
3.举个例子
#!/bin/bash
read str1
read str2
if [[ -z $str1 ]] || [[ -z $str2 ]] #不需要对变量名加双引号
then
echo "字符串不能为空"
elif [[ $str1 < $str2 ]] #不需要也不能对 < 进行转义
then
echo "str1 < str2"
else
echo "str1 >= str2"
fi
~~~
* 对第二条说明
| test 或 \[\] |使用| \[\[ \]\] |使用|
| --- | --- |--- |--- |
| \[ -z "$str1" \] \|\| \[ -z "$str2" \] | **√** | \[\[ -z $str1 \]\] \|\| \[\[ -z $str2 \]\] | **√** |
| \[ -z "$str1" -o -z "$str2" \] | **√** | \[\[ -z $str1 -o -z $str2 \]\] | **×** |
| \[\[ -z $str1 \|\| -z $str2 \]\] | **×** | \[\[ -z $str1 \|\| -z $str2 \]\] | **√** |
>[info] ## 总结
~~~
1.[[ ]] 完全可以替代test , [[ ]] 对数字的比较仍然不友好,用 (()) 来处理整型数字更好
~~~
- 安装-VMware 虚拟机
- 远程连接
- Windows -- wsl
- Linux -- 认识 Linux 和操作系统
- Linux -- Linux 和 windows 对比
- Linux -- 命令提示符
- Linux -- 文件目录
- Linux -- 文件类型
- Linux -- 绝对和相对路径
- Linux -- 常用快捷键
- Linux -- 三种帮助命令
- 帮助命令 -- man
- 帮助命令 -- help
- 帮助命令 -- info
- Linux -- 指令
- alias -- 设置别名
- history -- 查看历史命令
- cd -- 更改目录(切换文件夹)
- pwd -- 打印目录
- ls -- 列出文件内容
- mkdir -- 创建文件夹
- rmdir -- 删除一个空的目录
- touch -- 创建普通文件/修改时间
- cp -- 复制粘贴
- mv -- 移动和重名
- rm -- 删除
- cat/tac -- 查看纯文本文件
- more/less -- 分页读取信息
- head -- 从文本开头查看
- tail -- 从文本结尾查看
- cut -- 提取片段
- sort -- 排序
- uniq -- 去重
- wc -- 统计文件的行数、单词、字节数
- tr -- 替换、缩减或删除字符
- find -- 文件查找
- grep -- 文件当中匹配字符
- 管道 -- |
- locate -- 第三方文件查找
- whereis -- 查找二进制/源代码文件 路径
- which -- 查找环境变量
- 压缩和解压
- ln -- 链接
- wget -- 下载指定的url资源
- 重定向 -- << /< />/> >
- 逻辑控制 -- &&
- echo -- 输出指定内容
- date/cal -- 查看日期和日历
- Linux -- 进程管理
- Linux-- ps 指令
- vi/vim - 文本编辑器
- 更多
- Linux-- 开关机命令
- Liunx -- 退出登录
- Linux-- 查看登录用户信息
- Linux -- 环境变量
- Linux -- 用户
- Linux -- 文件管理
- 文件权限设置 -- chmod
- 更改文件的拥有者 -- chown
- 默认权限 -- umask
- Linux -- 用户
- 新建/删除用户 -- useradd/userdel
- 修改用户属性 -- usermod/chage
- 新建/删除用户组 -- groupadd/groupdel
- 用户切换 -- su/sudo
- 用户/用户组的配置文件
- 用户家目录被删除解决
- last、 lastlog命令查看用户详细的登录信息
- Linux -- shell
- Linux -- 管道符号
- shell -- 执行
- shell -- 变量
- shell -- 字符串
- shell -- 数组
- Shell -- declare 设置变量属性
- shell -- 数学计算
- shell -- 变量作用域
- shell -- 位置参数变量
- shell -- read
- shell - if 语句
- shell -- test
- shell -- case
- Linux -- 循环
- Linux -- 软件包管理