如何熟悉shell if?

Bash

1 基础知识

1.1 命令使用格式

1.2.1 获取命令帮助

man if

1.2.2 基本判断用法

if [ command ]; then
     符合该条件执行的语句
fi

1.2.2 多条件分支判断用法

if [ command ]; then
     符合该条件执行的语句
elif [ command ]; then
     符合该条件执行的语句
else
     符合该条件执行的语句
fi

1.2 command参数

1.2.1 获取参数帮助

man bash

1.2.2 判断文件或目录

[ -a "file"] 如果"file"存在则返回真
[ -d "file"] 如果"file"存在且是一个目录则返回真
[ -e "file"] 如果"file"指定的文件或目录存在时返回真
[ -f "file"] 如果"file"存在且是一个普通文件则返回真
[ -r "file"] 如果"file"存在且是可读的则返回真
[ -w "file"] 如果"file"存在且是可写的则返回真
[ -x "file"] 如果"file"存在且是可执行的则返回真
[ -b "file"] 如果"file"存在且是一个块文件则返回真
[ -c "file"] 如果"file"存在且是一个字符文件则返回真
[ -g "file"] 如果"file"存在且设置了SGID则返回真
[ -h "file"] 如果"file"存在且是一个符号符号链接文件则返回真(老系统可能无效)
[ -k "file"] 如果"file"存在且已经设置了冒险位则返回真
[ -p "file"] 如果"file"存并且是命令管道时返回真
[ -s "file"] 如果"file"存在且大小非0时为真则返回真
[ -u "file"] 如果"file"存在且设置了SUID位时返回真
[ -O "file"] 如果"file"存在且属有效用户ID则返回真
[ -G "file"] 如果"file"存在且默认组为当前组则返回真
[ -L "file"] 如果"file"存在且是一个符号连接则返回真
[ -N "file"] 如果"file"存在且自上次读取后有修改则返回真
[ -S "file"] 如果"file"存在且是一个套接字则返回真
["file1" -nt "file2"] 如果"file1"比"file2"新, 或者"file1"存在但是"file2"不存在则返回真
["file1" -ot "file2"] 如果"file1"比"file2"老, 或者"file2"存在但是"file1"不存在则返回真
["file1" -ef "file2"] 如果"file1"和"file2"指向相同的设备和节点号则返回真

1.2.3 判断字符串

[ -z “string” ] 如果“string”的长度为零则返回真,即空为真
[ -n “string” ] 如果“string”的长度非零则返回真,即非空是真
[ “string” ]  如果字符串不为空则返回真,与-n类似
[ “string1” == “string2” ] 如果两个字符串相同则返回真
[ “string1” != “string2” ] 如果字符串不相同则返回真
[ “string1”  “string2” ] 如果 “string1”字典顺序在“string2”后面则返回真

1.2.3 比较数值大小

[ int1 -eq int2 ] int1和int2两数相等则返回真,与“=”等效
[ int1 -ne int2 ] int1和int2两数不等则返回真,与“”等效
[ int1 -gt int2 ] int1大于int2则返回真,与“>”等效
[ int1 -ge int2 ] int1大于等于int2则返回真,与“>=”等效
[ int1 -lt int2 ] int1小于int2则返回真,与“<”等效
[ int1 -le int2 ] int1小于等于int2则返回真,与“<=”等效

1.2.4 逻辑与或非

[ ! expr ] 逻辑非,如果”expr“是false则返回真(置返)
[ expr1 -a expr2 ] 逻辑与,如果“expr1”且“expr2”都为真则返回真
[ expr1 -o expr2 ] 逻辑或,如果“expr1”或者“expr2”为真则返回真
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件

2 最佳实践

2.1 判断文件或目录

2.1.1 判断文件是否存在

#!/bin/bash

file="/etc/redhat-release"
if [ -f "$file" ]; then
        echo "file fount!"
fi

2.1.2 判断目录是否存在

#!/bin/bash

dir="/etc"
if [ -d "$dir" ]; then
        echo "file fount!"
fi

2.2 判断字符串

2.2.1 确定字符串非空

#!/bin/bash

str="www.cmdschool.org"
if [ -n "str" ]; then
        echo "string is not empty"
fi

2.2.2 比较字符串是否相同

#!/bin/bash

str1="www.cmdschool.org"
str2="www.cmdschool.com"
if [ "str1" = "str2" ]; then
        echo "string same"
else
        echo "string different"
fi

2.3 比较数值大小

a=9
b=6
if [ "$a" -gt "$b" ]; then
        echo "a is biger than b"
fi

2.4 逻辑与或非

#!/bin/bash

file="/etc/redhat-release"
if [ ! -f "$file" ]; then
        echo "file fount!"
else
        echo "file no fount!"
fi

参阅文档
=====================
https://blog.csdn.net/wxx_0124/article/details/95305625

没有评论

发表评论

Bash
如何自动重启Tomcat异常的服务?

1 前言 一个问题,一篇文章,一出故事。 笔者几天前发现Tomcat会因为一个错误而停止服务,虽然进 …

Bash
如何自动挂载目录?

1 前言 一个问题,一篇文章,一出故事。 笔者需要写一个脚本定时挂载目录,但是AutoFS测试过骨兼 …

Bash
如何实现shell逐行读取文件?

1 前言 一个问题,一篇文章,一出故事。 笔者需要使用shell实现逐行(一行一行)地读取文件行并处 …