公司动态

7.Shell 基础(从零开始学)

📅 2026/7/18 23:24:28
7.Shell 基础(从零开始学)
在开启一天的学习的时候先做好快照过程中如果出现意外的报错解决不了的就立即恢复快照作为初学者省时省力不要过于纠结哪里错了浪费时间1.变量定义和查看Linux 使用变量临时字符串值便于后续引用。变量值存储在当前会话内存中。变量名只能包含字母、数字、下划线。变量名不能以数字开头。shell中变量的类型一般不需要明确指明。# 变量定义 [fengkaicentos7 ~ 14:31:40]$ var1key1 [fengkaicentos7 ~ 14:35:48]$ echo $var1 key1 # 标准格式如下 [fengkaicentos7 ~ 14:36:09]$ declare var1key1 # 使用$引用变量值 [fengkaicentos7 ~ 14:36:23]$ echo $var1 key1 # 示例2 [fengkaicentos7 ~ 14:36:28]$ first_namekai [fengkaicentos7 ~ 14:37:12]$ last_namefeng [fengkaicentos7 ~ 14:37:36]$ echo $last_name $first_name feng kai # 使用多个空格效果一样 [fengkaicentos7 ~ 14:38:29]$ echo $last_name $first_name feng kai # 使用双引号保留多个空格 [fengkaicentos7 ~ 14:39:00]$ echo $last_name $first_name feng kai # 使用-和_分别对结果的影响_导致$last_name失效那如何使用_下划线呢 [fengkaicentos7 ~ 14:39:25]$ echo $last_name-$first_name feng-kai [fengkaicentos7 ~ 14:41:01]$ echo $last_name_$first_name kai # 使用{}限定变量范围这样_就不影响了 [fengkaicentos7 ~ 14:43:44]$ echo ${last_name}_$first_name feng_kai # 当前shell中所有变量 [fengkaicentos7 ~ 14:44:40]$ set ····· 有很多 ····· # set命令还会显示函数 [fengkaicentos7 ~ 14:44:40]$ set | grep first_name first_namekai # 取消变量定义 [fengkaicentos7 ~ 14:45:51]$ echo $first_name kai [fengkaicentos7 ~ 14:46:33]$ unset first_name [fengkaicentos7 ~ 14:48:00]$ echo $first_name # 定义变量时候转换变量大小写 [fengkaicentos7 ~ 14:48:02]$ declare -l nameFeng [fengkaicentos7 ~ 14:48:46]$ echo $name feng [fengkaicentos7 ~ 14:48:50]$ declare -u nameFeng [fengkaicentos7 ~ 14:48:58]$ echo $name FENG2.环境变量根据变量是否是用户定义:shell 环境内置变量设置shell的运行环境。用户自定义变量字面意思用户自己定义的变量也就是普通变量。部分shell环境变量如下环境变量名作用EDITOR默认编辑器HISTFILE历史文件位置HISTFILESIZE历史命令个数HISTTIMEFORMAT历史命令时间格式PS1命令行提示符LANGshell 环境语言PATH命令搜素路径HOME当前用户家目录USER当前用户PWD当前shell路径完整的shell 环境变量参考bash1。2.1 EDITOR注意权限[rootcentos7 /etc 14:52:38]# visudo # 以上命令默认使用vi 编辑文件/etc/sudoers不显示语法高亮[rootcentos7 /etc 14:55:33]# export EDITOR/bin/vim # 或者 [rootcentos7 /etc 14:56:03]# EDITOR/bin/vim vim vimdiff vimtutor [rootcentos7 /etc 14:56:03]# EDITOR/bin/vim visudo # 以上命令使用vim 编辑文件/etc/sudoers显示语法高亮2.2 LANG注意权限# 由中文切换为英文显示时间 [rootcentos7 /etc 14:56:58]# date 2026年 07月 17日 星期五 14:57:52 CST [rootcentos7 /etc 14:57:52]# export LANGen_US.utf8 [rootcentos7 /etc 14:58:17]# date Fri Jul 17 14:58:20 CST 2026 # 由英文切换为中文显示时间 [rootcentos7 /etc 14:58:20]# export LANGzh_CN.utf8 [rootcentos7 /etc 14:59:30]# date 2026年 07月 17日 星期五 14:59:31 CST常见 LANG代码英语en_US.utf8简体中文zh_CN.utf8繁体中文zh_TW.utf82.3 PATH注意权限# 查看系统命令的路径 [rootcentos7 /etc 15:03:28]# echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/fengkai/.local/bin:/home/fengkai/bin # 将ls的系统命令转移到当前文件下面要注意当前文件是/etccd到初始目录下 [rootcentos7 /etc 15:09:01]# cd [rootcentos7 ~ 15:03:37]# mv /usr/bin/ls . [rootcentos7 ~ 15:05:14]# ls bash: ls: 未找到命令... 相似命令是 lz # 我们刚刚把ls移动到了/root的根目录下通过/root/ls可以执行ls命令查看 [rootcentos7 ~ 15:09:05]# /root/ls anaconda-ks.cfg ls 公共 视频 文档 音乐 initial-setup-ks.cfg test.txt 模板 图片 下载 桌面 # 看不到ls的位置 [rootcentos7 ~ 15:12:52]# which ls alias lsls --colorauto # 将/root目录追加到PATH中并查看当前的PATH对比之前的多了/root这样ls就可以执行了,which也找到了对应的位置 [rootcentos7 ~ 15:13:12]# export PATH$PATH:/root [rootcentos7 ~ 15:14:25]# ls anaconda-ks.cfg ls 公共 视频 文档 音乐 initial-setup-ks.cfg test.txt 模板 图片 下载 桌面 [rootcentos7 ~ 15:14:28]# echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/fengkai/.local/bin:/home/fengkai/bin:/root [rootcentos7 ~ 15:14:44]# which ls alias lsls --colorauto /root/ls # 将ls移动到原来 [rootcentos7 ~ 15:17:41]# mv ./ls /usr/bin [rootcentos7 ~ 15:17:45]# which ls alias lsls --colorauto /usr/bin/ls2.4 PS1注意权限[fengkaicentos7 ~]$ echo $PS1 [\u\h \W]\$ [fengkaicentos7 ~]$ man bash man bash 搜索PROMPTING # 扩展说明 \h 主机名第一个 . 之前的部分 \H 主机名 \n 新行符 \t 当前时间采用 24小时制的 HH:MM:SS 格式 \T 当前时间采用 12小时制的 HH:MM:SS 格式 \ 当前时间采用 12小时制上午/下午 (am/pm) 格式 \A 当前时间采用 24小时制上午/下午格式 \u 当前用户的用户名 the username of the current user \w 当前工作目录 \W 当前工作目录的基本部分 \$ 如果有效 UID 是 0就是 #, 其他情况下是 $ # 提示符由[fengkaicentos7 ~]$变为了hello [fengkaicentos7 ~]$ PS1hello hello # 敲如下命令提示符又恢复回来了 PS1[\u\h \W \t]\$ [fengkaicentos7 ~ 16:06:35]$ # 显示完整工作目录 [fengkaicentos7 ~ 16:08:16]$ PS1[\u\h \w \t]\$ [fengkaicentos7 ~ 16:08:20]$ cd /usr/share/doc [fengkaicentos7 /usr/share/doc 16:08:29]$彩色提示符# 代码 # \[\e[0;30m\]黑色 # \[\e[0;31m\]红色 # \[\e[0;32m\]绿色 # \[\e[0;33m\]黄色 # \[\e[0;34m\]蓝色 # \[\e[0;35m\]紫色 # \[\e[0;36m\]青色 # \[\e[0;37m\]白色 # \[\e[0m\]恢复默认颜色示例# root权限下vim /etc/bashrc 文件末尾添加一行 [rootcentos7 fengkai]# vim /etc/bashrc PS1[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]\[\e[0m\]\[\e[92;1m\]\h\[\e[0m\]\[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\$\[\e[0m\] # 或者 echo 追加 echo PS1[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]\[\e[0m\]\[\e[92;1m\]\h\[\e[0m\]\[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\\\$\[\e[0m\] /etc/bashrc # 注意 echo追加的PS1与直接vim的是不一致的体现在\\\$。推出登陆并重新连接之后提示符就有颜色显示了2.5 HISTTIMEFORMAT控制历史命令时间格式。通过设置该变量可以在执行history命令时显示每条历史命令的执行时间。常用配置示例上图最后的一行就是HISTTIMEFORMAT%F %T 显示年月日时分秒如2024-10-24 15:30:45bash export HISTTIMEFORMAT%F %T 效果history输出会类似1000 2024-10-24 15:30:45 ls -l显示更简洁的时间格式如10-24 15:30bash export HISTTIMEFORMAT%m-%d %H:%M HISTTIMEFORMAT支持的常见时间格式符%F完整日期年 - 月 - 日如2024-10-24%T完整时间时分: 秒如15:30:45%Y四位年份如2024%m两位月份01-12%d两位日期01-31%H24 小时制小时00-23%M分钟00-59%S秒00-593.变量持久化保存login shell 启动的时候会按顺序加载以下配置文件中配置 1. /etc/profie限定所有用户设置操作系统级别。 2. \~/.bash_profile只限定特定用户 3. ~/.bashrc只限定特定用户 4. /etc/bashrc限定所有用户nologin shell启动的时候会按顺序加载以下配置文件中配置 1. ~/.bashrc只限定特定用户例如限定laoma用户 /home/laoma/.bashrc。 2. /etc/bashrc限定所有用户# login shell 示例 [rootcentos7 fengkai 16:34:14]# echo export LANGen_US.utf8 /etc/profile # 验证 Connecting to 10.1.8.10:22... Connection established. To escape to local shell, press CtrlAlt]. Last login: Fri Jul 17 16:32:35 2026 from 10.1.8.1 # nologin shell 示例 [rootcentos7 fengkai 16:46:35]# echo export EDITORvim /etc/bashrc # 验证 [fengkaicentos7 ~ 16:50:49]$ bash [fengkaicentos7 ~ 16:53:19]$ echo $EDITOR vim4.命令替换格式如下$(COMMAND)COMMAND效果如下# 查看星期几 [fengkaicentos7 ~ 16:59:12]$ echo Today is date %A Today is 星期五 # 查看现在的时间 [fengkaicentos7 ~ 16:59:15]$ echo The time is $(date %M) minutes past $(date %l%p). The time is 59 minutes past 4下午 #新建一个带日期的文件 [fengkaicentos7 ~ 17:00:01]$ touch file-$(date %Y%m%d) # 或者 [fengkaicentos7 ~ 17:00:17]$ touch file-date %Y%m%d [fengkaicentos7 ~ 17:00:27]$ ls allinone file- file-3 passwd.list profile.sh 视频 音乐 bashrc file-1 file.tar passwd.man testfile 图片 桌面 dhcpd.conf file-2 passwd2.list passwd.stdout 公共 文档 ext4.man file-20260717 passwd.all profile 模板 下载如何计算 12..99100的值# 计算数值 [fengkaicentos7 ~ 17:00:28]$ echo $[123] 6 # 获取序列 [fengkaicentos7 ~ 17:03:59]$ echo {1..3} 1 2 3 # 替换空格为号 [fengkaicentos7 ~ 17:04:17]$ echo {1..3} | tr 123 # 计算结果直接带入会出现错误需要用$()将上面的命令填入 [fengkaicentos7 ~ 17:04:35]$ echo $[echo {1..3} | tr ] -bash: echo 1 | tr : 表达式中有语法错误 错误符号是 1 | tr [fengkaicentos7 ~ 17:05:32]$ echo $[$(echo {1..3} | tr )] 6 [fengkaicentos7 ~ 17:05:48]$ echo $[$(echo {1..100} | tr )] 50505.保留字符字面含义许多字符在bash中有特殊的意义忽略这些含义使用引号和转义字符。\取消后面单个字符的特殊含义。双引号()压缩shell扩展含义不压缩命令替换、变量替换和转义字符\。单引号()可以压缩单引号内部的所有字符含义。# \ 示例将$PATH直接输出 [fengkaicentos7 ~ 17:05:57]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/fengkai/.local/bin:/home/fengkai/bin [fengkaicentos7 ~ 17:08:12]$ echo \$PATH $PATH # 示例不加*会将所有文件显示两次加上就会正常 [fengkaicentos7 ~ 17:11:05]$ usernamefengkai [fengkaicentos7 ~ 17:12:30]$ echo * welcome $username to my home on $(date %F) * bashrc dhcpd.conf 公共 模板 视频 图片 文档 下载 音乐 桌面 welcome fengkai to my home on 2026-07-17 bashrc dhcpd.conf 公共 模板 视频 图片 文档 下载 音乐 桌面 [fengkaicentos7 ~ 17:12:34]$ echo * welcome $username to my home on $(date %F) * * welcome fengkai to my home on 2026-07-17 * # \和 示例将$username直接输出 [fengkaicentos7 ~ 17:13:19]$ echo * welcome \$username to my home on $(date %F) * * welcome $username to my home on 2026-07-17 * # 示例不论加不加\$username直接输出加了\连同\一起输出 [fengkaicentos7 ~ 17:13:52]$ echo * welcome $username to my home on $(date %F) * * welcome $username to my home on $(date %F) * [fengkaicentos7 ~ 17:14:24]$ echo * welcome \$username to my home on $(date %F) * * welcome \$username to my home on $(date %F) *思考# 下面命令的输出 [fengkaicentos7 ~ 17:17:54]$ echo \ [fengkaicentos7 ~ 17:17:45]$ echo \\ \ # 最终输出一个 \ 符号 [laomacentos7 ~]$ echo \\\ # 最终输出一个 \ 符号 [fengkaicentos7 ~ 17:18:27]$ echo \\\\ \\ ## 最终输出一个 \\ 符号 # 下面命令的输出Let\为一段s go为一段加起来如下显示 [fengkaicentos7 ~ 17:19:28]$ echo Let\s go Let\s go # 使用 echo 一次性在文件中输入多行字符串 [fengkaicentos7 ~ 17:20:41]$ echo hello1 hello2 hello3hello.txt [fengkaicentos7 ~ 17:22:46]$ cat hello.txt hello1 hello2 hello36.综合练习1.变量名规范。Linux 使用变量临时字符串值便于后续引用。变量值存储在当前会话内存中。变量名只能包含字母、数字、下划线。变量名不能以数字开头。2.变量如何定义和查看举例说明。定义变量xxxxxxfengkai查看变量xxxecho $xxx3.如何扩展变量范围举例说明。echo $xxx $yyy4.解释以下环境变量作用举例说明。 - EDITOR - PS1 - LANG - PATHEDITOR:设置编辑器通过visudo命令设置显示是否高亮PS1:命令提示符设置通过PS1[\u\w\t....参数]还可以设置颜色LANG:系统语言选择主要为英文和中文PATH:主要是系统命令的相关路径5.命令替换作用举例说明。主要为$(xxx)和xxx两种echoe $(date %A)或者date %A6.解释以下符号作用举例说明。 - 转义符号\ - 双引号 - 单引号\符号取消后面单个字符的特殊含义举例:echo $PATH显示系统命令的路径echo \$PATh显示为$PATH符号:压缩shell扩展含义不压缩命令替换、变量替换和转义字符\举例:echo * \$PATH显示为* $PATH*被压缩显示\没有符号:可以压缩单引号内部的所有字符含义举例:echo * \$PATH显示为* \$PATH*和\都被压缩显示出来了