前言:操作系统就是一组软件,控制着整个硬件与管理系统的活动监测,为了这组软件不被用户错误地使用,导致系统崩溃,就将shell作为用户操作系统的一个接口,通过shell来操作系统,就可以降低用户直接操作系统导致系统崩溃的可能性;
shell就是接收用户的输入命令,并将接收到的命令传递给内核,由内核实现命令,控制硬件完成命令所实现的功能;
bash是Linux默认的shell,其优点有:
1)命令记忆功能:可以通过上下键找到前一个或后一个输入的命令;
2)命令与文件补全功能:使用Tab键可以将命令补全或将文件名补全,连续按两次Tab键可以将所有可能的输入列出;
3)命令别名设置功能:可以通过alias命令为常用的命令设置简单的别名;
4)作业控制、前台以及后台控制;
5)程序脚本:可以通过shell提供的环境变量以及相关命令进行脚本的设计;
6)通配符:可以使用通配符进行范围查找;
bash shell的内置命令:type
type命令用于查询给定的执行文件是否为bash的内置命令;
一、shell中的变量
1. 变量的用途:利用变量的可变性来编写脚本
2. 变量的显式与设置
1)变量的显式:使用echo命令可以进行变量值的输出,格式为:echo $变量 或 echo ${变量};
2)变量的设置:使用等号直接进行变量的设置,格式为:变量名=变量值
变量的设置规则:
①等号两边不可以直接接空格;
②变量值中不可以出现空格,
③变量名只能包含数字和字母,但是只能以字母开头;
④变量值中如果有空格,必须以单引号或双引号将变量值包含;
⑤变量值中如果使用到其他变量的值,则必须使用双引号将变量值包含;
⑥在变量值中使用其他命令的输出时,需要使用反单引号``将命令包含或者使用$(命令)进行设置,如cd /lib/modules/`uname -r`/kernel;
⑦如果想为变量增加内容,那么通过$变量名或${变量名}累加内容;
⑧如果想让当前进程中的变量可以被其他进程使用,那么使用export命令使该变量称为环境变量;如export PATH;
个人习惯:将变量的值直接用双引号括起来,不管是否使用命令或其他变量;
3)变量的取消:使用unset命令可以取消已设置的变量,格式为unset 变量名;
4)环境变量
①查看环境变量的命令:env以及export;查看所有变量的命令:set;
②常见环境变量:
HOME:代表当前用户的主文件夹;、
SHELL:代表当前环境使用的shell的版本;
HISTSIZE:历史命令的条数;
MAIL:当前用户的邮件信箱文件;
PATH:执行文件查找的路径,目录与目录之间使用冒号(:)进行分隔;
LANG:语系;
RANDOM:随机数生成器;
③常见的变量:
$:代表当前shell的线程代号(PID);
?:代表上一次执行命令所回传的值;
PS1:代表提示符;
OSTYPE、HOSTTYPE、MACHTYPE:与主机硬件和内核的等级相关的变量;
④与变量有关的命令:read、array、declare
read:用于读取用户在键盘上的输入;格式为:read [-pt] 变量
declare/typeset:声明变量的类型;格式为:declare [-aixr] 变量
array:设置的格式为:var[index] = content;读取的格式为:echo ${var[index]};其中var是数组名,index是下标,从0开始,content是元素的值;
⑤变量内容的删除、替代与替换
从前向后删除的格式:${变量名#关键字},删除最短的符合关键字的部分;
${变量名##关键字},删除最长的符合关键字的部分;
从后向前删除的格式:${变量名%关键字},删除最短的符合关键字的部分;
${变量名%%关键字},删除最长的符合关键字的部分;
变量内容替换的格式:新变量名=${旧变量名-新的变量值};#如果变量已经被设置过,则无法通过这种方式进行内容的替换;
变量内容替换的格式2:新变量名=${旧变量名:-新的变量值};#无论变量是否被设置过,都可以对其进行内容的替换;
二、shell中的命令
1. 命令别名设置:alias以及unalias;使用示例:alias lm='ls -l | more'; unalias lm;
注意:一定要使用单引号包含待设置别名的命令;
2. 历史命令:history
三、Bash shell的操作环境
1. 路径与命令查找顺序
①以相对/绝对路径执行命令,例如“/bin/ls”或“./ls”;
②由alias找到该命令来执行;
③由bash内置的(builtin)命令来执行;
④通过$PATH这个变量的顺序找到的第一个命令找到的第一个命令来执行;
2. bash的登录与欢迎信息:/etc/issue,/etc/motd
3. bash的环境配置文件
①login shell与non-login shell:重点在于有没有登录,不需要输入账号密码就可以进入的bash称为non-login shell,反之,称为login shell;
②login shell读取的两个配置文件:/etc/profile以及/etc/inputrc
/etc/profile(login shell才会读取):所有登录的用户取得bash时都会读取这个配置文件,如果需要为所有用户设置登录环境,那么修改这个文件即可,但是一般不建议随便修改这个文件;文件中设置的变量主要有:PATH(依据UID决定PATH变量是否包含sbin的系统命令目录)、MAIL(依据账号设置好用户的mailbox到/var/spool/mail/账号名)、USER()、HOSTNAME以及HISTSIZE;除了可以设置这些变量之外,/etc/profile文件还会调用其他的配置文件,使得bash操作接口变得非常友善;
~/.bash_profile(login shell才会读取):bash在读完整体环境设置的/etc/profile并借此调用其他配置文件后,接着就会读取用户的个人配置文件;在login shell的配置环境中,所读取的个人偏好设置文件有: ~/.bash_profile,~/.bash_login以及~/.profile;注意,这三个文件只会被读取一个,也就是说,但此顺序进行读取,只读取一个配置文件;
③读入环境配置文件的命令:source 或 .
一般情况下,修改完上述由login shell读取的两个配置文件后,都需要注销再登录才能使配置文件的更改生效;但是,使用source命令就可以不需要注销,直接使更改生效;
命令使用格式:source 配置文件名 或 . 配置文件名
四、数据流重定向
1. 数据流重定向可以将命令的输出保存到文件或设备中;
2. 标准输入:代码为0,使用的符号是<或<<;
标准输出:代码为1,使用的符号是>或>>;
标准错误输出:代码为2,使用的符号是2>或2>>;
使用一个方向符(>)和使用两个方向符(>>)的区别:使用一个方向符,会覆盖原来文件中的内容,使用两个方向符,会在原有文件内容后追加内容;
3. /dev/null 垃圾桶黑洞设备与特殊写法
将输出的数据重定向到/dev/null中,则这部分数据就被回收掉,既没有保存,也没有显示;
4. 2>&1可以同时将错误信息和正确信息保存到同一个文件或设备中;
5. 输入>以及>>的用法:
示例:
cat > tempfile #此命令使得用户可以通过键盘输入文件内容,如果tempfile文件不存在,会新建该文件;
cat > tempfile < exitfile #将已有文件exitfile中的内容输入到文件tempfile中;
同样地,>和>>的区别在于:一个是将文件中的内容复制到文件中,一个是将后面的标志作为结束标志符,但是,还是由键盘输入;
6. 相关的命令执行判断运算: ; && ||
; 就是将一组命令放在一次执行;如cmd1; cmd2; cmd3
&& 就是前面命令执行成功才会执行后面命令,否则,后面的命令不执行;如cmd1 && cmd2
|| 就是前面的命令执行不成功才会执行后面命令,否则,不执行后面的命令;如cmd1 || cmd2
总地来说,这三种运算符都是基于每一个命令的执行都会有一个回传值,依据前一个命令的回传值结合具体的连接运算符号来判定是否执行后面的命令;
五、管道命令
管道命令“|”仅能够处理经由前面一个命令传来的正确信息,即standard output的信息,对于standard error并没有直接处理的能力;
每一个管道的第一个数据必定是一个命令,并且这个命令必须能够接受前一个管道的输出,这样的命令才是管道命令,比如less、more、head、tail等;
总之,管道命令必须要注意的地方:
①管道命令仅会处理正确输出的信息,错误的输出信息会被忽略;
②管道命令必须能够接收来自前一个命令的数据,并将其作为standard input继续处理;
常用的管道命令:
1. 选取命令:cut、grep;#选取命令是针对“行”进行分析的;
cut:处理的信息是以“行”为单位的;将输入信息的某一段切出来;
命令使用格式:cut -d '分隔符' -f fields 或 cut -c 字符范围
使用示例如下图所示:
grep:与cut不同的是,cut是从每一行中选取想要的部分,而grep是选取想要的行;
命令使用格式:grep [-acinv] [--color=auto] '查找字符串' filename
使用示例:last | grep 'root' #找出出现root的行
last | grep -v 'root' #找出没有出现root的行
last | grep 'root' | cur -d ' ' -f 1 #找出出现root的行中以空格为分隔符的第一个部分
2. 排序命令:sort、wc、uniq
sort:依据不同的数据类型对数据进行排序;
一般格式:sort [-fbMnrtuk] [file or stdin]
其中,-n是按照纯数字进行排序,-t代表分隔符,-k按照哪个区间进行排序
uniq:取出重复的数据,对于重复的数据只显示其中的一个;
一般格式:uniq [-ic]
其中,-i代表忽略大小写字符的不同,-c表示进行计数;
wc:帮助计算输出的信息的整体数据,如多少个字,多少行,多少字符等;
一般格式:wc [-lwm]
其中,-l表示仅列出行数,-w表示仅列出子树,-m表示仅列出字符数;
3. 双向重定向:tee
tee:用于将输出的数据流既可以输出到屏幕,又可以输出到文件或设备;
一般格式:tee [-a] file
其中,-a代表以追加的方式添加数据到指定的文件中或设备中,即file;
4. 字符转换命令:tr,join,paste,expand
tr:用于删除一段信息当中的文字,或者是进行文字信息的替换;
一般格式:tr [-ds] set1 ...
其中,-d代表删除信息当中set1这个字符串,-s代表替换掉重复的字符;
join:处理两个文件之间的数据,常用于处理具有相关性的文件;
一般格式:join [-ti12] file1 file2
paste:直接将文件的对应行贴在一起,并且中间以tab键隔开;
一般格式:paste [-d] file1 file2
expand:将Tab键转成空格键;
一般格式:expand [-t] file
5. 切割命令:split:将一个大文件依据文件大小或行数切割成小文件;
一般格式:split [-bl] file PREFIX
使用示例:
split -b 300k /etc/tempcap termcap #将文件按照300k大小分割并存放于文件名以termcap开头的文件中
cat termcap* >> termcapback #将文件合并为文件名为termcapback的文件
6. 管道命令中减号的用途
在管道命令中,可以通过利用减号"-"来代替stdin和stdout;