定义变量:name=string,等号两边不能有空格。
引用变量:在变量名前加 $,如 $name。
引号区别:"" 内允许变量替换,'' 内完全原样输出。
# 引号区别演示
$ echo who are you
who are you
$ echo Je t'aime
# 报错:单引号不匹配,shell 认为命令未结束
$ echo "Je t'aime"
Je t'aime
局部变量:仅在当前 shell 有效,子 shell 无法访问。
全局变量:使用 export 将其提升为全局变量,子 shell 也能访问。
# export 演示
$ var1=Linux
$ var2=unix
$ export var2
$ bash
$ echo $var1
# 空:var1未export,子shell中无值
$ echo $var2
unix
环境变量:使用 set 命令查看所有环境变量(如 PATH、HOME、SHELL)。修改 PATH 时注意拼接:PATH=/tmp:$PATH。
工作环境配置文件:
系统级:/etc/profile(登录时加载)
用户级:$HOME/.bash_profile(登录) | $HOME/.bashrc(非登录)
cmd1 ; cmd2 不论 cmd1 成功与否,cmd2 都会执行(常用于 sync;sync;shutdown)
cmd1 && cmd2 cmd1 成功($?=0)才执行 cmd2
cmd1 || cmd2 cmd1 失败($?≠0)才执行 cmd2
经典用法:不管目录存在与否,都要创建文件:
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
解释:不存在就创建目录,然后创建文件。存在则跳过mkdir,直接touch。
条件判断输出:
ls /tmp/bobbying && echo "exist" || echo "not exist"
文件存在打印 exist,不存在打印 not exist。
常用选项速查:
-n 显示行号 -i 忽略大小写 -v 反向选择-A n 显示匹配行后面 n 行 -B n 显示匹配行前面 n 行--color=auto 高亮匹配内容
# 基础搜索
$ dmesg | grep 'IPv6'
# 从内核日志中过滤包含 IPv6 的行
# 带颜色 + 行号 + 上下文
$ dmesg | grep -n -A1 -B1 --color=auto 'IPv6'
# 高亮关键字,显示前后各 1 行,带行号
# 忽略大小写
$ grep -in 'the' /root/sample.txt
# -i 让 the/The/THE 全部匹配,-n 显示行号
[] 字符集 匹配括号中任意一个字符
t[ae]st → 匹配 tast 或 test[^g]oo → oo 前面不能是 g[a-z] → 任意小写字母 [0-9] → 任意数字
^ 行首 / $ 行尾
^the → 以 the 开头的行\.$ → 以点号结尾的行(注意 . 要用 \ 转义)^$ → 匹配空白行
. 任意字符 / * 重复
g..d → g 开头 d 结尾,中间任意 2 个字符ooo* → 至少 2 个 o(oo、ooo…)g.*g → 以 g 开头且以 g 结尾,中间任意内容[0-9][0-9]* → 匹配任意数字
{} 限定范围(注意:{ } 在 shell 中需要转义!)
o\{2\} → 恰好 2 个 ogo\{2,5\}g → g + 2~5 个 o + ggo\{2,\}g → g + 至少 2 个 o + g
# 重定向示例
$ ls -l /tmp > dir
# 将 /tmp 目录列表写入 dir 文件(覆盖)
$ ls -l /etc >> dir
# 将 /etc 目录列表追加到 dir 文件末尾
$ myprogram 2>err_file
# 仅将错误信息保存到 err_file
$ myprogram &>output_file
# 标准输出和错误信息都保存到 output_file
$ grep IPv6 /etc/* 2>/dev/null
# 丢弃所有错误信息,"眼不见为净"
防止误覆盖:set -o noclobber 开启后,重定向不会覆盖已存在的文件。
管道符 | 将前一条命令的标准输出作为后一条命令的标准输入。
格式:命令1 | 命令2 | ... | 命令n 从左到右顺序执行,单向流动。
# 管道常用组合
$ ls -Rl /etc | more
# 分屏显示目录列表
$ cat /etc/passwd | wc
# 统计文件行数、字数、字符数
$ cat /etc/passwd | grep yangyun
# 查找是否存在 yangyun 用户
$ rpm -qa | grep ssh
# 查看是否安装了 ssh 软件包
$ tail -15 /etc/passwd | head -3
# 显示倒数15行中的前3行
理解管道本质:管道将多个独立的进程串联成一条流水线。每一条命令作为一个单独进程运行,前一个进程的输出直接流向下一进程的输入,无需中间文件,效率极高。
| | |
| name=string ; export name | |
| | |
| cmd1 && cmd2 ; cmd1 || cmd2 | |
| grep -n -A1 -B1 --color=auto str | |
| | |
| | |
| | |
你还想了解 Shell 的哪些内容?
条件判断、循环语句、函数……留言告诉我,下篇安排上!