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=100

2. 调用变量

$name
${name}             # 标准写法,防粘连

3. 内置特殊变量

$0      脚本名
$1 $2   第1、第2命令行参数
$#      参数总个数
$@      所有参数(分开)
$*      所有参数(合并)
$?      上一条命令返回值 0成功 非0失败
$$      当前进程PID
$!      最后后台进程PID

4. 变量运算

# 整数运算
a=10
b=20
c=$((a+b))
d=$[a*b]
 
# 字符串拼接
s1=abc
s2=123
s3="$s1$s2"

三、引号区别(必背)

  1. 单引号 '' 原样输出,不解析变量、不转义
echo '$name'  # 输出 $name
  1. 双引号 "" 解析变量,保留空格,不屏蔽大部分转义
echo "$name"  # 输出变量值
  1. 反引号 ` / $() 执行命令,把结果赋值
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
  命令
fi

2. case 语句(你核心在用)

case $变量 in
匹配1)
  命令1;命令2
  ;;
匹配2|匹配3)   # 或匹配
  命令
  ;;
*)             # 默认匹配
  默认命令
  ;;
esac
  • ; 同行分隔多条命令
  • ;; 结束当前case分支(固定语法)

六、循环语句

1. while 循环

while 条件;do
  循环体
done

参数解析经典写法

while [[ $#--gt-0-| -gt 0 ]];do
  ...
done

2. for 循环

# 遍历列表
for i in 1 2 3 a b;do echo $i;done
 
# 数字区间
for ((i=1;i<=10;i++));do echo $i;done

3. 循环控制

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
done

2. 判断模板

if [[ -n $val ]];then
  echo 有值
else
  echo 空值
fi

终极记忆口诀

  1. 同行多命令:; 顺行,&&成功走,||失败走
  2. 变量调用:{}规范
  3. 引号:单引原样,双引解析,反引执行
  4. 判断:数字用-gt/-lt,字符串用==
  5. 分支:多匹配用case,条件判断用if
  6. 参数解析:while循环+case+shift
  7. case内:同行命令用;,分支结尾用;;

需要我把这份语法整理成一页可打印备忘录 txt,或者整理成运维脚本常用代码片段合集吗?