Shell基础

Posted on 2016-05-10 21:31  博雅塔之子  阅读(163)  评论(0编辑  收藏  举报

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 

Copyright © 吴华锦
雅致寓于高阁渔舟唱晚,古典悠然
格调外发园林绿树萦绕,馥郁清香