心安

Shell编程系列(一)-- Shell 基础

字数统计: 2.1k阅读时长: 7 min
2018/11/05 Share

一、Shell 概述

  • Shell是什么?
  1. Shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
  2. Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

    我们使用的用于向Linux发送命令的界面就叫做Shell。我们知道,计算机能识别的指令只有0和1,所以说不管是哪一种编程语言,它进行了多少次编译、解释、加工、最终都转化成为了0110这种类似的计算机指令。
    那么Shell充当的角色就是将我们输入的Linux命令进行解释说明,转换成为Linux内核所能够识别的指令,这样,Linux内核才能乖乖的为我们做事。
    同样的,计算机所输出的信息也是二进制数据,Shell也会将这些二进制数据转换为方便我们理解的编程语言。
    所以说,Shell的角色之一就是充当了计算机和人类之间的“翻译官”。从某种角度来讲,我们也可以将windows的操作界面称之为Shell。

二、Shell初体验-Hello World

编写我们第一个Shell脚本,在控制台(博主使用的是XShell工具),输入vim hello.sh,新建一个脚本文件并且进入编辑模式。
输入以下内容然后保存。

1
2
3
#!/bin/bash
# this is my first shell program.
echo "Hello World !"

执行命令 bash ./hello.sh,控制台打印“Hello World !”。这样我们就完成了我们第一个Shell脚本程序。
下面解释一下我们的这些代码。首先#!/bin/bash,它标识了下面的内容是标准的Shell脚本。第二行是注释,Shell的注释方式是前面加“#”。
第三行echo,是将指定内容进行输出的命令。可以理解为System.out.print();。这个脚本就是简单的进行打印输出。

三、Bash 的基本功能

  1. 命令别名与快捷键
  • 查看别名

    命令alias,系统会输出默认的一些命令所对应的的别名。
    例如,ll命令所对应的原始命令就是ls -l --color=auto

  • 设置别名

    对于某些很长的命令,我们也可以手动设置别名。命令格式为alias [别名]='原始命令'。这种设定方式不是长久生效的,当计算机重启,用户注销,这些别名就会失效。
    如果想要永久生效,就需要将别名设置到环境变量中。环境变量默认存储在当前用户的文件夹下的.bashrc文件中,输入vi ~/.bashrc,进入编辑模式,然后设置一个别名。
    保存之后退出使用别名调用命令,并没有生效,这是因为需要注销或者重启之后环境变量才会生效。想要不重启、不注销就生效。使用命令source ~/.bashrc。再次使用别名,会发现已经生效了。

  • 删除别名

    命令unalias [别名],即可删除。和设置别名一样,这个删除也不是永久生效的,重启或者注销之后就失效了。彻底删除还是需要修改环境变量文件。

  • 命令生效的顺序

    我们查看.bashrc文件可以发现alias rm='rm -i'这行代码,也就是说rm其实是rm -i的别名。那么当我们执行rm命令的时候,到底执行的是原始的rm命令,还是执行的rm -i命令呢?
    这里就牵扯到了命令的执行顺序。命令执行的顺序如下:

    1. 用绝对路径或者相对路径执行的命令。
    2. 别名。
    3. Bash的内部命令。
    4. 按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

      注意,别名执行的优先级是高于Bash内部命令以及外部命令的。$PATH所对应的命令就是外部命令,比如说,本机安装了JDK,那么$PATH就会多出一些Java相关的命令,例如java
      javac等。所以说设置别名的时候需要谨慎,否则可能导致系统某些命令被覆盖。

  • 快捷键

快捷键 描述
ctrl + c 强制终止当前命令
ctrl + l 清屏
ctrl + a 光标移动到命令行首
ctrl + e 光标移动到命令行尾
ctrl + u 从光标所在位置删除到行首
ctrl + z 把命令放入后台
ctrl + r 在历史命令中搜索
  1. 历史命令
  • 我们可以在终端输入history命令来查看执行过的历史命令。每一个用户都拥有一个用于保存自己历史命令的文件,这个文件保存在当前用户的用户目录下,名字叫.bash_history
    当我们执行一个命令之后,这个命令不会立即写入到历史命令文件中,而是暂时保存在内存中,当用户注销或者关机之后才会写入到历史命令文件中。
    我们可以通过history -w手动的将我们输入过的命令同步到历史命令文件中,也可以通过history -c命令来清空历史命令。

  • 历史命令的调用:

    1. 使用上下箭头来调用之前的历史命令
    2. 使用“!n”重复执行第N条命令。(N代表使用history命令之后出现的列表的序号值)
    3. 使用“!!”重复执行上一条命令
    4. 使用“!字符串”重复执行最后一条以该字符串开头的命令。
  1. 多命令顺序执行
  • 多命令执行顺序:

    执行顺序如下:

多命令执行符 格式 作用
; 命令1 ; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1 && 命令2 逻辑与。
当命令1正确执行,命令2才会执行。
当命令1执行不正确,则命令2不会执行
¦¦ 命令1 ¦¦ 命令2 逻辑或。
当命令1执行不正确,命令2才会执行。
当命令1正确执行,则命令2不会执行
  • 管道符

    使用方式:命令1 | 命令2,和上面的符号不同的是,管道符要求命令2必须能够操作命令1的结果。举个栗子:ps -ef这个命令是查看我们主机上面的进程。
    那么如果我们想要查看特定的进程应该如何操作呢,这时候就可以使用管道符。比如说我们想要查看名字包含“java”的进行,就可以使用ps -ef | grep java命令。
    其中ps -ef是查看进程,管道符之后grep是查找,查找包含“java”字符的进程,这样我们就能够得到全部包含“java”字符的进程。在后面Shell的学习中我们会大量的使用管道符。

  1. Shell中特殊符号
  • 通配符:
符号 作用
? 匹配一个任意字符
* 匹配0个或者n个任意字符
[] 匹配中括号中任意一个字符。
[-] 匹配中括号中任意一个字符,-代表范围。例如[0-9],就匹配数字0到9中任意一个字符
[^] 匹配不是中括号中的任意一个字符
  • 其他特殊符号
符号 作用
‘’ 单引号。在单引号中所有的特殊符号都没有特殊含义,例如“$”和“`”。
“” 双引号。在双引号中所有的特殊符号都没有特殊含义,但是“$”、“~”和“\”例外。
`` 反引号,键盘“Esc”下面那个按键。被反引号包含的内容是系统命令。
在Bash中会先执行它,他的作用和“$()”一样,推荐使用后者,因为前者容易和单引号混淆。
$() 和反引号作用一样,用来引用系统命令。
# 在Shell脚本中,用于注释。
$ 用于调用变量的值。
\ 转义符。

Shell的基础内容就介绍到这里,有疑问的同学欢迎评论或者私信我,没疑问但是想搞基的也可以联系我,虽然我很gay但是我真的不搞基。

原文作者:XinAnzzZ

原文链接:https://www.yuhangma.com/2018/linux/2018-11-05-shell-basic/

发表日期:November 5th 2018, 12:00:00 am

更新日期:September 26th 2019, 10:46:42 am

版权声明:(转载本站文章请注明作者和出处 心 安 – XinAnzzZ ,请勿用于任何商业用途)

CATALOG
  1. 1. 一、Shell 概述
  2. 2. 二、Shell初体验-Hello World
  3. 3. 三、Bash 的基本功能