精读笔记 · 第25章 Shell 编程之变量
大约 4 分钟
精读笔记 · 第25章 Shell 编程之变量
精读整理自 RHCE9 随堂讲义(原文字版 13 页)|同名视频约 14 节(第02套) 关联知识文件:
分章笔记/01-Linux/02-07-Shell编程(RHCE9第25-30章)、03-常用命令速查表
一、Shell 是什么(面试基础)
- Shell=壳,命令解释器(C 语言编写的应用程序),用户与 Linux 内核的桥梁;既是命令语言又是程序设计语言(支持变量、循环、分支)。
- 能做什么:批量初始化、批量部署(LAMP/LNMP)、应用管理(KVM/MySQL)、日志分析(PV/UV/200 码)、备份恢复、批量改密、监控采集(配合 Zabbix)、自动化扩容等。
- 解释器位置:
cat /etc/shells/chsh -l;which bash与which sh指向同一文件。
二、脚本执行方式(重点差异)
- 测试脚本内容示例:
echo、read -p "..." name读入、echo "$name"。 - 四种执行:
bash file1、sh file1(子 shell,改不了当前环境);. file1、source file1(本 shell 执行,可影响当前 shell——如 cd/export 生效)。 - 脚本首行
#!/usr/bin/bash(shebang)指定解释器;执行前chmod +x或直接bash 脚本。
三、自定义变量
- 定义:
变量名=变量值;引用:$变量名或${变量名};查看:echo $变量名、set(看所有变量);删除:unset 变量名。 - 命名规则:字母/数字/下划线,首字符不能是数字,中间无空格,不能用标点与 bash 关键字(
help查保留字)。 - 常见报错:
2name=...(数字开头)、name = "x"(等号两侧不能有空格)、name=xulei 666(值含空格必须加引号)。 - 变量叠加:
aa="$aa"456或aa=${aa}789(旧值引用要用双引号或${},否则会把 456/789 当命令)。 - 引号三种: | 引号 | 作用 | | --- | --- | |
" "双引号 | 弱引用:变量/命令替换仍生效(空格成普通字符) | |' '单引号 | 强引用:全部转义,$都不解析 | | 反引号 | 命令替换:先执行里面的命令(同$( )) | - 例:
schoo="1000 phone";schoo='$schoo 666'输出字面$schoo 666;schoo=\date\ 得到当前时间。
四、整数运算四种方法
| 方法 | 语法 | 备注 |
|---|---|---|
| expr | expr 1 + 2 | 乘号要转义 \*,运算符两侧有空格 |
| $(()) | echo $((5-3*2))、$((2**3)) | 幂 ** |
| $[] | echo $[5+2]、$[5**2] | 同 $(()) |
| let | let sum=2+3; echo $sum、let i++ | 适合变量自增 |
- 小数运算:装 bc,
echo "2*4" | bc、echo "scale=2;6/4" | bc(scale 控制小数位)。
五、环境变量(父子 shell 传递)
- 普通自定义变量只在当前 shell 生效,子 shell 用不了(
bash进子 shell 后 echo 为空)。 - 声明环境变量:
export 变量=值直接声明,或export 变量名把已定义变量转环境变量。 - 作用范围:当前 shell + 子 shell 都有效;要登录后一直生效写进
~/.bash_profile(当前用户)或/etc/profile(所有用户)。
六、位置变量与预定义变量
- 位置变量:
$0 命令本身 $1 $2 ... $9(第 10 个起要${10});例./avg.sh 88 77内用$1$2;也可改用read交互读取——两种方式二选一。 - 预定义变量:
$0脚本名、$*所有参数、$#参数个数、$?上一条命令返回值(0 成功、非 0 失败)、$$当前进程 PID。 - 综合脚本:
echo "($1+$2)/2" | bc算平均分;课后作业“自动建用户设初始密码”:useradd $name+echo "123456" | passwd --stdin $name。 - “配置本地 yum 源”脚本用
mount /dev/cdrom /mnt+cat << EOF > repo生成 repo 文件(heredoc 知识后面章节展开)。
七、命令速查表
| 场景 | 命令 | | 执行脚本 | bash/sh 脚本(子 shell)、. 脚本/source 脚本(当前 shell) | | 定义/查看/删除 | name="值"、echo $name、set、unset name | | 命令替换 | cmd 或 $(cmd) | | 整数运算 | expr 1 + 2、$(( ))、$[ ]、let | | 小数运算 | echo "scale=2;6/4" \| bc | | 环境变量 | export 名=值;写 ~/.bash_profile / /etc/profile | | 位置/预定义 | $1..$9、$0/$#/$*/$?/$$ | | 测试在线 | ping -c1 $ip &>/dev/null && echo up \|\| echo down |
八、易错点
=两侧绝不能有空格;值含空格必须引号。- 单引号不解析
$,反引号先执行命令——echo '$(date)'与echo "$(date)"结果不同。 bash/sh是子 shell,改环境不生效;要影响当前环境用source/.。- 变量叠加不用引号/
${}会把拼接文字当命令执行。 - expr 的
*必须转义成\*;$?要紧接着上一条命令判断。 - 判断命令成功用
&&(成功才执行后面),失败用||——与 C 语言习惯相反时容易混。
九、实操清单
写 file1 用四种方式执行对比子/本 shell → 变量命名踩坑三连(数字开头/等号空格/值空格)→ 三种引号对比实验 → 四种整数运算 + bc 小数 → export 变量进子 shell 验证 → 位置变量 avg.sh(88 77) → 预定义变量 $0/$#/$*/$? → 课后题:自动建用户+本地 yum 源脚本。
十、本章自测
- 四种执行方式哪些是子 shell?2. 变量命名三规则?3. 三种引号的区别?4. 整数运算四种方法及 expr 乘号注意?5. 普通变量如何变环境变量、写哪个文件全局生效?6. $0/$#/$*/$?/$$ 含义?7.
&&与||语义?
