1、什么是shell?
shell是位于操作系统最外一层,为用户使用操作系统提供界面的软件,也即是命令解释器(用户命令解释为内核识别的机器语言)。shell分为图形界面shell(GUI shell 如Windows 图形界面 win explorer)和命令行shell(CLI shell),不过一般我们说的shell是指CLI shell。shell(CLI shell)一般分为 Bourne shell(包括 sh,ksh, bash)和 C shell(包括 csh and tcsh)。我们常使用的就是Bourne Again shell(bash).
shell 脚本本质上是包含shell命令的文件!
注意:编写shell文件命令时虽然#表示注释,但是开头第一行必须是#!/bin/bash 用来告诉操作系统下面是shell 命令,虽然有些命令echo 不加这一行也可以执行,但是要执行其他的复杂命令就需要这一行做标志。
2、执行shell文件的方式
>1、使用绝对路径 或当前路径 前提是要修改文件权限,使其可以被执行u+x
/dirtest/hello.sh
./world.sh
2、bash 文件 不需要修改文件权限即可执行 在当前父shell环境中打开一个子shell执行,结束关闭子shell。
bash /dirtest/hello.sh
3、source 文件 不需要修改权限 在当前父shell环境中执行
source hello.sh
3、别名与快捷方式
别名
alias 查看系统中的别名命令 比如 alias ll=‘ls -l --color=auto’
自己修改别名 alias lh=‘ls -alh’
unalias 删除别名
以上只能暂时修改,重启将不再生效,因此如果想永久生效应该使用用户家目录下bashrc文件 永久修改 添加行:alias lh=‘ls -alh’
快捷键:
ctrl+c 强制终止当前命令
ctrl+l 清屏
ctrl+z 后台执行
ctrl+a 光标移到命令行首
ctrl+e 光标移到命令行尾
ctrl+u 从光标处删除至行首
4、历史命令
history 显示该用户所有的使用过的命令
[root@localhost ~]# history
1 su -root
2 su -
3 su
4 su root
...............
654 ls -alh
[root@localhost ~]# !654 //执行编号为654 的ls -alh 命令
[root@localhost ~]# !! //执行上一条命令 与上箭头一样 不过是多加执行
[root@localhost ~]# !l //! 字符 自动匹配最近一次相匹配的命令 如 ls -alh
5、重定向
文件描述符
0 标准输入
1 标准输出
2 错误输出
>以覆盖的方式把命令结果从输出至屏幕重定向为输出至文件或设备 >>以追加的形式把命令结果从输出至屏幕重定向为输出至文件或设备
[root@localhost ~]# ls -alh >test.log //覆盖方式
[root@localhost ~]# ls -alh >> test.log //追加
这种只是适合正确命令执行结果,而对于错误输出2> 或 2>>并不适合,因而出现应对正确和错误输出的方式
[root@localhost ~]# ls -alh &>test.log // 覆盖 正确输出和错误输出都输出
[root@localhost ~]# ls -alh &>>test.log // 追加 正确输出和错误输出都输出
正确输出和错误输出至各自文件
[root@localhost dirtest]# ld -alh >>f1 2>>f2 //正确结果输出至f1 错误输出值f2
Linux 黑洞null 相当于window垃圾箱
[root@localhost dirtest]# ls &>/dev/null //结果不需要显示在界面 不影响自己使用界面
输入重定向 (不常用)
wc [选项][文件名]
-c 统计字符数
-w 统计单词数
-l 统计行数
[root@localhost dirtest]# wc f1
46 400 2312 f1
[root@localhost dirtest]# wc //ctrl+d 执行结果
asd
qwe
we r eww
3 5 17
6、多命令执行顺序
; 分号 用于分割顺序执行的命令,命令按顺序执行,且各个命令执行顺序不相关,即使某个错误,其他执行不影响
&& 逻辑与 左边命令执行成功,则右边命令执行,否则右边命令不执行
II 逻辑或 如果左边命令不能正确执行,则右边命令执行,否则执行右边命令
[lr@localhost ~]$ date;ls -alh;date //命令按顺序执行,命令开始和结束加上时间 可以显示命令执行的时间 不过 如果其中命令错误 时间也会计在其中
[root@localhost lr]# ls -alh >/dev/null && echo yes //不看命令执行过程结果 只输出命令正确执行的个数 即yes 输出的个数 /dev/null linux中的黑洞 相当于垃圾回收站
[root@localhost lr]# ls -alh >/dev/null && echo yes >/dirtest/dir2.log //命令执行过程不看 把正确执行的命令 以yes方式输出到文件中
ld -alh >/dev/null && echo yes || echo no //命令正确执行输出yes 错误执行输出no
7、管道符
命令1 | 命令2 … 命令1的执行结果作为命令2的执行输入 命令2要可以执行命令1的输出
[root@localhost lr]# netstat -an |grep ESTABLISHED |wc -l // 查看网络端口状态 在结果中查找 ESTABLISHED 已经建立连接的用户 在统计行数 结果就是用户连接数
8、通配符
? 代表任意一个字符
* 代表任意0个或多个字符
[] 代表括号中的任意一个字符
[-] 代表括号内范围字符中任意一个
[^] 代表括号内字符取反 不包含字符中一位
[root@localhost dirtest]# ls ?F // 匹配一个任意字符 **ls 加文件名 表示当前目录下查找**
FF
[root@localhost /]# find ./dirtest -name *1*
./dirtest/dir1
./dirtest/dir2/d1.zip
./dirtest/dir2/dir1
./dirtest/practice/file/file1.txt
./dirtest/file1.tar.gz
./dirtest/file1.txt
./dirtest/f1
[root@localhost /]# find ./dirtest/ -name *[0-9].txt
./dirtest/practice/file/file1.txt
./dirtest/file1.txt
./dirtest/file2.txt
[root@localhost /]# find ./dirtest/ -name *[0-9].txt
./dirtest/practice/file/file1.txt
./dirtest/file1.txt
./dirtest/file2.txt
.......
9、bash中的其他其它特殊符号
‘’ 单引号 所有特殊符号都没有特殊含义,比如$、·
“” 双引号 除$(引用变量)、·(反引号 引用命令)、\(转义字符)外其他特殊符号都没有特殊含义
·· 反引号,内部为系统命令,在bash中会先执行它,作用与$()相同,由于容易看错,因此推荐使用$()
$() 与反引号一样,用来引用系统命令
# 在shell脚本中,#开头代表注释
$ 用于调用变量的值 如$name
\ 转义字符,使其失去特殊含义 如\$ 就是字符$没有引用变量的含义
[root@localhost /]# echo '$value'
$value
[root@localhost /]# echo '555'
555
[root@localhost /]# echo "$value"
666
[root@localhost /]# echo "$value 666" //空格隔开
666 666
[root@localhost /]# echo $(ls -alh /dirtest)
总用量 96K drwxr-xr-x. 6 root root 4.0K 11月 9 11:18 . dr-xr-xr-x. 19 root root
....
[root@localhost /]# value=888
[root@localhost /]# echo $value
888
[root@localhost /]# echo "$value"
888
[root@localhost /]# echo "\$value"
$value