一 、什么是SHELL
shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本。本节我们站在命令解释器的角度来阐述shell
二 、命令的优先级
命令分为:
==> alias
==> Compound Commands
==> function
==> build_in
==> hash
==> $PATH
==> error: command not found
alias别名:别名命令是为了简化输出给一个长参数命令的整合,别名的定义方法 alias la=‘ls -al‘ 取消别名 unalias la
buildin内部命令:是BASH自带的命令 功能简单,内部命令的帮助在builtin(1)里
外部命令:是就是一个小程序存在于/bin/ /sbin/ /usr/bin 等地方,源码安装的软件添加环境变量就应该改PATH。
三、元字符
元字符(是被shell解释的) |
||
`` |
命令替换 取命令的执行结果 |
[[email protected] ~]# ls 4.txt anaconda-ks.cfg a.txt B.txt c.txt D.txt nginx-1.10.3 [[email protected] ~]# res=`ls` #取命令的运行结果,赋值给变量res [[email protected] ~]# echo $res #查看变量res的值 4.txt anaconda-ks.cfg a.txt B.txt c.txt D.txt nginx-1.10.3 |
$ |
$ 变量取值 |
[[email protected] ~]# money=10 [[email protected] ~]# echo $money 10 [[email protected] ~]# echo 00000$money 0000010 [[email protected] ~]# echo $money0000 [[email protected] ~]# echo ${money}0000 100000 $[] 整数计算 echo $[2+3] - * / |
${} |
变量名的范围 |
|
$() |
同`` ,但它弥补了``的嵌套缺陷 |
[[email protected] ~]# res=`echo `ls`` #嵌套使用后无法达到预想的效果:取echo 一堆文件名的效果。 [[email protected] ~]# echo $res ls [[email protected] ~]# res=$(echo $(ls)) #替代方案 [[email protected] ~]# echo $res 4.txt anaconda-ks.cfg a.txt B.txt c.txt D.txt nginx-1.10.3 |
~ |
家目录 |
[[email protected] tmp]# cd ~ [[email protected] ~]# pwd /root |
! |
取非 |
[[email protected] ~]# ls /dev/sda sda sda1 sda2 [[email protected] ~]# ls /dev/sda[0123] /dev/sda1 /dev/sda2 [[email protected] ~]# ls /dev/sda[!01] /dev/sda2 |
历史命令调用 |
[[email protected] ~]# !343 hostname MiWiFi-R3-srv |
|
匹配最近一次历史命令 |
[[email protected] ~]# !ls ls /dev/sda[!01] /dev/sda2 |
|
! ls 带空格 将命令的返回值取反 |
[[email protected] ~]# echo ok ok [[email protected] ~]# echo $? #上一条命令执行的结果,0代表执行成功,非0代表执行失败 0 [[email protected] ~]# ! echo ok #将结果取反 ok [[email protected] ~]# echo $? 1 0-255之间,0则为真,非0位假 |
|
@ |
无特殊含义 |
|
# |
# 注释 |
|
% |
杀后台进程 jobs号; 取模 |
|
^ |
取非 和 ! 雷同 |
[[email protected] ~]# ls /dev/sda[^01] /dev/sda2 [[email protected] ~]# ls /dev/sda[!01] /dev/sda2 |
替换 |
[[email protected] ~]# systemctl restart network [[email protected] ~]# ^network^sshd^ systemctl restart sshd |
|
& |
后台执行 |
|
&& |
逻辑与 |
|
* |
匹配任意长度字符串;计算乘法 |
|
() |
在子进程中执行 |
[[email protected] ~]# x=1 [[email protected] ~]# (x=666) [[email protected] ~]# echo $x 1 [[email protected] ~]# [[email protected] ~]# (x=666;echo $x) 666 |
- |
减号;区间;cd - |
|
_ |
无特殊含义 |
|
+ |
加号 |
|
= |
赋值 |
|
| |
管道 |
|
|| |
逻辑或 |
|
\ |
转译 |
[[email protected] test]# echo \\ \ [[email protected] test]# echo \‘ ‘ [[email protected] test]# echo "‘" ‘ |
{} |
命令列表 ,注意括号内的开头和结尾必须是空格{ ls; cd /; } |
|
[] |
字符通配,匹配括号内之一 |
|
: |
: 空命令 真值 |
[[email protected] ~]# : [[email protected] ~]# echo $? 0 |
; |
可以接多个命令:ls;pwd;echo 123;无论对错,会一直执行到最后一条命令 |
|
“” |
"" 软引,引号中的字符有意义 |
[[email protected] test]# x=1 [[email protected] test]# echo "$x" #双引号的代表软引用,引号内特殊字符有特殊意义,比如$,``等 1 [[email protected] test]# echo ‘$x‘ #单引号代表硬引用,引号内所有字符都无特殊意义 $x |
’‘ |
‘硬引,引号中的所有字符无特殊含义 |
|
< |
< 输入重定向 |
|
> |
> 输出重定向 |
|
>> |
>> 追加 |
|
<< |
<< here document |
|
>& |
>& 合并2和1输出 |
|
, |
, 枚举分隔符 |
|
. source |
. source ; 当前目录 |
|
/ |
/ 目录分隔符 |
|
? |
? 单个字符 |
|
? 通配符:任一字符 |
||
回车 |
回车 命令执行 |
|
* |
* 通配符:任意字符 |
|
[abc] 列表项之一 |
||
[^abc] 对列表取非 也可以使用范围 [a-z] 代表aAbBcC...,[0-9]代表012345。。。 |
||
{} |
{} 循环列表 |
[[email protected] test]# touch {1..3}{a..d}.txt [[email protected] test]# ls 1a.txt 1b.txt 1c.txt 1d.txt 2a.txt 2b.txt 2c.txt 2d.txt 3a.txt 3b.txt 3c.txt |
控制变量名的范围 echo ${AB}C |