shell简介:
shell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。
shell是命令解析器,用户输入命令,它去解析,然后交给内核执行命令,内核便可以操作硬件。
变量:
命名规则:
以字母或者下划线开头,剩下的内容可以是字母、数字、下划线。
变量赋值:
[变量名]=[变量值]
echo $[变量名] //显示变量值
unset [变量名] //删除变量
export定义的变量和普通变量的区别:
注意:子bash中的export变量,不会被父bash继承。父bash中的export定义的变量会被子bash继承。
[[email protected] ~]# name=ldsly //普通方式定义变量 [[email protected] ~]# echo $name //在父bash中显示变量 ldsly [[email protected]-3 ~]# bash //重新打开一个子bash [[email protected] ~]# echo $name //显示变量,发现并不存在这个变量 [[email protected]-3 ~]# exit //退回父bash exit [[email protected]-3 ~]# export name=ldsly //使用export定义变量 [[email protected] ~]# echo $name //在父bash中显示变量 ldsly [[email protected]-3 ~]# bash //打开一个子bash [[email protected] ~]# echo $name //在子bash中显示变量,正常显示 ldsly [[email protected]-3 ~]#
[[email protected] ~]# export name2=y //在子bash中继续定义变量 name2
[[email protected] ~]# echo $name2 //子bash中显示变量
y
[[email protected] ~]# exit //退回父bash
exit
[[email protected] ~]# echo $name2 //在父bash中显示变量
[[email protected] ~]# //父bash中不存在变量 name2
命令执行的优先级:
==> alias
==> Compound Commands
==> function
==> build_in
==> hash
==> $PATH
==> error: command not found
默认的变量存放位置:(此文件顺序为开机登陆系统时,系统加载的顺序)
/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc
各种情况下变量文件加载情况:
[[email protected] ~]# su - ldsly //完全切换用户时,四个变量文件按顺序全部加载 Last login: Sat Jun 3 00:40:14 CST 2017 on tty1 /etc/profile /home/ldsly/.bash_profile /home/ldsly/.bashrc /etc/bashrc [[email protected]-3 ~]$ exit logout [[email protected]-3 ~]# su ldsly //不完全切换时,只加载对应用户家目录下的.bashrc和系统下的 bashrc文件/home/ldsly/.bashrc /etc/bashrc [[email protected]-3 root]$ exit exit [[email protected]-3 ~]# bash //开启子bash时,加载当前登录用户家目录下的.bashrc和系统下的bashrc文件 /root/.bashrc /etc/bashrc [[email protected]-3 ~]#
PATH的查看和添加:
[[email protected] ~]$ echo $PATH //查看PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ldsly/.local/bin:/home/ldsly/bin [[email protected]-3 ~]$ export PATH=/usr/local/nginx/sbin:$PATH //临时添加/usr/local/nginx/sbin到PATH中 [[email protected]-3 ~]$ echo $PATH /usr/local/nginx/sbin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ldsly/.local/bin:/home/ldsly/bin [[email protected]-3 ~]$
想永久生效就添加就在/etc/bashrc文件中添加export PATH=/usr/local/nginx/sbin:$PATH
元字符
~:家目录,可使用cd ~ 快速返回家目录
[[email protected] ~]$ pwd /home/ldsly [[email protected]-3 ~]$
``:取命令执行结果
[[email protected] ~]$ echo `ls` Desktop Documents Downloads Music Pictures Public Templates Videos
$():同上但是弥补了``嵌套的缺陷
[[email protected] ~]$ a=`echo `ls`` //使用``发现$a的值并不是我们要的ls的显示结果 [[email protected]-3 ~]$ echo $a ls [[email protected]-3 ~]$ a=$(echo `ls`) //使用$() [[email protected]-3 ~]$ echo $a Desktop Documents Downloads Music Pictures Public Templates Videos [[email protected]-3 ~]$ a=$(echo $(ls)) //全部使用$() [[email protected]-3 ~]$ echo $a Desktop Documents Downloads Music Pictures Public Templates Videos [[email protected]-3 ~]$
!:取反
[[email protected] ~]$ ls Desktop Documents Downloads Music Pictures Public Templates Videos [[email protected]-3 ~]$ ls D[!e]* Documents: Downloads: [[email protected]-3 ~]$
!:取历史命令
57 ls 58 history [[email protected]-3 ~]$ !57 ls Desktop Documents Downloads Music Pictures Public Templates Videos [[email protected]-3 ~]$
!:取最近的一次命令匹配
[[email protected] ~]$ !ls ls /tmp/ anaconda.log storage.log hsperfdata_ldsly systemd-private-51ecaa2f4af14852be58a7b018bae8fb-cups.service-DR3a4Y hsperfdata_root systemd-private-51ecaa2f4af14852be58a7b018bae8fb-vmtoolsd.service-qkylGu ifcfg.log systemd-private-b3d2522c2a1641249fba9275ac0c283a-cups.service-fCjOWS ks-script-JUZxd9 systemd-private-b3d2522c2a1641249fba9275ac0c283a-vmtoolsd.service-DRnv3k nginx-1.12.0.tar.gz tracker-extract-files.0 packaging.log tracker-extract-files.1000 program.log yum.log sensitive-info.log [[email protected]-3 ~]$
!:命令的返回值取反
[[email protected] ~]$ ls Desktop Documents Downloads Music Pictures Public Templates Videos [[email protected]-3 ~]$ echo $? //取上一次命令的结果返回值 0 //0为真 非0为假,一般可理解为,上一条命令执行成功了返回0,执行失败返回非0值。范围:0-255 [[email protected]-3 ~]$ ! ls Desktop Documents Downloads Music Pictures Public Templates Videos [[email protected]-3 ~]$ echo $? 1 [[email protected]-3 ~]$
#:注释,井号后的内容不会被执行,仅用于注释
^:取反的意思,跟!差不多。但还是有区别
[[email protected] ~]# ls D[^e]* Documents: Downloads: [[email protected]-3 ~]#
&:后台运行的意思
[[email protected] ~]# firefox & [1] 5484 [[email protected]-3 ~]#
():在子进程中运行
[[email protected] ~]# a=1 [[email protected] ~]# echo $a 1 [[email protected]-3 ~]# (a=10;echo $a) 10 [[email protected]-3 ~]#
=:赋值
&&:逻辑与
||:逻辑或
|:管道符
>:重定向符
>>:追加重定向符
\:转义符
‘‘: 硬引用,引号内所有内容当 字符串输出处理
"" :软引用,引号内字符有自己的含义
: :执行结果,永远为真
*:通配符,任意字符
一些快捷键
TAB键:命令补全功能,防止一些输入错误
Ctrl+A:光标移到行首
Ctrl+E:光标移到行尾
Ctrl+L:清空当前屏幕
Ctrl+U:删除光标当前位置到行首的内容
Ctrl+K:删除光标当前位置到行尾的内容
grep命令的常用参数:
-n:显示行号
-o:只显示匹配的内容
-q:静默模式,没有任何输出,可以使用echo $?来判断是否成功执行。
-l:如果匹配成功,打印出文件名,失败不打印
-A:匹配成功,将匹配行及其后n行一起打印出来
-B:匹配成功,将匹配行及其前n行一起打印出来
-C:匹配成功,将匹配行及其前后n行一起打印出来
-c:匹配成功,只打印匹配的行数(一共匹配到多少行的数量)打印出来
-i:忽略大小写
-v:取反,不匹配
-w:匹配单词(连续的字母组成的单词)
正则表达式
正则表达式跟通配符不同,通配符是由shell解释的,正则表达式是由命令解释的。
^:行首
[[email protected] ~]# grep -n ‘root‘ /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin [[email protected]-3 ~]# grep -n ‘^root‘ /etc/passwd 1:root:x:0:0:root:/root:/bin/bash [[email protected]-3 ~]#
$:行尾
[[email protected] ~]# grep -n ‘bash$‘ /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 43:ldsly:x:1000:1000:ldsly:/home/ldsly:/bin/bash [[email protected]-3 ~]#
[]:中括号内任一字符
[[email protected] ~]# grep [bc] 1.txt abc abccc a/bc apobc [[email protected]-3 ~]#
[^]:中括号内每个字符取反
[[email protected] ~]# grep [^bc] 1.txt a abc abccc a/bc apobc [[email protected]-3 ~]#
[a-z]:小写字母
[A-Z]:大写字母
[a-Z]:小写和大写字母
[[email protected] ~]# grep [A-Z] 1.txt Abc aBC ABC [[email protected]-3 ~]#
[0-9]:数字
[[email protected] ~]# grep [0-9] 1.txt ab2ccc a1/bc Abc4 aBC6 ABC7 [[email protected]-3 ~]#
|:交替匹配|两边的任意一项
[[email protected] ~]# egrep ‘ABC|abc‘ 1.txt abc1 abc2 ABC1 ABC2 [[email protected]-3 ~]#