Skip to content
On this page

总结

  • 引号
    • ` 反引号:直接执行
    • " 双引号:对变量名进行替换,直接输出
    • ' 单引号:全部原样输出
  • 括号
    • $():直接执行
    • $(()):可以进行数字计算。
    • (()):数学运算符,也可以跟 >/</= 作为测试判断,返回 1/0
  • 中括号
    • 可以使用 test 替代布尔运算符 [[ ]]
    • [[ -z STRING ]]: 判断为空
    • [[ -n STRING ]]: 判断非空
    • [[ NUM -eq NUM ]]: Equal,等于。
    • [[ NUM -ne NUM ]]: Not equal,不等于。
    • [[ NUM -lt NUM ]]: Less than,小于。
    • [[ NUM -le NUM ]]: Less than or equal,小于等于。
    • [[ NUM -gt NUM ]]: Greater than,大于。
    • [[ NUM -ge NUM ]]: Greater than or equal,大于等于。
    • [[ NUM >/</= NUM ]]: 大于 小于 等于
    • [[ -e FILE ]]: Exists 文件是否存在
    • [[ -r FILE ]]: Readable 文件是否可读
    • [[ -w FILE ]]: Writable 文件是否可写
    • [[ -x FILE ]]: Executable 文件是否可指向
    • [[ -h FILE ]]: Symlink 是否软链接
    • [[ -d FILE ]]: Directory 是否目录文件
    • [[ -f FILE ]]: File 是否为文件
    • [[ -s FILE ]]: 文件内容不为空

提问

  • [x] 1. shell 中 ${}$() 有什么区别

    ${} 可以作为引用变量的边界,${PATH} 等同于 $PATH
    $() 作为执行命令的边界

  • [x] 2. shell 中 '" 有什么区别

    ': 直接原样输出
    ": 对变量名进行替换,直接输出

  • [x] 3. shell 中 [[]](()) 有什么区别 What is the difference between the Bash operators [[ vs [ vs ( vs ((?

    [[]]: 类似布尔运算符, if 的替代,内部的条件表达式可以比较字符串、检查文件是否存在等,功能比较多。返回 true/false
    (()): 数学运算符,也可以跟 >/</= 作为测试判断,返回 1/0

  • [x] 4. 如何判断某个文件是否存在

    [[ -e FILE ]]

  • [x] 5. 如何直接在 shell 中计算 1+1=

    echo $(( 1 + 1 ))

1. 前提提要、场景

2. 引号

  • 反引号:对命令直接执行
  • 双引号:对命令直接输出,对变量名进行替换
  • 单引号:全部原样输出
sh
# 直接执行变量
$ echo `pwd`
/root

# 对变量名进行替换输出
$ echo "$USER"
root

# 对变量名不做替换进行输出
$ echo '$USER'
$USER

3. 括号

$()(Command substitution) 和 反引号一样,直接执行

sh
$ echo `pwd`
/root

$ echo $(pwd)
/root

$(()):有数字计算功能。

sh
$ echo $(( 1 + 1 ))
2

(()):数学运算符,也可以跟 >/</= 作为测试判断,返回 1/0

sh

$ (( 4 > 1 )) && echo ok
ok

$ (( 4 < 1 )) && echo ok
# 没有输出

3. 中括号

[[ ]]:布尔运算符,返回 true/false

sh
# 如果用户为 root,则输出 ok
$ [[ $USER == 'root' ]] && echo ok

# 如果用户不是 root,则输出 ok
$ [[ $USER != 'root' ]] && echo ok

3.1 是否为空

  • [[ -z STRING ]]: 判断为空
  • [[ -n STRING ]]: 判断非空
sh
$ [[ -z 'yes' ]] && echo ok
# 没有输出

$ [[ -n 'yes' ]] && echo ok
ok

3.2 数字判断

  • [[ NUM -eq NUM ]]: Equal,等于。
  • [[ NUM -ne NUM ]]: Not equal,不等于。
  • [[ NUM -lt NUM ]]: Less than,小于。
  • [[ NUM -le NUM ]]: Less than or equal,小于等于。
  • [[ NUM -gt NUM ]]: Greater than,大于。
  • [[ NUM -ge NUM ]]: Greater than or equal,大于等于。
sh
# 以下三个等同
$ [[ 4 -gt 1 ]] && echo ok
ok

$ [[ 4 > 1 ]] && echo ok
ok

$ (( 4 > 1 )) && echo ok
ok
sh
# 以下两个等同
$ [[ 4 -eq 4 ]] && echo ok
ok

$ (( 4 == 4 )) && echo ok
ok

3.3 布尔判断,配合文件操作

  • [[ -e FILE ]]: Exists 文件是否存在
  • [[ -r FILE ]]: Readable 文件是否可读
  • [[ -w FILE ]]: Writable 文件是否可写
  • [[ -x FILE ]]: Executable 文件是否可指向
  • [[ -h FILE ]]: Symlink 是否软链接
  • [[ -d FILE ]]: Directory 是否目录文件
  • [[ -f FILE ]]: File 是否为文件
  • [[ -s FILE ]]: 文件内容不为空
sh
# 文件存在,则输出 ok
$ [[ -e /usr/local/bin/npm ]] && echo ok

# 如果不存在文件,则输出 ok
$ [[ ! -e /usr/local/bin/npm ]] && echo ok

# 可以使用 `test` 替代布尔运算符 `[[ ]]`
$ test -n $USER && echo ok
ok