Shell

Posted 森森2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell相关的知识,希望对你有一定的参考价值。

nginx终端就是shell

内置命令查看方式:

[root@bogon ~]# man builtin

执行文件a.sh

[root@bogon ~]# vim a.sh

[root@bogon ~]# cat a.sh

echo 12345

pwd

[root@bogon ~]# source a.sh

12345

/root

 

Source是内置命令,没有文件,不会被删除

 

命令所在的文件,如果删了这个文件,就用不了这个命令了

[root@bogon ~]# which ls

alias ls=\'ls --color=auto\'

         /usr/bin/ls

 [root@bogon ~]# rpm -qf /usr/bin/ls

coreutils-8.22-18.el7.x86_64

[root@bogon ~]#

 

定义一个函数,只要输入test,主机名就变为bogon

[root@bogon ~]# function test() { hostnamectl set-hostname bbogon;hostname;  }

[root@bogon ~]# test

bogon

[root@bogon ~]# hostnamectl set-hostname www

[root@bogon ~]# hostname

www

[root@bogon ~]# test

bogon

[root@bogon ~]# hostname

bogon

[root@bogon ~]#

 

之后会学习定义函数$name是参数 -p意思是打印

[root@bogon ~]# function test() { read -p \'please input your hostname: \' name;hostnamectl set-hostname $name;hostname;  }

[root@bogon ~]# test

please input your hostname: bogon

bogon

[root@bogon ~]# hostname

bogon

[root@bogon ~]#

 

PATH

当输入ls时,计算机PATH寻找ls文件的路径,为了提高寻找的速度,于是把常用的命令放到缓存中,用命令hash可以看到:

[root@bogon ~]# hash

命中         命令

   6         /usr/bin/hostnamectl

   8         /usr/bin/hostname

   1         /usr/bin/host

   2         /usr/bin/chmod

   1         /usr/bin/cat

   1         /usr/bin/vim

   1         /usr/bin/rpm

   1         /usr/bin/man

[root@bogon ~]#

清除hash内的命令

[root@bogon ~]# hash -r

[root@bogon ~]# hash

hash: 哈希表为空

[root@bogon ~]#

 

alias是命令的别名:

[root@bogon ~]# alias cd

-bash: alias: cd: 未找到

[root@bogon ~]# alias ls

alias ls=\'ls --color=auto\'

[root@bogon ~]#

去掉别名unalias test

[root@bogon ~]# unalias test

-bash: unalias: test: 未找到

[root@bogon ~]#

 

Compound commands:是不是if\\for\\where

 

function:函数

[root@bogon ~]# x=1

[root@bogon ~]# echo $x

1

不调用函数,用unset,命令set能看到有什么函数

[root@bogon ~]# unset x

[root@bogon ~]# echo $x

不调用test函数

[root@bogon ~]# unset test

[root@bogon ~]# test

用set查看函数,发现没有test这个函数了

[root@bogon ~]#

 

Function的优先级比内置函数高,例如如下

[root@bogon ~]# function cd() { echo 123;  }

[root@bogon ~]# cd

123

[root@bogon ~]# unset cd

[root@bogon ~]# cd

[root@bogon ~]#

Build in 是内置命令

hash是保存到缓存中,一些内置命令如cd,只要开机就在内存中

$PATH意思是到处找命令文件

如果找不到就报错error

 

元字符

元字符=命令=键盘上的特殊符号

~是家目录

[root@bogon ~]# cd ~

[root@bogon ~]# pwd

/root

[root@bogon ~]#

[root@bogon ~]# ls ~

111.txt          bb                    yum.pid  文档

22.txt           initial-setup-ks.cfg  公共     下载

aa               Python-3.5.1          模板     音乐

anaconda-ks.cfg  Python-3.5.1.tgz      视频     桌面

a.sh             rr.txt                图片

[root@bogon ~]#

/意思是文件夹下的文件

 

反引号`可以用在新建函数上,功能与$()一样,最好用$(),因为嵌套往往是错的。

[root@bogon ~]# x=`ls ~` #这个最好不要用

[root@bogon ~]# echo $x

111.txt 22.txt aa anaconda-ks.cfg a.sh bb initial-setup-ks.cfg Python-3.5.1 Python-3.5.1.tgz rr.txt yum.pid 公共 模板 视频 图片 文档 下载 音乐 桌面

[root@bogon ~]#

[root@bogon ~]# y=$(ls)

[root@bogon ~]# echo $y

111.txt 22.txt aa anaconda-ks.cfg a.sh bb initial-setup-ks.cfg Python-3.5.1 Python-3.5.1.tgz rr.txt yum.pid 公共 模板 视频 图片 文档 下载 音乐 桌面

[root@bogon ~]#

!表示取反

 

{}这样能建多个文件

[root@bogon ~]# touch {a..g}.txt

[root@bogon ~]# ls

111.txt          bb     g.txt                 公共  音乐

22.txt           b.txt  initial-setup-ks.cfg  模板  桌面

aa               c.txt  Python-3.5.1          视频

anaconda-ks.cfg  d.txt  Python-3.5.1.tgz      图片

a.sh             e.txt  rr.txt                文档

a.txt            f.txt  yum.pid               下载

[root@bogon ~]#

[]取范围内的只取一个值

[root@bogon ~]# ls [a-g].txt

a.txt  b.txt  c.txt  d.txt  e.txt  f.txt  g.txt

[root@bogon ~]#

这样可以取两个值

[root@bogon ~]# ls [a-z][a-z].txt

rr.txt

[root@bogon ~]#

[root@bogon ~]# ls [a-z][0-9][a-z].txt

aAbB这样排列的,所以a-z,除了Z外,其他都包含了。

[root@bogon ~]# touch B.txt

[root@bogon ~]# ls [a-z].txt

a.txt  b.txt  B.txt  c.txt  d.txt  e.txt  f.txt  g.txt

[root@bogon ~]#

不取数字开头的:!取反

[root@bogon ~]# ls [!0-9].txt

a.txt  B.txt  d.txt  f.txt  Z.txt

b.txt  c.txt  e.txt  g.txt

[root@bogon ~]#

!还有执行第几条命令的意思

[root@bogon ~]# !1

systemctl start nginx

echo $?=0表示上面的程序执行成功,否则不成功

[root@bogon ~]# echo 156

156

[root@bogon ~]# echo $?

0

[root@bogon ~]# 123

bash: 123: 未找到命令...

[root@bogon ~]# echo $?

127

[root@bogon ~]#

#是注释

$是参数

[root@bogon ~]# echo $[2+9]

11

[root@bogon ~]#

%取余数

[root@bogon ~]# echo $[10%3]

1

&表示后台执行

与运算,如果左边执行成功,才执行右边的语句,否则不执行

[root@bogon ~]# pwd && echo 123

/root

123

[root@bogon ~]# make && make install

|管道符号

||逻辑库,或的关系,前面执行成功了,就不执行后面的,否则就执行后面的

[root@bogon ~]# echo 123 ||echo 45

123

*乘号

[root@bogon ~]# echo $[2*3]

6

()子进程

[root@bogon ~]# x=1

[root@bogon ~]# echo $x

1

[root@bogon ~]# (x=2)

[root@bogon ~]# echo $x

1

[root@bogon ~]# (x=2;echo $x)

2

[root@bogon ~]#

_没什么意义,往往放在文件名中,例如a_1

+加号,-减号

==等于

[root@bogon ~]# [ $y > $x ]

[root@bogon ~]# echo $?

0

[root@bogon ~]#

[root@bogon ~]# echo ${money}0000

100000

{}阔住定变量

[root@bogon ~]# touch [1..3].txt

[root@bogon ~]#

[root@bogon ~]# touch {4...9}.txt

[root@bogon ~]# ls

;分割多个命令

不管前面的命令是否执行成功,都执行后面的

:这个命令的执行结果永远为真

[root@bogon ~]# :

[root@bogon ~]# echo $?

0

while :;do echo 123;sleep 0.5;done

/路径分割符号,写多个都没问题

[root@bogon ~]# cat /etc///passwd

*所有字符,?只匹配一个任何字符

[root@bogon ~]# ls ???.txt

111.txt

[root@bogon ~]#

[root@bogon ~]# ls ?????

a.txt  B.txt  d.txt  f.txt  Z.txt

b.txt  c.txt  e.txt  g.txt

[root@bogon ~]#

>追加、覆盖

,没意义

 

以上是关于Shell的主要内容,如果未能解决你的问题,请参考以下文章

Shellshell脚本练习

Shellshell 的执行流控制

shellshell-grep -v 排除多个输出结果

Shellshell中的常用基础命令

shellshell中各种括号的作用()(())[][[]]{}

Shellshell脚本中的变量