if判断

IF判断

if判断变量

变量名
描述

[ -a FILE ]

如果 FILE 存在则为真

[ -b FILE ]

如果 FILE 存在且是一个块特殊文件则为真

[ -c FILE ]

如果 FILE 存在且是一个字特殊文件则为真

[ -e FILE ]

如果 FILE 存在则为真

[ -f FILE ]

如果 FILE 存在且是一个普通文件则为真

[ -g FILE ]

如果 FILE 存在且已经设置了SGID则为真

[ -h FILE ]

如果 FILE 存在且是一个符号连接则为真

[ -k FILE ]

如果 FILE 存在且已经设置了粘制位则为真

[ -r FILE ]

如果 FILE 存在且是可读的则为真

[ -s FILE ]

如果 FILE 存在且大小不为0则为真

[ -t FD ]

如果文件描述符 FD 打开且指向一个终端则为真

[ -u FILE ]

如果 FILE 存在且设置了SUID (set user ID)则为真

[ -w FILE ]

如果 FILE 如果 FILE 存在且是可写的则为真

[ -x FILE ]

如果 FILE 存在且是可执行的则为真

[ -O FILE ]

如果 FILE 存在且属有效用户ID则为真

[ - G FILE ]

如果 FILE 存在且属有效用户组则为真

[ -L FILE ]

如果 FILE 存在且是一个符号连接则为真

[ -N FILE ]

如果 FILE 存在 and has been mod如果ied since it was last read则为真

[ -S FILE ]

如果 FILE 存在且是一个套接字则为真

[ -z STRING ]

“STRING” 的长度为零则为真

if字符串判断

变量名
描述

str1 = str2

两个字符串完全相等为真

str1 != str2

两个字符串不完全相等为真

-n str1

当串的长度大于0时为真(串非空)

-z str1

当串的长度为0时为真(空串)

str1

当串str1为非空时为真

if数字判断

变量名
描述

int1 -eq int2

两数字相等为真

int1 -ne int2

两数字不相等为真

int1 -gt int2

int1大于int2为真

int1 -ge int2

int1>= int2为真

in1 -lt int2

int1<int2 为真

int1 -le int2

int1 <= int2为真

if文件判断

变量名
含义

-r file

用户可读为真

-w file

用户可写为真

-f file

文件为正规文件为真

-x file

用户可执行为真

-d file

文件为目录为真

-c file

文件为特殊字符文件为真

-s file

文件大小非0为真,如果-s后面接目录,总是为真

-b file

文件为块特殊文件为真

-t file

文件描述符(默认1)指定的设备为终端时为真

if逻辑判断

变量名
含义

-a

-o

!

!=

不等于

if判断命令是否执行成功

if ps aux | grep KEY_WORD
then 
	echo "执行成功"
else
	echo "执行失败"
fi

if判断后,不做操作,do nothing

if [ "abc" == "abcd" ]
then
	:	# : 或 true 都可以实现类似python中的pass效果
else
	echo "abc"
fi

判断文件是否为空示例

touch a.txt

if [ -s "a.txt" ];then
	echo "a.txt有内容"
else
	echo "a.txt为空"
fi

# 有时需要判断文件为空则直接做出操作可以使用! 进行取反

if ! [ -s "a.xtx" ];then
	echo "a.txt为空"
else
	echo "a.txt有内容"
fi

shell 脚本中 if 语句里 and or用-a -o表示

if [ a == b -a c == d ]; then  # a等于b,并且 c等于b,则执行后面的脚本
if [ a == b -o c == d ]; then  # a等于b,或 c等于b,则执行后面的脚本

if判断前一条命令是否执行成功

# 方法一
git pull
if [ $? -eq 0 ]; then
	echo -e "${PROJECT_NAME} 本地库已更新完成"
	echo "################################################"
	break;
else
	echo -e "重新尝试更新 ${PROJECT_NAME} 本地库~~"
	sleep 5s
fi

# 方法二(推荐)
if git pull; then
	echo -e "${PROJECT_NAME} 本地库已更新完成"
	echo "################################################"
	break;
else
	echo -e "重新尝试更新 ${PROJECT_NAME} 本地库~~"
	sleep 5s
fi

单个方括号[ ]条件测试

在Linux中,方括号 [] 用于条件测试,这种结构也被称为 "test command"。

这个命令用于检查某个条件是否满足,然后返回一个状态码。返回0表示条件满足(或命令成功),返回非0值表示条件不满足(或命令失败)。

在 [ ] 中,你可以使用各种条件测试运算符,如 -d、-f、-e 等,来检查文件和目录的状态,或者使用 =、!=、-lt、-gt 等运算符来进行数值和字符串的比较。

注意,[ ] 和 [[ ]] 在bash shell中有一些差异。[[ ]] 是bash shell的扩展功能,提供了一些额外的功能,如模式匹配和更强大的字符串处理功能。在某些情况下,你可能需要使用 [[ ]] 而不是 [ ]。

[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

在Shell脚本中,方括号[ ]内部的 -d 是一个测试运算符,用于检查指定的路径是否是一个目录。此外,还有许多其他的测试运算符可用,以下是一些常见的例子:

-f:检查指定的路径是否是一个普通文件。

示例:

[ -f /etc/passwd ] && echo "File exists"

-e:检查指定的路径是否存在。

示例:

[ -e /etc/passwd ] && echo "File or Directory exists"

-r:检查当前用户是否有读取指定文件或目录的权限。

示例:

[ -r /etc/passwd ] && echo "File is readable"

-w:检查当前用户是否有写入指定文件或目录的权限。

示例:

[ -w /etc/passwd ] && echo "File is writable"

-x:检查当前用户是否有执行指定文件或访问指定目录的权限。

示例:

[ -x /bin/ls ] && echo "File is executable"

-s:检查指定文件是否存在且非空。

示例:

[ -s /etc/passwd ] && echo "File exists and is not empty"

-z:检查指定的字符串长度是否为零。

示例:

[ -z "$VAR" ] && echo "String is empty"

-n:检查指定的字符串长度是否非零。

示例:

[ -n "$VAR" ] && echo "String is not empty"

以上运算符还可以结合使用,例如,你可以用 -f 和 -r 来检查一个文件是否存在且可读,如 [ -f /etc/passwd -a -r /etc/passwd ] && echo "File exists and is readable"。


双方括号[[]]

在bash shell中,双方括号 [[ ]] 是单方括号 [ ] 的增强版,提供了更多的功能和灵活性。

一些双方括号 [[ ]] 的特性包括:

字符串比较:双方括号提供了更自然的字符串比较语法。例如,你可以直接使用 < 和 > 进行字符串比较,而不需要像在单方括号中那样对它们进行转义。

[[ "abc" < "def" ]]

模式匹配:你可以使用 == 运算符和通配符进行模式匹配。

[[ "hello" == h* ]]

逻辑运算符:你可以使用 && 和 || 运算符进行复合条件测试。

[[ -d dir1 && -f file1 ]]

不需要引用变量:在双方括号中,你不需要对变量进行引用,即使它们包含空格或特殊字符。

var="file with spaces"
[[ -e $var ]]

注意,虽然双方括号在很多情况下更强大和灵活,但它们是bash和一些其他现代shell(如zsh和ksh)的特性,不一定在所有的shell中都可用。如果你的脚本需要在所有的shell中运行,你可能还需要使用单方括号。

最后更新于