Shell Bash 最全语法完整版(精简速记+日常够用全集)
一、行内多命令连接符(你刚问的重点)
| 符号 | 作用 | 规则 | ||
|---|---|---|---|---|
; | 顺序分隔命令 | 不管前一条成败,全部执行 | ||
&& | 逻辑与 | 前命令成功才执行后命令 | ||
|| | 逻辑或 | 前命令失败才执行后命令 | ||
& | 后台运行 | 丢后台,不阻塞终端 | ||
| | 管道 | 标准输出传给下一条命令输入 | ||
() | 子shell执行 | 新开环境,不影响当前变量 | ||
{} | 聚合命令 | 同一环境批量执行 |
示例:
a=1; echo $a
mkdir test && cd test
rm abc || echo 文件不存在
sleep 10 &
ls | grep txt二、变量语法
1. 定义变量
name=zhangsan # 无空格
str="hello world" # 带空格必须双引号
num=1002. 调用变量
$name
${name} # 标准写法,防粘连3. 内置特殊变量
$0 脚本名
$1 $2 第1、第2命令行参数
$# 参数总个数
$@ 所有参数(分开)
$* 所有参数(合并)
$? 上一条命令返回值 0成功 非0失败
$$ 当前进程PID
$! 最后后台进程PID4. 变量运算
# 整数运算
a=10
b=20
c=$((a+b))
d=$[a*b]
# 字符串拼接
s1=abc
s2=123
s3="$s1$s2"三、引号区别(必背)
- 单引号
''原样输出,不解析变量、不转义
echo '$name' # 输出 $name- 双引号
""解析变量,保留空格,不屏蔽大部分转义
echo "$name" # 输出变量值- 反引号
`/ $() 执行命令,把结果赋值
now=`date`
now=$(date)四、条件判断语法
1. 两种判断格式
[ 表达式 ]传统写法[[ 表达式 ]]bash高级写法(推荐)
2. 数字比较
[[ $a -eq $b ]] # 等于
[[ $a -ne $b ]] # 不等于
[[ $a -gt $b ]] # 大于
[[ $a -lt $b ]] # 小于
[[ $a -ge $b ]] # 大于等于
[[ $a -le $b ]] # 小于等于3. 字符串判断
[[ $s1 == $s2 ]] # 相等
[[ $s1 != $s2 ]] # 不等
[[ -z $str ]] # 字符串为空
[[ -n $str ]] # 字符串非空4. 文件判断
[[ -f file ]] # 普通文件存在
[[ -d dir ]] # 目录存在
[[ -e path ]] # 任意文件存在
[[ -r file ]] # 可读
[[ -w file ]] # 可写
[[ -x file ]] # 可执行5. 逻辑组合
&& 并且
|| 或者
! 取反
[[ $a>5 && $a<10 ]]五、分支语句
1. if 语句
if 条件;then
命令
elif 条件;then
命令
else
命令
fi2. case 语句(你核心在用)
case $变量 in
匹配1)
命令1;命令2
;;
匹配2|匹配3) # 或匹配
命令
;;
*) # 默认匹配
默认命令
;;
esac;同行分隔多条命令;;结束当前case分支(固定语法)
六、循环语句
1. while 循环
while 条件;do
循环体
done参数解析经典写法
while [[ $#--gt-0-| -gt 0 ]];do
...
done2. for 循环
# 遍历列表
for i in 1 2 3 a b;do echo $i;done
# 数字区间
for ((i=1;i<=10;i++));do echo $i;done3. 循环控制
break 跳出整个循环
continue 跳过本次,进入下一轮七、参数移动 shift
shift # 删掉第一个参数
shift 2 # 删掉前两个参数搭配 $1 $2 解析命令行参数标配。
八、输入输出
read 变量 # 读取键盘输入
echo 输出文本
echo -n 不换行输出
# 重定向
> 覆盖输出
>> 追加输出
< 标准输入
2> 错误输出
&> 全部输出九、函数语法
func_name(){
echo "函数内容"
return 0
}
# 调用
func_name
# 函数内参数同样用 $1 $2十、注释
# 单行注释
: '
多行注释
随便写
'十一、通配符(case/匹配常用)
* 任意任意字符
? 任意单个字符
[0-9] 数字
[a-z] 小写字母
--* 以--开头
十二、最简实战模板(直接套用)
1. 命令行参数解析模板
#!/bin/bash
while [[ $#--gt-0-| -gt 0 ]];do
case $1 in
--key) val="$2";shift 2;;
*) echo 未知参数;exit 1;;
esac
done2. 判断模板
if [[ -n $val ]];then
echo 有值
else
echo 空值
fi终极记忆口诀
- 同行多命令:; 顺行,&&成功走,||失败走
- 变量调用:{}规范
- 引号:单引原样,双引解析,反引执行
- 判断:数字用-gt/-lt,字符串用==
- 分支:多匹配用case,条件判断用if
- 参数解析:while循环+case+shift
- case内:同行命令用;,分支结尾用;;
需要我把这份语法整理成一页可打印备忘录 txt,或者整理成运维脚本常用代码片段合集吗?