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的主要内容,如果未能解决你的问题,请参考以下文章