linux 命令入门

04-shell 基础

读完这篇你能:写一个带变量和判断的 shell 脚本,并知道环境变量该配在哪。

前置:linux 常用命令。约 45 分钟。

shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

shell脚本的执行方式

echo输出命令

echo [选项] [输出内容]

  • -e 支持转义字符

第一个脚本

vi hello.sh
#!/bin/bash
#The first program

echo "hello word"

#!/bin/bash是标记下方书写内容是shell脚本用的

Bash基本功能

历史命令与命令补全

History [选项] [历史命令保存文件]

  • -c 清空历史命令
  • -w 把缓存中的历史命令写入历史命令文件~/.bash_history

历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改

shell-历史命令

命令别名

指定命令别名alias 别名='原命令'

查询命令别名alias

删除别名 unalias 别名

命令执行时顺序

  • 第一顺位执行绝对路径或相对路径的命令
  • 第二顺位执行别名
  • 第三顺位执行Bash的内部命令
  • 第四顺位按照环境变量定义顺序

以上顺序其实是对应着配置文件的加载顺序,给定命令路径当然是执行路径的命令了。不给定的,就是按照配置文件的配置执行。详见,环境变量配置文件作用

常用快捷键

快捷键 作用
ctrl+a 把光标移动到命令行开头
ctrl+e 把光标一定到命令行结尾
ctrl+c 终止当前命令
ctrl+l 清屏
ctrl+u 删除或剪切光标之前的命令
ctrl+k 删除或剪切光标之后的命令
ctrl+y 粘贴剪切的命令
ctrl+r 在历史命令中搜索,按下ctrl+r后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+d 退出当前终端
ctrl+z 暂停,并放入后台
ctrl+s 暂停屏幕输出
ctrl+q 恢复屏幕输出

输入输出重定向

标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdino 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

输出重定向

类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
命令 » 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中  
标准错误输出重定向 错误命令 2> 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误命令 2» 文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中  
正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确的输出和错误的输出都保存到同一个文件当中
命令 » 文件 2>&1 以追加的方式,把正确的输出和错误的输出都保存到同一个文件当中  
命令 &> 文件 以覆盖的方式,把正确的输出和错误的输出都保存到同一个文件当中  
命令 &» 文件 以追加的方式,把正确的输出和错误的输出都保存到同一个文件当中  
命令» 文件a 2»文件b 把正确的输出追加到文件a中,把错误的输出追加到文件b中  

输入重定向

wc[选项][文件名]

  • -c 统计字节数
  • -w 统计单词数
  • -l 统计行数

多命令顺序执行

多命令执行符 格式 作用
; 命令1; 命令2 多个命令顺序执行,命令之间没有任何逻辑关系
&& 命令1&& 命令2 逻辑与

当前一个命令正确执行,后一个命令才会执行
| 命令1| 命令2 逻辑或

当前一个命令执行不正确,后一个命令才会执行
$ echo 1 && echo 2 && echo 3 && echo 4
1
2
3
4
# 下边这个第二个命令有误,后边的就都不执行
$ echo 1 && ech 2 && echo 3 && echo 4
1
zsh: command not found: ech

管道符与grep

命令格式:命令1 | 命令2

命令1的正确输出会作为命令2的操作对象

grep [选项] “搜索内容” 文件名

  • -i 忽略大小写
  • -n 输出行号
  • -v 反向查找

通配符

通配符 作用
? 匹配一个任意字符
* 匹配0个或多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者a,或者是b,或者c
[-] 匹配中括号中任意一个字符。-表示一个范围。例如:[a-z]代表匹配一个小写字母。
[^] 逻辑非。表示匹配不是括号中的一个字符。例如:[^0-9]表示匹配非数字

Bash中特殊符号

通配符 作用
‘’ 单引号。在单引号中,所有特殊符号,如$和`反引号都没有特殊含义。均是字面值
”” 双引号。字符串,特殊符号会起作用。他们还是特殊符号
`` 反引号。反引号括起来的内容是系统命令,在Bash中会执行它。和$()作用一样,不过推荐使用 $(),因为反引号非常容易看错
$() 和反引号作用一样,用来引用系统命令
# 在shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如果需要调用变量name时,需要用$name的方式得到变量的值
|转义符,跟在\之后的特殊符号将失去特殊含义,变为字符面值  

Bash变量

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是”2name”则是错误的。
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用/转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含”$变量名”或用${变量名}包含。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
  • 环境变量名建议大写,便于区分。

用户自定义变量

变量定义:name=”Anthony_4926”

变量叠加:

  • aa=123
  • aa=”$aa”456
  • aa=${aa}789

环境变量

用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效

  • set,输出所有变量,包括全局变量、局部变量
  • env,只显示全局变量
  • declare,输出所有的变量,如同set
  • export,显示和设置环境变量值、
  • unset,删除变量或函数

系统常见环境变量

  • PATH:系统查找命令的路径
$ echo ${PATH}
/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
  • PS1:定义命令行前缀
\d : 代表日期
\H : 完整的主机名称
\h : 仅取主机的第一个名字
\t : 显示时间为24小时格式,如:HH:MM:SS
\T : 显示时间为12小时格式
\A : 显示时间为24小时格式:HH:MM
\u : 用户名
\v : BASH的版本信息
\w : 完整的工作目录名称
\W : 列出最后一个目录
\$ : 提示字符,如果是root时,提示符为:# ,普通用户则为:$

位置参数变量

位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到九个参数,十以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 代表命令行中所有参数的个数

$n:假设有一个脚本 my_script.sh,它接受两个参数 name 和 age。如果您在命令行中运行以下命令:

$ bash my_script.sh Alice 30

预定义变量

预定义变量 作用
$? 最后一次执行的命令的返回状态。

如果这个变量的值为0,证明上一个命令正确执行;

如果这个变量的值非0,则证明上一个命令执行不正确
$$ 当前进程的进程号PID
$! 后台运行的最后一个进程的进程号PID
$0 获取shell脚本文件名,以及脚本路径
$# 获取执行的she11脚本后面的参数总个数
$* 获取shell脚本所有参数,将所有参数当成一个字符串
$@ 获取shell脚本所有参数,将每个参数单独当成一个字符串

接收键盘输入

read [选项][变量名]

  • -p “提示信息”
  • -t 秒数。read命令会一直等待用户输入,使用此选项可以指定等待时间
  • -n 字符数。 read命令只接受指定的字符数,就会执行
  • -s 隐藏输入的数据,适用于机密信息的输入

Bash运算符

数值运算

方法一: declare

$ aa=1
$ bb=2
$ declare -i cc=${aa}+${bb}
$ echo ${cc}
3

方法二:expr或let数值运算工具

$ aa=1
$ bb=2
$ dd=$(expr ${aa} + ${bb})
$ echo dd
3

方法三:**$((运算式))** 或**$[运算式]**

$ aa=1
$ bb=2
$ ee=$((${aa} + ${bb}))
$ ff=$[${aa} + ${bb}]

变量测试与内容替换

shell-变量测试

环境变量配置文件

环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等 默认环境变量。

重新加载配置文件,使新的配置生效:

  • source 配置文件
  • . 配置文件

环境变量配置文件作用

shell-配置文件作用

/etc/profile 是一个系统级别的 Shell 配置文件,它定义了全局的环境变量和函数,对所有用户都生效

当一个新用户登录时,该文件会被自动执行,并设置一些默认的环境变量。

以下是 /etc/profile 中定义的一些常用环境变量:

  • PATH:指定系统可执行文件的路径列表。
  • HOME:指定用户的主目录路径。
  • USER:指定当前登录的用户名。
  • SHELL:指定默认的 Shell 程序。
  • LANG:指定系统的本地化语言环境。
  • DISPLAY:如果没有指定 X Window System,则为”:0”,否则为实际的 X11 显示器编号。
  • EDITOR:指定默认的文本编辑器。
  • XDG_SESSION_ID:为每个 X Window System 会话分配唯一的 ID。
  • LESSOPEN:允许在 less 命令中使用分页符。
  • PWD:显示当前工作目录的完整路径。

此外,/etc/profile 还定义了许多其他函数和变量,例如 setuid,setgid,umask 等等。这些函数和变量可以在 ~/.bashrc 或 ~/.bash_profile 等个人配置文件中进行覆盖和修改,这两个是用户的个人变量文件,仅对当前用户生效

shell内置命令

shell-内置命令

  • eval:把字符串解析成命令
  • exec:不创建子进程,执行后续命令,且执行完毕后,自动exit

shell-内置命令2


下一篇:linux 三剑客 grep sed awk——有了 shell 基础,再上文本处理三件套。