3.条件语句

  1. [[]] ,[] ,(())
    1. 易用性
    2. 扩展
    3. 外部链接
  2. if语句
    1. 用法
    2. 条件语句
  3. [&&   符号](#符号)

[[]] ,[] ,(())

在 Stackoverflow 的 [Is double square brackets [ ]] preferable over single square brackets [ ] in Bash? 中,我们了解到 [[]][] 的区别:

  • [] 是POSIX 中的语法。
  • [[]]test [] 是相同的。
    • 当使用 sh 的时候,我们只能使用 test [] ,不能使用 [[]]
    • 当使用某些 shell,如 Bash,我们可以使用 [[]] 代替 test []
    • [[]][] 更方便,[[]] 解决了 [] 一些语法难以使用,并提供了一部分扩展

易用性

1
2
3
4
5
6
7
8
9
10
11
12
13
# 字符串比较
[ "$var" = '' ] 
= [[ $var = '' ]]

[ "$var" \< a ]
= [[ $var < a ]]

[ a = a ] && [ b = b ]
= [[ a = a && b = b ]]

# 数字比较
if [ "$a" -gt "$b" ]; then ...; fi
= if (( a > b )); then ...; fi
  • 数字比较时候,(()) 中的变量不需要使用 $ 符号。github

扩展

正则表达式

1
2
3
[[ ab = a? ]]
[[ abc = a* ]]
[[ abb =~ ab+ ]]

外部链接

  • https://stackoverflow.com/questions/669452/is-double-square-brackets-preferable-over-single-square-brackets-in-ba
  • http://mywiki.wooledge.org/BashGuide/Practices#Bash_Tests

if语句

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 多行
if [[ $retVal -eq 0 ]]; then 
  echo_debug "Delete succeeded"; 
else 
  echo_warn "Delete failed"; 
fi

# 单行
return_code=$?
if [[ $return_code -eq 0 ]]; then echo_debug "Delete succeeded"; else echo_warn "Delete failed"; fi

# 否定
if ! [[ $return_code -eq 0 ]]
if ! (( return_code == 0))

条件语句

参考:

  • http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
  • man test
  • man read

&&||符号

  • 通过返回值进行判断
  • 等同于 if 语句,不能完全当作 if...else... 使用。当要当作 if 执行语句1 else 执行语句2 使用,那么其中间执行语句一定不能有不可控因素
1
2
3
4
5
# 如果找到文件,就不下载
function download() {
  ls "./download.txt" >>/dev/null 2>&1 && return 0
  curl -LO https://example.com/download.txt
}