Linux的Shell
Posted chenying66
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的Shell相关的知识,希望对你有一定的参考价值。
本章节为《Linux操作系统基本原理与应用》的笔记。
- Linux将shell独立于OS核心程序之外,使得用户可以在不影响OS本身的情况下进行修改,更新版本或添加新的功能。
- OS的shell介于OS和Kernel之间,负责将user命令解释成OS可以接受的指令,然后由OS来执行这些指令,并将OS执行的结果以user可以了解的方式反馈给user。
- 在Shell中,ls命令下Tab键可以进行命令补全,shell会自动查找出最符合的命令名称。
- history命令可以查看当前的命令记录。如果要查看最近执行的命令,则可以使用history n命令,n表示需要查看的最近执行的命令的条数。同时history命令提供了一种执行命令的最快的方法,就是使用命令记录好吗,!<记录号>(感叹号)
- Linux是多用户多任务的OS,但是因为shell使用交互式模式,目前执行的命令会一直掌握系统的控制权,直到该程序结束为止,这类程序称为前台程序,但是此时shell使得个别用户无法使用Linux提供的多任务功能来增加效率,因此shell提供了后台处理功能来解决上述问题。
- 要在Linux中要执行后台程序,只要在输入命令的时候在命令后面加上&符号。此时,系统就会开始以后台的方式执行该命令,屏幕将显示该后台运行程序的进程PID,然后shell将回到命令提示符状态,以等待用户下一条命令的输入。
- 要查看目前系统中正在运行的后台程序,可以使用jobs命令。
- Linux中提供了输入(< 和<<)和输出(>和>>)的重定向功能,从而将程序的输入和输出由标准设备重定向到文件,打印机或者其他装置。<和>是改写重定向,会删除原来的文件,而<<和>>是追加重定向,即将新的内容添加到文件原来内容的后面。
使用ls命令查看文件内容,并将查看结果重定向到其他文件:ls -l ./aa > bb
使用输入重定向查看bb文件:cat < bb - 管道:将多个命令集成到一起,以执行一个较为复杂的工作,除了第一个命令和最后一个命令之外,每个命令的输入都是前一个命令的输出,而每一个命令的输出也将成为下一个命令的输入。通过**管道(|)**将多个命令集成在一起。
- 命令取代符(`)(与~在一起的符号):两个“·”包围的命令,是该命令行中首先被执行的命令。 **echo ‘date’**命令中,首先执行date命令,然后使用echo来显示date命令的输出结果。
- 命令分隔符(;):一次输入这些命令,而在命令间使用";"分隔,Linux的shell会一次解释并执行这些命令。
SHELL程序
- shell程序通过shell命令解释器解释执行,不生成二进制的可执行文件。不同的shell解释器对应的shell程序的语法也不完全相同。
- 创建和执行一个shell程序的步骤:利用文本编辑器创建脚本内容;使用chmod命令设置脚本的可执行属性;执行脚本。这是因为文本编辑器生成的脚本文件默认是没有x权限的,即不可以直接执行的,赋予权限后,脚本就可以像一般的shell命令那样被执行。
- 一个合法的shell脚本程序,以shell解释器声明开始,即在shell程序的第一行。第一行写#!/bin/bash表示实际使用的解释器。
- shell中使用的变量分为环境变量、内部变量和用户变量3类。
a. 环境变量:Linux系统环境的一部分,通常不需要用户去定义。shell使用环境变量来存储系统信息,不同的shell会有不同的环境变量及其设置的方法
b. 内部变量:由系统提供,用户不能修改它们。
c. 用户变量:用户在编写shell脚本的时候定义的,可以在shell脚本中任意使用和修改。 - export var命令可以将用户定义的变量var添加到系统变量列表中,这样就可以在定义var变量脚本以外的地方使用。
- Linux的bash中可以使用set命令来查看系统当前的环境变量及其取值。
- 如果要查看当前某个环境变量的值,可以使用echo命令,并在环境变量的前面加上$即可。环境变量PATH记录了命令执行时的默认的搜索路径,即当用户在命令提示符后输入命令时,Linux系统会按照PATH设置的路径搜索该命令,然后再执行该命令。PATH变量的值由多个路径组成,各路径之间使用“:”隔开。
- Linux启动时,Linux通过读取相应的shell配置文件来获取环境变量的值。在Linux的bash中其配置文件有全聚德配置文件,也有用户个人的配置文件。shell检查文件的顺序:/etc/profile->~ /.bashrc_profile->~/.bash->/etc/bashrc。其中/etc/的两项为全局环境变量的设置,其余两者包括了个人环境变量的设置。
在/etc/profile文件末尾会自动执行/etc/profile.d目录下的所有*.sh脚本
每个系统用户的子目录下都有一个.bashrc_profile文件,用于设置每个用户的bash环境变量,此时会添加用户主目录下的bin目录。
~ /.bashrc,与前两个文件不同,Linux系统每次用户登录bash的时候都会读取~/.bashrc文件,并重新设置该文件中定义的环境变量。而前两个文件只在系统启动的时候才读取。另外,在该文件的最后还检查/etc/bashrc文件是否存在,如果存在则转而读取并执行该文件。
/etc/bashrc,该文件中设置了系统创建文件时默认的文件存取权限的掩码umask的值和用户自定义的命令提示符PS1。 - shell中 ,变量名=值,等号两边不能存在分隔符(包括空格、制表位和回车符);
要引用一个变量时,可以采取在变量名前加一个 的 方 法 , 即 ∗ ∗ 的方法,即** 的方法,即∗∗变量名**
- shell表达式:在bash中单纯使用一个表达式作为命令或语句是错误的,而必须使用expr或let命令来指明表达式是一个运算式。
expr <表达式>,expr会先求出表达式的结果,然后送到标准输出显示
let <表达式 1> [表达式2 …],let命令会先求出表达式的值,然后赋值给一个变量,而不显示在标准输出上。
在expr命令的表达式中,若要使用数值运算则需要用空格将数字运算符和操作数分隔开;且,若表达式中的运算符是<,>,&,*,|等特殊符号,则需要使用双引号、单引号括起来,获将反斜杠\\放在这些符号前面。否则会将其作为字符串来处理。
而let命令中的多个表达式之间需要空格隔开,而表达式内部无需使用空格。 - shell中的条件判断。利用test命令或一对中括号[]包含条件测试表达式,两种方法是等价的
test cond_expr
或 [ cond_expr ],此时左右的中括号与表达式之间都必须存在空格
test -w addusers.sh 用于判断addusers.sh文件是否是可写的
echo ? 其 中 “ ? 其中“ ?其中“?”表示引用变量“?”,而变量“?”是一个特殊变量,可以返回紧邻的前驱命令的返回值。
[ -d d1 -a -w d1 ] 用于测试d1是不是目录以及是否可写
echo $? - shell控制结构。if条件测试部分一般可以是test或[]修饰的条件表达式。
then命令可以和if结构写在同一行,但是如果then命令和if结构在同一行时,then命令的前面一定要有一个分号,且分号与条件测试表达式之间用空格隔开。 - for循环
for var [ in value_list ]
do
command_list
done
- while和until的循环结构中,二者对循环体执行的条件恰恰相反。在while循环中,只有expr的值为真时,才执行do和done之间的循环体,直到expr取值为假时退出循环。而在util循环中,只有expr的值为假时,才执行do和done之间的循环体,直到expr取值为真时退出循环。
- 在bash中,函数需要先定义后使用。函数定义的格式如下:
[function] fun_name ()
command_list
函数调用的格式为:fun_name [param_1 param_2 … param_n]
函数调用时是否需要传递参数,由函数的定义和功能决定。如果函数确实需要传递参数,可以使用$0, $1, $2等,
'$0'存放的是命令行的命令名,
'$1'存放的是命令行中传递给命令的第一个参数。
'$#'为传递给命令的参数的个数。
'$*'把所有的参数作为一个整体,
'$@'把所有的参数看作是类似于字符串数组一样,可以单独访问这些参数。
函数的返回值用来给函数的调用者带回特定的变量值,shell程序中的函数也可以有返回值,使用return命令可以从函数返回值。一般函数正常结束时返回真,即0,否则返回假,即非0值。
return [expr]
expr存在,0表示程序正常结束,非0值表示程序出错。若果expr省略,则以函数的最后一条命令的执行状态作为返回值。
另外,测试函数的返回值的方法可以使用测试$?值,也可以采用直接测试命令函数的返回值的方式。
以上是关于Linux的Shell的主要内容,如果未能解决你的问题,请参考以下文章