12. 条件判断
跟其它程序设计语言一样,Bash 中的条件语句让我们可以决定一个操作是否被执行。结果取决于一个包在 [[ ]]
里的表达式。由 [[ ]]
( sh
中是 [ ]
)包起来的表达式被称作 检测命令 或 基元 。这些表达式帮助我们检测一个条件的结果。这里可以找到有关 bash 中单双中括号区别 的答案。共有两个不同的条件表达式: if
和 case
。
if
if
在使用上跟其它语言相同。如果中括号里的表达式为真,那么 then
和 fi
之间的代码会被执行。 fi
标志着条件代码块的结束。Code
#!/usr/bin/env bash
# if 语句
# ----------------------------------------
# 一行的表达式
# 表达式结果为真,则返回 0,if 把 0 值引向then
if [ 1 -eq 1 ]; then
echo "1 -eq 1 result is: true"
fi
# Test 方法
# 表达式结果为假,则返回非 0,if把非 0值引向then
if test 1 -eq 1; then
echo "1 -eq 1 result is: true"
fi
# 换行写法
# 命令执行成功,等于返回 0, 这里实际上是命令的执行xie'fa
if
1 -eq 1
then
echo "1 -eq 1 result is: true"
fi
# Output: 1 -eq 1 result is: true
# if 快捷写法
# ----------------------------------------
[ 1 -eq 1 ] && echo '1 = 1'
# 条件是 0 也会输出数据, 因为 shell 返回 0 则认为是 shell 正常执行
# if [ i –ne 0 ] 可以替代为 0 的情况
# ----------------------------------------
i=0
if [ $i ]; then
echo "即使是 0 , 这里也会输出"
fi
# 字符串, 这里字符串变量 非 0 为 True
var='abc'
if [ "${var}" ]; then
echo "abc result is: true"
fi
# Output: abc -eq abc result is: true
同样,可以使用 if..else
语句 或者 if..elif..else
,使用起来也很方便。Code
#!/usr/bin/env bash
# if else 语句
# ----------------------------------------
if [[ 2 -ne 1 ]]; then
echo "true"
else
echo "false"
fi
# Output: true
# if elif else 语句
# ----------------------------------------
x=10
y=20
if [[ ${x} > ${y} ]]; then
echo "${x} > ${y}"
elif [[ ${x} < ${y} ]]; then
echo "${x} < ${y}"
else
echo "${x} = ${y}"
fi
# Output: 10 < 20
拆解 if commandCode
#!/usr/bin/env bash
# if command 语句
# ----------------------------------------
if
grep <"$(dirname "$0")"/_tmp.txt 'duoli'
then
echo 'found duoli'
else
echo 'not found duoli'
fi
[]
和 [[]]
的区别
[]
单中括号a. []
两个符号左右都要有空格分隔b. 内部操作符与操作变量之间要有空格:如 [ "a" = "b" ]
c. 字符串比较中, >
<
需要写成 >
\<
进行转义d. []
中字符串或者 ${}
变量尽量使用 "
双引号扩住,以避免值未定义引用而出错e. []
中可以使用 –a –o 进行逻辑运算f. []
是bash 内置命令: [
is a shell builtin
[[]]
双中括号双方括号提供了字符串比较的高级特性, 可以定义一些正则表达式来匹配字符串, 但是并非所有的 shell 都支持双方括号a. [[]]
两个符号左右都要有空格分隔b. 内部操作符与操作变量之间要有空格:如 [[ "a" = "b" ]]
c. 字符串比较中,可以直接使用 >
<
无需转义d. [[]]
中字符串或者 ${}
变量尽量使用 ""
双引号扩住,如未使用 ""
会进行模式和元字符匹配e. [[]]
内部可以使用 &&
||
进行逻辑运算f. [[]]
是bash keyword: [[
is a shell keyword
case
如果你需要面对很多情况,分别要采取不同的措施,那么使用 case
会比嵌套的 if
更有用。使用 case
来解决复杂的条件判断,看起来像下面这样:Code
#!/usr/bin/env bash
echo "input param: " $1 $2 $3
x=0
if [[ -n $1 ]]; then
x=$1
fi
oper=""
if [[ -n $2 ]]; then
oper=$2
fi
y=0
if [[ -n $3 ]]; then
y=$3
fi
exec
case ${oper} in
+ | add)
val=$(expr ${x} + ${y})
echo "${x} + ${y} = ${val}"
;;
- | sub)
val=$(expr ${x} - ${y})
echo "${x} - ${y} = ${val}"
;;
\* | mul)
val=$(expr ${x} \* ${y})
echo "${x} * ${y} = ${val}"
;;
/ | div)
val=$(expr ${x} / ${y})
echo "${x} / ${y} = ${val}"
;;
*)
echo "Unknown oper!"
;;
esac
每种情况都是匹配了某个模式的表达式。 |
用来分割多个模式, )
用来结束一个模式序列。第一个匹配上的模式对应的命令将会被执行。 *
代表任何不匹配以上给定模式的模式。命令块儿之间要用 ;;
分隔。
说明
创建时间: 2023-12-04 19:27:00 , 最后编辑于 2023-12-05 14:14:00