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中运行,你可能还需要使用单方括号。
最后更新于