Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell启动、挂起、停止甚至编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,再shell中可以直接调用Linux系统命令。
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括:sh、ksh、Bash、psh、zsh;c家族主要包括:csh、tcsh
Bash:Bash与sh兼容,现在的Linux使用bash作为用户的基本shell
Linux支持的Shell
/etc/shells
脚本执行方式
1、echo输出命令
echo [选项] [输出内容] 选项: -e: 支持反斜线控制的字符转换 echo -e "hell\bo" #删除左侧字符 echo -e "h\te\tl\nl\to" #制表符与换行符 echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f" #按照十六进制ASCII码输出 echo -e "\e[1;31m text \e[0m" #输出颜色 #30m=黑色, 31m=红色, 32m=绿色, 33m=黄色, 34m=蓝色, 35m=洋红, 36m=青色, 37m=白色
2、第一个脚本
vi hello.sh #!/bin/bash #The first program
3、脚本执行
赋予执行权限,直接运行 chmod 755 hello.sh ./hello.sh 通过Bash调用执行脚本 bash hello.sh
Bash的基本功能
1、命令别名与快捷键
2、历史命令
3、输出重定向
4、多命令顺序执行
5、Shell中特殊符号
查看与设定别名
alias #查看系统中所有的命令别名 alias 别名='原命令' #设定命令别名
别名永久生效与删除别名
vi ~/.bashrc #写入环境变量配置文件 unalias 别名 #删除别名 source .bashrc #马上生效
命令生效顺序
第一顺位执行用绝对路径或相对路径执行的命令
第二顺位执行别名
第三顺位执行Bash的内部命令
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到
第一个命令
常用快捷键
Ctrl+C 强制终止当前命令
Ctrl+L 清屏
Ctrl+A 光标移动到命令行首
Ctrl+E 光标移动到命令行尾
Ctrl+U 从光标所在位置删除到行首
Ctrl+Z 把命令放入后台
Ctrl+R 在历史命令中搜索
历史命令
history [选项] [历史命令保存文件] 选项: -c: 清空历史命令 -w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history
历史命令默认保存1000条,可以在环境变量配置文件/etc/profil
中进行修改
历史命令的调用
使用上、下箭头调用以前的历史命令
使用”!n”重复执行第n条历史命令
使用”!!”重复执行上一条命令
使用”!字串”重复执行最后一条以该字串开头的命令
输出重定向
输入重定向
wc [选项][文件名] 选项: -c: 统计字节数 -w: 统计单词数 -l: 统计行数
管道符
1、多命令顺序执行
ls anaconda-ks.cfg && echo yes #逻辑与 ls anaconda-ks.cfg || echo no #逻辑或 命令 && echo yes || echo no #命令判断
2/管道符
命令格式: 命令1 | 命令2 #命令1的正确输出作为命令2的操作对象 ll -a /etc/ | more netstat -an | grep " ESTABLISHED"
通配符
Bash中其他特殊符号
echo 'ls' echo $(date)
条件判断语句
按文件类型判断
两种判断格式
test -e /root/install.log [ -e /root/install.log ] #推荐格式,注意括号两边空格 [ -d /root ] && echo "yes" || echo "no" #第一个判断命令如果正确执行,则打印“yes”,否则打印“no”
按文件权限判断
[ -w student.txt ] && echo "yes" || echo "no" #判断文件是拥有写权限的
比较两个文件
[ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo "no"
比较两个整数
[ 23 -ge 22 ] && echo "yes" || echo "no"
字符串判断
[ -z "$name" ] && echo "yes" || echo "no" #判断name变量是否为空 [ "$aa" == "bb" ] && echo "yes" || echo "no" #判断两个变量的值是否相等
多重条件判断
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no" #判断变量aa是否有值,同时判断变量aa是否大于23
单分支if语句
if [ 条件判断式 ]; then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi
if语句使用fi结尾,[ 条件判断式 ]即是使用test命令判断,中括号和条件判断式之间必须有空格。
例1:判断登录的用户是否root
#!/bin/bash test = $(env | grep "USER" | cut -d "=" -f 2) if [ "$test" == "root" ] then echo "Current user is root." fi
例2:判断分区使用率
#!/bin/bash #统计根分区使用率 rate=$(df -h | grep "/dev/sda3" | awk ' {print $5} ' | cut -d "%" -f1) #把根分区使用率作为变量值赋予变量rate if [ $rate -ge 80 ] then echo "Warning! /dev/sda3 is full!" fi
双分支if语句
判断Apache服务是否启动
ps aux | grep httpd | grep -v grep #!/bin/bash test=$(ps aux | grep httpd | grep -v grep) #截取http进程,并把结果赋给变量test if [ -n "$test" ] #如果test的值不为空,则执行then中命令 then echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log else /etc/rc.d/init.d/httpd start &>/dev/null echo "$(date) restart httpd!" >> /tmp/autostart-err.log fi