#!/bin/bashset -euo pipefail # 遇错退出+未定义变量报错+管道失败退出name="value" # 定义变量echo $name # 使用变量echo ${name} # 推荐写法echo ${name:-default} # 默认值(变量为空时)echo ${#name} # 字符串长度readonly name="const" # 常量echo "$name" # 双引号:解析变量echo '$name' # 单引号:原样输出echo $(date) # 命令替换echo `date` # 同上(不推荐)[ -f file ] # 文件存在[ -d dir ] # 目录存在[ -r file ] # 文件可读[ -w file ] # 文件可写[ -x file ] # 文件可执行[ -s file ] # 文件非空[ -z "$var" ] # 字符串为空[ -n "$var" ] # 字符串非空[ "$a" = "$b" ] # 字符串相等[ $a -eq $b ] # 数字相等[ $a -gt $b ] # 大于[ $a -lt $b ] # 小于[ $a -ge $b ] # 大于等于[ $a -le $b ] # 小于等于[[ $str == *pattern* ]] # 通配符匹配[[ $str =~ ^[0-9]+$ ]] # 正则匹配# for循环for i in {1..10}; do echo $idonefor f in *.log; do echo "处理: $f"donefor ip in 192.168.1.{1..254}; do ping -c1 -W1 $ip &>/dev/null && echo "$ip is up"done# while循环while read line; do echo $linedone < file.txtwhile true; do sleep 1done# until循环until [ condition ]; do sleep 1done# 基本函数myfunc() { echo "hello"}# 带参数greet() { echo "Hello, $1"}greet "World" # 调用# 返回值(用$?)add() { return $(($1 + $2))}add 3 5echo $? # 输出 8# 局部变量local var="value"arr=(a b c d) # 定义echo ${arr[0]} # 取第1个元素echo ${arr[@]} # 所有元素echo ${#arr[@]} # 数组长度arr+=(e) # 追加元素arr=("${arr[@]}" "new") # 另一种追加unset arr[0] # 删除元素${var#prefix} # 删除最短前缀${var##prefix} # 删除最长前缀${var%suffix} # 删除最短后缀${var%%suffix} # 删除最长后缀${var/old/new} # 替换第一个${var//old/new} # 替换所有${var:0:5} # 截取子串${var:5} # 从第6个字符开始${var^^} # 转大写${var,,} # 转小写$0 # 脚本名$1-$9 # 位置参数${10} # 第10个参数$@ # 所有参数(独立)$* # 所有参数(合并)$# # 参数个数$? # 上条命令退出码$$ # 当前PID$! # 最后后台进程PID$- # 当前标志位command > file # 标准输出到文件(覆盖)command >> file # 标准输出到文件(追加)command 2> file # 错误输出到文件command &> file # 所有输出到文件command > file 2>&1 # 错误重定向到标准输出command > /dev/null 2>&1 # 丢弃所有输出command < file # 从文件读取输入command1 | command2 # 管道tee file # 同时输出到屏幕和文件bash -n script.sh # 语法检查bash -x script.sh # 执行追踪set -x / set +x # 开启/关闭追踪set -e / set +e # 开启/关闭遇错退出set -u / set +u # 开启/关闭未定义变量检查上一篇:备份与压缩下一篇:高频运维技巧与别名