Shell基础知识
参考书籍:Ubuntu Linux 基础教程.王宏勇主编.清华大学出版社
基本概念
Shell是什么
Shell 是联系用户操作系统的命令解释器,或者称为命令行用户接口。它随时接受用户输入的命令,并把这些命令翻译成内核能够识别的形式,传递给内核,来完成用户和内核之间的沟通。
从操作系统角度来看,Shell是操作系统的最外层,负责管理用户和操作系统之间的交互。它等待用户的输入,并负责向操作系统解释用户的输入,当操作系统进行结果输出时,它再负责处理输出的结果。
Shell一般默认使用bash版本(bash是一种Shell的版本,或者说bash是一种命令行编辑器的版本),查看当前Ubuntu系统中支持哪些Shell类型:cat /etc/shells
Shell的操作
自动补齐
- 单击Tab自动补齐,多次单击Tab可切换所有满足条件选项
- 双击Tab一次性列出所有满足条件的命令
特殊字符
-
文件通配符
\*
: 匹配所有字符串,包括空串?
: 匹配单个字符[]
: 匹配括号中列出的单个字符[字符1,字符2,...]
: 匹配括号中列出的多个字符,字符间用逗号分隔[开始字符-结束字符]
: 匹配括号中的多个字符,方括号中字符表示字符范围[!字符]
:指定不匹配的字符例如:
file*
表示匹配以file开头的所有文件名字符串fil?.exe
表示匹配以fil字符开头,且以.exe结尾的,中间为任何字符的文件名字符串*[!e]
表示匹配不以e结尾的文件名字符串[a-c]*
表示匹配开头字符串范围从a~c的所有文件名字符串,例如包括a.exe, abc.c, b.dat, cat.o等 -
输入输出重定向与管道符
<
标准输入重定向,从文件中输入数据>
标准输出重定向,向文件输出数据例如:
cat >temp1
执行后,所有键盘输入都会输入到文件中,文件编写完成后用CRTL+D退出。&>
标准输出合并重定向, 将标准输出与标准错误输出合并重定向到一个文件中>>
标准输出追加重定向,将标准输出或标准错误用追加的方式重定向到一个文件中|
管道符,将前一个命令的标准输出作为后一个命令的标准输入 -
命令执行控制符
命令执行控制符号是在命令执行时,指示命令的执行实际和执行处。
;
命令的顺序执行符号,在一个命令行中可以使用多个”;“将多个命令连写在一起&&
表示逻辑与,指示Shell执行一行中的多个命令,直到某个命令失败为止||
表示逻辑或,指示Shell执行一行中的多个命令,直到某个命令成功为止&
后台执行符号,指示Shell将命令放在后台执行 -
命令替换符
""
双引号,在字符串含有空格时,用双引号把字符括起来,再进行赋值' '
单引号,将括号括起来,阻止Shell解析变量`` 单撇反引号,把执行的命令存放在变量中
-
元字符
#
注释符号$
变量引用符,访问变量的值空格是分隔符,用来分隔命令名、参数、选项等
-
转义符
\
消除后面单个字符的特殊含义
Shell变量
变量种类
环境变量:系统预定义的一组变量,用于为Shell提供有关运行环境的信息,Shell一旦启动这些变量便可使用,环境变量的作用域是整个环境。环境变量定义在Shell的配置文件中,用户可以对环境变量进行修改或重置。
内部变量:由Shell定义的一组变量,由系统提供,用户可以使用但是不可以修改。一般是用于记录当前Shell运行状态的一组信息,例如进程号等。
用户变量:用户在Shell运行过程中定义的,允许用户进行修改。
使用不带参数和选项的set
命令可以显示Shell的所有变量,但不包括内部变量。
变量作用域
本地变量:也称局部变量,如果Shell中定义的变量作用域是局部的,则仅限于本Shell,在子Shell中是不存在和不能使用的。用户变量、环境变量和内部变量都属于局部变量。
导出变量:如果想本地变量的作用域扩大,在它的子进程中也可使用该变量,则需要把该变量进行”导出“操作,使之成为导出变量。导出变量的格式为:
export 变量名 [变量名…]
变量的定义和使用
-
用户变量
变量名以字母、数字、下划线序列组成,且不能以数字开头,必须用字母或下划线开头
- 定义:
变量名=字符串
注意等号前后不能有空格 - 访问:
$name
用变量引用符访问变量 - 取消:
unset 变量名
可用
echo
变量显示变量的值 - 定义:
-
系统变量
变量 含义 $0 当前Shell程序名称 $# 传送给Shell程序的未知参数的数量 $* 调用Shell程序时传送的全部参数组成的单字符串 $? 前一个命令或函数的返回值 $$ 本程序的PID(进程ID) $! 上一个命令的PID -
环境变量
Shell的环境变量就是所有与Shell程序都会接受的参数,在Shell开始运行时就已经定义了一些和系统的工作环境有关的变量。
环境变量可由用户自定义,一般用大写字母表示。
变量 含义 HOME 用于保存注册目录的全部路径名 PATH 命令执行时所搜寻的路径,Shell将按照该路径搜索,找到第一个匹配的文件执行 UID 当前用户的标识号(ID),值为数字构成的字符串 PWD 当前工作目录的绝对路径名 PS1 主提示符,root用户的提示符为#,普通用户的提示符为$ TERM 用户终端的类型 说明:
-
用
$PWD
访问当前工作目录绝对路径十分有用,可用于Shell脚本中自动执行程序。 -
有时用户所处的位置就是可执行文件所在的目录,但是却无法执行可执行文件,这是由于
PATH
中没有保存可执行文件的路径,此时可用./myfile.exe
命令,这样就可以正常运行了。 -
查看系统中所有的环境变量:
env
-
-
变量的数值运算
Shell默认的变量类型是字符类型,如果希望对其进行数字运算,需要额外声明。
方法一:
declare -i [num=20]
注意只能定义整型数字,等号前后不能有空格。
方法二:
expr 4 - 2
注意运算符前后必须有空格,如果运算符是Shell的元字符,则必须先使用转义字符让其取消特殊含义(转义符转义时不加空格)
命令别名和历史命令
Linux支持用简单的命令别名代替长命令。
变量别名的设置
注意,如果在Shell窗口直接执行命令1-3,所设置的别名仅在本Shell中有效,退出后无效。
-
命名
alias 别名="原命令"
注意等号两边没有空格!
-
查看
alias
-
取消
unalias 别名
-
设置变量别名永久有效
gedit ~/.bashrc
在
.bashrc
文件的最后一行添加变量别名:# [virtual environment name] alias VEgeom="source /home/isaac/Desktop/virtualEnvironment/geometry.env/bin/activate"
实际使用时,替换
VEgeom
为自定义的变量别名,等号右侧的命令或路径为实际需要的命令或路径。
历史命令
-
使用键盘上下箭头
-
使用history命令
清除当前Shell的命令历史:
history -c
列出前n条命令:
history n
Shell编程基础
Shell script为一种解释性脚本语言,源程序无需在执行前转为计算机代码,只需要在每次执行时进行代码转换,一边转换代码一边执行。
#
表示注释,echo 变量名/字符串
用以显示,date
用来显示系统当前的日期和时间。
编辑和执行Shell脚本
Shell文件没有特别的后缀名,可以通过文本编辑器直接编辑,一般不能直接被执行,可使用下面三种方法执行:
-
赋予脚本可执行权限
- 在图形界面修改权限为:允许作为程序执行
- 在Shell界面使用命令:
chmod a+x 文件名
或chmod 775 文件名
修改完成后,如果脚本文件在
PATH
的搜索路径下,可以直接输入文件名运行;如果不在PATH
的搜索路径下,使用./文件名
运行脚本。 -
用对应Shell版本的解释器运行(默认为bash)
bash 文件名
-
使用Shell内部命令运行脚本
.
和source
是Shell的命令,其操作参数为文件名,这两个命令的功能是读取参数指定的文件,执行它的内容。. 文件名
或
source 文件名
注意:
.
和文件名之间存在空格。
交互式Shell脚本
Shell脚本允许交互式运行,在运行中读取用户输入的变量值。
read [-p "提示字符串"] 变量名
逻辑判断表达式
test命令可对表达式执行结果进行判断,表达式包括文件、整数、字符串,执行判断后用返回值表示判断结果,返回值为0表示判断结果为真,返回值为1表示判断结果为假。
test 表达式 或者 [ 表达式 ]
注意方括号和表达式之间要有空格;表达式中的运算符两侧也要有空格;如果运算符是元字符,需要转义。
程序结构、函数和调试
Shell脚本还支持分支结构、循环结构,定义函数等,详见参考文献。