更新Shell是Linux基础里面相对最重要的一部分,所以单独拎出来做一篇总结
一、概述
1、Shell是什么
- Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是 解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2、Shell的分类
Bourne Shell:从1979起Unix就开始使用Bourne Shell, Bourne Shell的主文件名为 sh。
- C Shell: C Shell 主要在BSD版的Unix 系统中使用,其语法和C语言相类似而得名。
注意Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、bash、psh、zsh; C家族主要包括: csh、 tcsh。
因此Bash: Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
3、Linux支持的Shell
- /etc/shells
- 支持的Shell类型有
二、Shell脚本的执行方式
1、echo输出命令(欸Q)
[root@localhost ~]# echo [选项] [输出内容]
选项 -e:
支持反斜线控制的字符转换
[root@localhost ]# echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
[root@localhost ]# echo -e "\x61\ t\x62\t\x63\n\x64\t\x65\t\x66"
a b c
d e f
[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m"
#输出颜色
#30m=,黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
2、第一个脚本
[root@localhost sh]# vi hello.sh
#!/bin/Bash #注意,此处的"#"并不是注释,而是标识符,类似于html中的<div>
#The first program #后面这俩就是注释了
# Author: shenchao ( E-mail: shenchao@lampbrother.net)
echo -e "Mr. Shen Chao is the most honest man in LampBrother"
#沈超老师是兄弟连中最正直的男人
3、脚本执行
赋予执行权限,直接运行
$ chmod 755 hello.sh #赋予执行权限
$ ./hello.sh #直接运行(此处为相对路径)
$ root/ sh/hel lo. sh #(此处为绝对路径)
#或者
$ bash hello.sh #Bash调用执行,只要语法正确甚至不用给执行权限
通过Bash调用执行脚本
bash hello.sh
- dos2unix
拓展Windows使用的是dos命令,到Linux中执行其中转过来的文件是行不通的:例如Linux中用cat -A file
查看某个文件的详细内容时,会看到换行符是$
符号,但是转过来的Windows文件中的换行符却是 ^M$
符号,此时Linux无法识别就会报错
因此解决办法就是安装转换格式的软件:dos2unix #其含义就是将dos命令转换(to)成unix系统可识别的命令的软件程序
Lroot@localhost sh]# yum -y install dos2unix
Loaded plugins: fas testmirror, security
Loading mirror speeds from cached hostfile
Setting up Install Process
Package dos2unix-3. 1-37. el6.1686 already installed and latest vers ion
Nothing to do
三、Bash的基本功能
1.历史命令与命令补全
- 历史命令
[root@localhost ~]# history [选项] [历史命令保存文件]
选项-C: 清空历史命令
-W: 把缓存中的历史命令写入历史命令保存文件~/.bash_ history
不用等到关机才保存
- 历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
- 历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!” 重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
- 命令与文件/目录补全
命令别名
[root@localhost ~]# alias 别名='原命令'
#设定命令别名
[root@localhost ~]# alias
#查询命令别名
例如
alias vi='vim'
再用alias
查询一下所有系统中的别名[root@localhost] # alias
alias cp= 'cp -i'
alias l.= 'ls -d .* --color-auto '
alias ll=' ls -1 --color= auto'
alias ls=' ls -- color- auto '
alias mv= 'mv i'
alias rm='rm -i'
alias vi='vim'
alias which= 'alias | /usr/bin/which --tty-only -read i alias - show dot - show ti lde'
命令执行时顺序
- 第一顺位执行用绝对路径或相对路径执行的命令
- 第二顺位执行别名。
- 第三顺位执行Bash的内部命令。
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一- 个命令。
- 让别名永久生效
[root@localhost ~ ]# vi /root/ .bashrc
- Bash常用快捷键
3.输入输出重定向
- 标准输入输出
- 输出重定向
例如标准重定向 和 追加重定向输出结果的不同
Lroot@localhost # ls
anaconda-ks. cfg install. log install. log- sys log
[ rootel ocalhost ]# ls > abc
[ root@l ocalhost # ls
abc
anaconda ks. cfg install. log
install. log- syslog
[ root@l ocalhost ]# cat abc
abc
anaconda- ks. cfg
install. log
install. log. sys log
[ root@localhost # date
2014年01月14日 星期二21:48:55 CST
[ root@loca lhost # date > abc #已经覆盖前ls > abc输入的文件内容,故只显示最新输入内容
[ root@l ocalhost ]# cat abc
2014年 01月 14日星期二21:49:08 CST
[ root@ 1 ocalhost ] # date >> abc #附加重定向可以在文档内部追加内容而不覆盖已有内容
[ root@l ocalhost ]# cat abc
2014年01月14日星期二21:49:08 CST
2014年01月 14日星期三21:49:33 CST