首页 > 运维 > linux运维 > 正文

学习笔记0402----shell基础知识

爱谁谁
发布: 2025-07-13 08:46:03
原创
775人浏览过

shell基础知识预习内容1.shell介绍2.历史命令3.命令补全和别名4.通配符、输入输出重定向4.1 通配符4.2 输入输出重定向5. 管道符、作业控制5.1管道符5.2 作业控制6. 变量6.1 env查看系统常用环境变量、set可以查看系统环境变量和用户自定义的变量6.2 变量命名规则6.3变量累加6.4 设置全局变量和取消7. 环境变量配置文件7.1系统级环境变量7.2 用户级环境变量7.3 linux加载环境变量的顺序8.管道符相关的命令8.1 cut 命令截取字符串8.2 sort 排序8.3 wc 统计8.4 uniq 去重8.5 tee 重定向,并且把文件内容打印到屏幕上8.6 tr 替换字符8.7 split 将一个大文件分割成很多个小文件9.特殊符号1.环境变量2.source与exec区别预习内容1.shell介绍

1.什么是shell?

2.shell 作用详析

Shell 除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;Shell 本身也可以被其他程序调用。 由此可见,Shell 是将内核、程序和用户连接了起来。Shell 本身支持的命令并不多,但是它可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C/C++、Java、Python 等常见的编程语言并没有什么两样。Shell 虽然没有 C/C++、Java、Python 等强大,但也支持了基本的编程元素,例如: if…else 选择结构,switch…case 开关语句,for、while、until 循环;变量、数组、字符串、注释、加减乘除、逻辑运算等概念;函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、一键搭建Web开发环境、日志分析等,Shell 都非常合适。

3.常见的shell类型有 sh、bash、csh、tcsh、ash 等。

常见的 Shell

sh sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。 sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。 csh sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。 Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。 BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。 tcsh tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。 ash 一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。 bash bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。 bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。 bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。 尽管如此,bash 和 sh 还是有一些不同之处: 一方面,bash 扩展了一些命令和参数; 另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。 2.历史命令

1.history 查询历史命令

学习笔记0402----shell基础知识

2.history的命令存储的文件~/.bash_histroy

学习笔记0402----shell基础知识

3.修改系统默认的存储历史命令的条数

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识

4.设定history命令显示时间

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识

5.历史命令的调用

使用上下箭头调用以前的历史命令使用 !n 重复执行第n条历史命令使用 !! , !-1 重复执行上一条命令 Ctrl+p+enter亦可使用 !ls 重复执行最后一条以ls开头的命令3.命令补全和别名

1.tab键补全命令:在输入命令的时候,输入命令的一部分,可以按两下tab键补全命令

centos6 可以使用tab键补全命令,不支持补全选项;centos7 也可以使用tab键补全命令,也支持补全选项,但是需要安装一个bash-completion的包,安装完成后需要重启。
学习笔记0402----shell基础知识

2.自定义别名

学习笔记0402----shell基础知识

3.别名的配置文件:~/bash.rc 和 /etc/profile.d/

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识

4.取消别名

学习笔记0402----shell基础知识
4.通配符、输入输出重定向4.1 通配符

符号

作用

*

匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个)

匹配任何一个字符(不在括号内时)?代表任意1个字符

[abcd]

匹配abcd中任何一个字符

[a-z]

表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符

{…}

表示生成序列. 以逗号分隔,且不能有空格

[!abcd]或[^abcd]

表示非,表示不匹配括号里面的任何一个字符

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
4.2 输入输出重定向

符号

作用

>

正确输出重定向

>>

正确追加输出重定向

2>

错误输出重定向

2>>

错误追加输出重定向

&>

不管正确与否,输出重定向

&>>

不管正确与否,追加输出重定向

输入重定向

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
5. 管道符、作业控制5.1管道符

符号

作用

|

把前面命令的结果给后面的命令

Get笔记
Get笔记

Get笔记,一款AI驱动的知识管理产品

Get笔记 125
查看详情 Get笔记
学习笔记0402----shell基础知识
5.2 作业控制

命令

作用

ctrl+c

发送SIGINT信号,终止一个进程。

ctrl+z

发送SIGSTOP信号,挂起一个进程,将作业放置到后台(暂停状态)。与此同时,可以通过fg重启前台被中断的任务,也可以通过bg把中断的任务放到后台执行。

jobs

查看当前有多少在后台运行的命令

fg

将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

bg

将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

命令+&

这个用在一个命令的最后,可以把这个命令放到后台执行

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
6. 变量6.1 env查看系统常用环境变量、set可以查看系统环境变量和用户自定义的变量代码语言:javascript代码运行次数:0运行复制
<code class="javascript">## 获取系统变量 ##[root@linux-01 ceshi]# envXDG_SESSION_ID=1HOSTNAME=linux-01SELINUX_ROLE_REQUESTED=TERM=xtermSHELL=/bin/bashHISTSIZE=5000SSH_CLIENT=192.168.141.1 57215 22SELINUX_USE_CURRENT_RANGE=SSH_TTY=/dev/pts/0USER=rootLS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:MAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/binPWD=/root/ceshiLANG=zh_CN.UTF-8SELINUX_LEVEL_REQUESTED=HISTCONTROL=ignoredupsSHLVL=1HOME=/rootLOGNAME=rootSSH_CONNECTION=192.168.141.1 57215 192.168.141.128 22LESSOPEN=||/usr/bin/lesspipe.sh %sXDG_RUNTIME_DIR=/run/user/0HISTTIMEFORMAT=%y/%m/%d %H:%M:%S _=/usr/bin/envOLDPWD=/root[root@linux-01 ceshi]# </code>
登录后复制
6.2 变量命名规则Shell变量命名规则 变量名必须是以字母或下划线字符“_”开头,后面跟字母、数字或下划线字符。不要使用?、*或其他特殊字符命名你的变量。注意: 变量名和等号之间不能有空格; 首个字符必须为字母(a-z A-Z) 中间不能有空格,可以是下划线 不能使用标点符号 不能使用bash里的关键字6.3变量累加
学习笔记0402----shell基础知识
6.4 设置全局变量和取消
学习笔记0402----shell基础知识
7. 环境变量配置文件系统级环境变量:每一个登录到系统的用户都能够读取到系统级的环境变量用户级环境变量:每一个登录到系统的用户只能够读取属于自己的用户级的环境变量7.1系统级环境变量7.2 用户级环境变量7.3 linux加载环境变量的顺序首先启动 /etc/profile文件然后再启动用户目录下的 ~/.bash_profile、 /.bash_login或/.profile文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。代码语言:javascript代码运行次数:0运行复制
<code class="javascript">==>  /etc/profile==> ~/.bash_profile | ~/.bash_login | ~/.profile==> ~/.bashrc==> /etc/bashrc==> ~/.bash_logout</code>
登录后复制
8.管道符相关的命令8.1 cut 命令截取字符串代码语言:javascript代码运行次数:0运行复制
<code class="javascript">参数-b:仅显示行中指定直接范围的内容;-c:仅显示行中指定范围的字符;-d:指定字段的分隔符,默认的字段分隔符为“TAB”;-f:显示指定字段的内容;-n:与“-b”选项连用,不分割多字节字符;--complement:补足被选择的字节、字符或字段;--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;--help:显示指令的帮助信息;--version:显示指令的版本信息。</code>
登录后复制
学习笔记0402----shell基础知识
8.2 sort 排序代码语言:javascript代码运行次数:0运行复制
<code class="javascript">参数-b   忽略每行前面开始出的空格字符。-c   检查文件是否已经按照顺序排序。-d   排序时,处理英文字母、数字及空格字符外,忽略其他的字符。-f   排序时,将小写字母视为大写字母。-i   排序时,除了040至176之间的ASCII字符外,忽略其他的字符。-m   将几个排序好的文件进行合并。-M   将前面3个字母依照月份的缩写进行排序。-n   依照数值的大小排序,字母特殊符号默认为0 -o<输出文件>   将排序后的结果存入指定的文件。-r   以相反的顺序来排序。-t <分隔字符>   指定排序时所用的栏位分隔字符。+<起始栏位>-<结束栏位>   以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。--help   显示帮助。--version   显示版本信息</code>
登录后复制
学习笔记0402----shell基础知识
8.3 wc 统计代码语言:javascript代码运行次数:0运行复制
<code class="javascript">参数-c 统计字节数。-l 统计行数。-m 统计字符数。这个标志不能与 -c 标志一起使用。-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。-L 打印最长行的长度。-help 显示帮助信息--version 显示版本信息</code>
登录后复制
学习笔记0402----shell基础知识
8.4 uniq 去重代码语言:javascript代码运行次数:0运行复制
<code class="javascript">参数-c, --count           在每行前加上表示相应行目出现次数的前缀编号-d, --repeated        只输出重复的行-D, --all-repeated[=delimit-method    显示所有重复的行                        delimit-method={none(default),prepend,separate}                        以空行为界限-f, --skip-fields=N   比较时跳过前N 列-i, --ignore-case     在比较的时候不区分大小写-s, --skip-chars=N    比较时跳过前N 个字符-u, --unique          只显示唯一的行-z, --zero-terminated 使用'\0'作为行结束符,而不是新换行-w, --check-chars=N   对每行第N 个字符以后的内容不作对照--help            显示此帮助信息并退出</code>
登录后复制
学习笔记0402----shell基础知识
8.5 tee 重定向,并且把文件内容打印到屏幕上代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[root@localhost tmp]# cat /etc/passwd | cut -d ':' -f 7 | uniq -c | tee /tmp/1.txt      1 /bin/bash      4 /sbin/nologin      1 /bin/sync      1 /sbin/shutdown      1 /sbin/halt     11 /sbin/nologin     53 /bin/bash      1 /sbin/nologin      1 /bin/bash      2 /sbin/nologin      2 /bin/bash      1 /sbin/nologin     15 /bin/bash      1 /sbin/nologin      9 /bin/bash[root@localhost tmp]# cat 1.txt      1 /bin/bash      4 /sbin/nologin      1 /bin/sync      1 /sbin/shutdown      1 /sbin/halt     11 /sbin/nologin     53 /bin/bash      1 /sbin/nologin      1 /bin/bash      2 /sbin/nologin      2 /bin/bash      1 /sbin/nologin     15 /bin/bash      1 /sbin/nologin      9 /bin/bash[root@localhost tmp]#</code>
登录后复制
8.6 tr 替换字符

字符范围: 指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。 [a-z] a-z内的字符组成的字符串。 [A-Z] A-Z内的字符组成的字符串。 [0-9] 数字串。 \octal 一个三位的八进制数,对应有效的ASCII字符。 [On] 表示字符O重复出现指定次数n。因此[O2]匹配OO的字符串。

学习笔记0402----shell基础知识
8.7 split 将一个大文件分割成很多个小文件代码语言:javascript代码运行次数:0运行复制
<code class="javascript">参数-b:值为每一输出档案的大小,单位为 byte。-C:每一输出档中,单行的最大 byte 数。-d:使用数字作为后缀。-l:值为每一输出档的列数大小。PREFIX:代表前导符,可作为切割文件的前导文件。</code>
登录后复制
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
9.特殊符号

符号

作用

*

匹配多个字符

匹配一个字符

#

注释

\

脱义

|

管道符

$

变量前缀

!$

组合,用在命令上表示上条命令的最后一个参数

;

多条命令写在一行,用分号分割

~

用户的家目录

&

把命令放置于后台执行

[ ]

指定字符中的一个,[a-z][0-9][a-z]

||

用于命令之间,判断逻辑或

&&

用于命令之间,判断,逻辑与

学习笔记0402----shell基础知识
学习笔记0402----shell基础知识

# 课后总结

1.环境变量/etc/profile 该文件登录操作系统时,为每个用户设置环境信息,当用户第一次登录时,该文件被执行。也就是说这个文件对每个shell都有效,用于获取系统的环境信息。~/.bash_profile, ~/.bash_login or ~/.profile profile用于登录式shell, 而bashrc用于每个交互式shell/etc/bashrc 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。也就是说,当用户shell执行了bash时,运行这个文件。~/.bashrc -该文件存储的是专属于个人bash shell的信息,当登录时以及每次打开一个新的shell时,执行这个文件。在这个文件里可以自定义用户专属的个人信息。1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。2.source与exec区别代码语言:javascript代码运行次数:0运行复制
<code class="javascript">cat 2.sh #!/bin/bashecho "children script PID is $$"echo "now to children script."export a=2echo "in children, a=$a"cat source.sh #!/bin/bashecho "fater script PID is $$"echo "fater script, set a is 1"export a=1echo "it will source ./2.sh"source ./2.shecho "now to father script."echo "fater script, a is $a"cat exec.sh #!/bin/bashecho "fater script PID is $$"echo "fater script, set a is 1"export a=1echo "it will exec ./2.sh"exec ./2.shecho "fater script, a is $a"</code>
登录后复制
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识
学习笔记0402----shell基础知识

总结:通过上面两张图,可以看出来,source.sh脚本在调用2.sh脚本时候,执行完脚本2.sh又回到了脚本source.sh,而exec.sh在调用2.sh脚本的时候,执行完2.sh脚本直接退出,并没有回到exec.sh,我们可以做这样一个小尝试,在命令模式输入exec ./2.sh ,会发现终端退出了,也可以这样理解,exec在执行脚本的时候是新开了一个bash,执行完bash直接退出,不会在回到终端。在前面学习find命令的时候有一个-exec参数,这个参数的作用是把find查找到的结果给后面的命令,那我们在这儿是不是可以这样理解,exec在前,执行脚本的这个参数是无法回到父脚本。

以上就是学习笔记0402----shell基础知识的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号