Shell (Bash) 编程(篇一):语法基础
之前零零碎碎学了几遍 shell(主要是 bash)编程的语法,用的不多很容易忘,归纳一下常用语法备查。
详细的教程与示例,请参考官方的文档或其他优秀的教程:
内容规划
- 变量与语句:声明和使用,特殊变量
- 类型:字符串,数组
- 运算与运算符:算数运算,关系运算,逻辑运算
- 流程控制:循环,分支,函数
变量与语句
声明和使用
基础用法
1 | # 声明 |
变量的条件引用
变量替换时根据变量的具体的状态 (值) 来改变条件引用的值
1 | # 条件A:name未定义; 条件B:name为空 |
特殊变量
一些以 $
开头的特殊变量,在 shell 中有特殊的含义
1 | $$ # 当前shell进程的ID |
举例:
1 | print each param from "$*" |
类型
字符串
截取字符串
1 | ${name:start} # 从start取到末尾 |
其中的 schema 可以是正则表达式,截取字符串的几个例子:
1 | echo ${file%/*} # 取目录 |
替换字符串
1 | ${name/from/to} # 将from替换为to,限第一个 |
其中 from 可以是正则表达式,eg:
1 | ${b//hello[0-9]/world-} |
其他几个常见用法:
1 | ${#name} # name 的长度 |
数组
1 | arr=(penn zshc "cc cc" dddd) # 声明 |
运算与运算符
直接调用函数:在当前的进程执行
小括号调用函数 $(func)
: 在子进程中执行
调用脚本 bash aaa.txt
:在子进程中执行
[[]] # 字符串运算命令
(()) # 算数运算命令
[] # 执行命令并返回执行结果
{} # zsh:执行命令并返回执行结果 eg if {grep username /etc/passwd}
() # zsh:执行并返回执行结果
算数运算
算数运算符:+、-、*、/、%、=、==、!=
1 | $((2 + 3 * 2)) # 可以省略空格:$((2+3*2)) |
关系运算
数值的关系运算
1 | # 比较运算符: -eq: == -ne: != -lt: < |
字符串的关系运算
1 | [[ "a.txt" == a* ]] # true 模式匹配 |
文件 Metadata 判断
1 | # 类型判断符: -b 块设备 -c 字符设备 -d 目录 |
逻辑运算
逻辑运算符:&& || !
1 | [[ a1 == a2 && b1 == b2 ]] # [[ 、]] 内侧需要空格; == 两侧需要空格;! 在zsh中后面也需要空格 |
流程控制
循环
- while:
- until
- for…in
- for
- select
归纳
1 | while [[ ]]; do ... done # 满足条件时运行 |
举例:这里
分支
归纳
1 | if condition; then ... [elif condition; then ... ] [else ... ] fi |
举例:这里
函数
1 | function foo(){} # 定义函数 |
通配符
1 | * # 任意字符串 |