基本语法¶
简而言之,就是基本操作的简单示例。这是我们的第一个脚本:Hello World!
变量¶
直接定义声明,或通过 declare 声明:
+/-: 取消/设置变量的属性-f: 显示函数体-p: 显示所有变量-r: 只读-x: 设置为环境变量,与export相同-i: 整数(integer)
var.sh
#!/usr/bin/env bash
# 声明变量
MY_VAR="Enana"
declare -i NUM="6"
declare -i WITH_I=NUM+4
NO_I=NUM+4
# 使用和打印变量属性
echo "My variable is ${MY_VAR}. Following the declare -p."
declare -p MY_VAR NUM
# 对比和打印变量属性
echo -e "\nDifferent from \`declare -i WITH_I=NUM+4\` and \`NO_I=NUM+4\`:"
declare -p WITH_I NO_I
当前脚本的系统变量:
$0: 脚本名$n: 第 n 个参数$*: 所有参数"$*" = "$1 $2 ... $n"$@: 所有参数"$@" = "$1" "$2" ... "$n"$#: 所有参数个数$?: 返回值$$: 进程 PID
语句¶
括号类型:
( ... ): 在子 shell 中使用命令(( ... )): 数值运算[ ... ]: 等价与test,...前后必须保留空格[[ ... ]]:bash扩展测试{ ... }:...前必须保留空格或换行,...后必须保留;或换行
Tip
(( ... ))用于循环语句时,固定为三段式(( expr1; expr2; expr3 ))。[ ... ]和[[ ... ]]中的比较运算左右必须也要空格。- Bash 中,使用花括号扩展生成序列时,前后不需要括号。花括号扩展先于通配符扩展解析。
关于判断的使用:
-
判断逻辑运算符
&&: 与||: 或!: 非-f: 判断文件-d: 判断目录
-
以下只能用于整数判断
-eq: 等于-ne: 不等于-lt: 小于-gt: 大于-le: 小于等于-ge: 大于等于
Info
传统的 test 命令中,不支持 &&、|| 的使用,字符串的比较只能用 = 和 !=。
在 Bash 扩展测试中,支持 &&、|| 的使用,同时可以用 =~ 正则匹配字符串。
进行整数判断的时候,更推荐使用数值运算。
语句示例:
# if 语句
if `list`; then `list`; fi
if `list`; then `list`; [ elif `list`; then `list`; ] [ else `list`; ] fi
# for 语句
for var in word ...; do `list`; done
for (( i = 0; i < 10; i++ )); do `list`; done
# while 和 until 语句
while `list`; do `list`; done
until `list`; do `list`; done
# case 语句
case var in pattern) `list`;; esac
case var in pattern) `list`;; [ pattern) `list`;; ] esac
# select 语句
PS3=" ... "
select var in word ...; do `list`; done
select var in word ...; do `list` [break] ; done
函数¶
语句可以构成复合命令(Compound Command),并作为函数体使用:
# 函数的定义
function fname() `compound-command`
# POSIX 标准
fname() `compound-command`
# 函数的使用
fname arg1 arg2 ...
推荐用 { ... } 将函数体包裹,明确函数边界,增强可读性。需要隔离环境时可用 ( ... )。
关于 ()
默认不将参数传入函数定义时的 () 内。
在 Bash 扩展中,函数的定义可以省略 ()。在 POSIX 标准中,函数的定义不可以省略 ()。
定义方式的选择
在脚本中,推荐用 POSIX 标准的方式定义和使用函数,保证最大的兼容性。