YeLuoの云端小屋
首页文章项目照片归档关于友链说说
Shell 脚本基础简明笔记
← 返回列表

Shell 脚本基础简明笔记

原文件
写作时间:2026-09-23 00:00

★shell脚本执行方式 1. 直接调用解释器:bash test.sh 2. 赋予执行权限:chmod +x test.sh & ./test.sh 3. 当前Shell执行:source test.sh / . test.sh ```sh for (( x=1;x<=9;x++)) do for(( y=1;y<=x;y++ )) do if [[ $x -eq $y ]]; then printf " $x * $y = $((x * y)); \n" else printf " $x * $y = $((x * y));" fi done done ``` -a:&& 运算符 -o:||运算符 !:非运算符 -lt:< 运算符 -gt:>运算符 -eq:=运算符 -ne:!=不等于 [[ ]]:可以使用所有字符,不需要使用固定的转译字符 return 1 :返回值为1即结束当前函数执行 $1,$2:表示第一个值第二个值 *:表示所有 array[ * ] 获取array中所有参数 #:返回数量或者长度值 ${#array[*]} unset:删除指定元素 unset array[1] 删除一号下标,不加下标删除整个数组 # Shell 脚本基础简明笔记 > 基于 Day8 文档整理,聚焦核心语法与常见陷阱,适合快速查阅。 ------ ## 一、Shell 基础 | 项目 | 说明 | | :------------- | :------------------------- | | **Shell 类型** | Bash(默认)、Zsh、Sh、Csh | | **脚本后缀** | `.sh`(非必须,但规范) | ### 三种执行方式 | 方式 | 命令 | 特点 | | :-------------- | :------------------------------ | :-------------------------------------- | | 直接调用 | `bash test.sh` | 新建子 Shell 执行 | | 赋权执行 | `chmod +x test.sh && ./test.sh` | 需执行权限,子 Shell | | 当前 Shell 执行 | `source test.sh` 或 `. test.sh` | **在当前 Shell 生效**(如加载环境变量) | ------ ## 二、变量 ### 命名规则 - 由 **字母、数字、下划线** 组成,**不能以数字开头**。 ### 变量赋值与引用 ```bash name="张三" # 赋值(等号两边不能有空格) echo $name # 简单引用 echo ${name} # 推荐:明确边界(如 ${name}ABC) ``` ### 引号区别(重要) | 引号 | 特点 | | :------------- | :------------------------------- | | `'单引号'` | **所见即所得**,不解析变量和命令 | | `"双引号"` | **解析变量**(推荐) | | 反引号 ``cmd`` | 执行命令,等同于 `$(cmd)` | | 不加引号 | 数字可以,有特殊字符易出错 | ```bash name=world echo 'Hello $name' # 输出:Hello $name echo "Hello $name" # 输出:Hello world echo $(date) # 执行 date 命令 ``` ### 环境变量持久化 - **临时**:`export VAR=value`(当前终端有效) - **永久**:编辑 `/etc/profile` 或 `~/.bashrc`,添加 `export VAR=value`,然后执行 `source` 使其生效。 ------ ## 三、数值运算(推荐方法) | 方法 | 语法 | 说明 | | :------------------- | :---------------- | :---------------------------- | | **双小括号(推荐)** | `$((a + b))` | 支持 C 风格运算,效率高 | | 单括号 | `$[a + b]` | 兼容性好,但不如 `$(())` 常用 | | expr(旧式) | `$(expr $a + $b)` | 需转义特殊字符,不推荐 | ```bash a=5; b=10 sum=$((a + b)) # 15 ((i++)) # 自增(先加后用 或 先用后加) ``` ------ ## 四、条件判断(三种语法对比) | 语法 | 适用场景 | 优点 | 注意事项 | | :----------- | :------------- | :-------------------------- | :--------------------------------- | | `[ 条件 ]` | 字符串 / 文件 | POSIX 兼容性强 | **必须加空格**;逻辑符用 `-a` `-o` | | `[[ 条件 ]]` | 字符串 / 正则 | 支持 `&&` `||` 和 `=~` 正则 | 仅 Bash 有效,无需转义 `<` `>` | | `(( 条件 ))` | **纯数值比较** | 简洁高效,支持 `>` `<` | 不能用于字符串 | ```bash # 单中括号(注意空格) if [ "$a" -lt "$b" ]; then echo "a小于b"; fi # 双中括号(支持正则) if [[ "$str" =~ ^hello ]]; then echo "以hello开头"; fi # 双小括号(数值比较) if (( a < b )); then echo "a小于b"; fi ``` ### 文件测试常用操作符 | 操作符 | 含义 | | :---------- | :--------------- | | `-f` | 存在且为普通文件 | | `-d` | 存在且为目录 | | `-e` | 存在(任意类型) | | `-r` / `-w` | 可读 / 可写 | ```bash if [ -f /etc/passwd ]; then echo "文件存在"; fi ``` ### 数值/字符串比较速查 | 比较 | 数值(`[ ]`) | 字符串(`[[ ]]`) | | :------- | :------------ | :---------------------- | | 等于 | `-eq` | `==` 或 `=` | | 不等于 | `-ne` | `!=` | | 大于 | `-gt` | `>`(需转义或 `[[ ]]`) | | 小于 | `-lt` | `<` | | 大于等于 | `-ge` | `>=` | | 小于等于 | `-le` | `<=` | ------ ## 五、内容读入 ### 三种输入方式 | 方式 | 说明 | | :-------------- | :-------------------------------------------------------- | | 脚本内赋值 | 写死变量值 | | **命令行传参** | `$1`(第1个参数) `$2`(第2个) `$@`(所有) `$#`(个数) | | **交互式 read** | 运行时动态输入 | ```bash # 命令行传参 ./script.sh arg1 arg2 # $1=arg1, $2=arg2 # read 交互(常用) read -p "请输入用户名: " user read -t 5 -p "5秒内输入: " pwd # -t 超时5秒 ``` ------ ## 六、循环语句 ### for 循环(两种风格) ```bash # 风格1:遍历列表 for n in {1..5}; do echo $n done # 风格2:C语言风格 for ((i=1; i<=10; i++)); do echo $i done ``` ### while 循环 ```bash while true; do echo "无限循环" sleep 1 done ``` ### 循环控制 | 命令 | 作用 | | :--------- | :----------------------- | | `break` | 终止整个循环 | | `continue` | 跳过本次迭代,进入下一次 | | `exit` | 终止整个脚本运行 | ------ ## 七、函数 ### 定义与调用 ```bash # 定义 函数名() { echo "参数1: $1" return 0 # 0成功,非0失败 } # 调用 函数名 "参数值" ``` ### 传参与返回值 - 参数用 `$1`、`$2` 获取 - 函数返回值一般用 **`echo` 输出**,通过 `$(函数调用)` 捕获结果 ```bash add() { echo $(( $1 + $2 )) # echo 输出结果 } result=$(add 5 10) # result=15 ``` ------ ## 八、数组 ### 定义方式 ```bash # 1. 小括号(最常用) arr=(apple banana cherry) # 2. 键值对(自定义索引) declare -A arr2=([0]=a [2]=c) # 3. 逐个赋值(不推荐) arr3[0]=a ``` ### 常用操作 | 操作 | 语法 | 示例 | | :------- | :------------------------- | :-------------------- | | 读取单个 | `${arr[下标]}` | `${arr[0]}` → `apple` | | 读取所有 | `${arr[*]}` 或 `${arr[@]}` | | | 获取长度 | `${#arr[*]}` | | | 添加元素 | `arr[3]=date` | | | 删除元素 | `unset arr[1]` | | | 删除数组 | `unset arr` | | ### 遍历数组 ```bash arr=(apple banana orange) for fruit in ${arr[*]}; do echo "水果:$fruit" done ``` ------ ## 九、实用技巧 ### 随机数 ```bash echo $((RANDOM % 100)) # 0-99 随机整数 echo $(date +%s%N | md5sum | head -c 8) # 8位随机字符串 ``` ### 生成强密码 ```bash pass=$(openssl rand -base64 12) # 12字节随机密码(含特殊字符) ``` ### 批量创建用户(经典脚本骨架) ```bash while read -r user; do if id "$user" &>/dev/null; then echo "用户已存在,跳过" continue fi useradd "$user" pass=$(openssl rand -base64 8) echo "$pass" | passwd --stdin "$user" echo "$user:$pass" >> /tmp/pass.txt done < user_list.txt ``` ------ ## 十、常见易错点(避坑指南) 1. **赋值等号两边不能有空格**:`name=value` ✅,`name = value` ❌。 2. **`[ ]` 内部必须加空格**:`[ "$a" = "$b" ]` ✅,`["$a"="$b"]` ❌。 3. **数值比较用 `-eq`,字符串用 `==`**(在 `[[ ]]` 中)。 4. **双小括号 `(( ))` 内变量可不加 `$`**:`(( a < b ))` ✅,无需写 `$a`。 5. **`source` 执行脚本可保留变量**,适合加载配置。 6. **函数返回值**:`return` 只能返回整数状态码(0~255),返回字符串用 `echo` + 命令替换。

avatar

YeLuo

无聊哦

RECOMMENDED

笔记题库

2026-09-24

AWK使用笔记总结

2026-09-23

组件通信

2026-08-17

© 2026 YeLuo关于友链说说管理
萌ICP备 20266110号Powered by Next.js