shell 是一个命令解析器,侦听用户指令,启动 执行并将结果返回给用户,属于交互式的
      是Linux下一种程序设计语言,它有变量 关键字 流程控制 等结构化语句,用它可以编写功能强大的程序脚本

shell信息查看
查看支持的SHELL    cat /etc/shells
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh

 查看当前使用的SHELL      echo $SHELL
[root@localhost ~]# echo $SHELL
/bin/bash

查看shell版本
[root@localhost ~]# bash -version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
[root@localhost ~]# bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.


修改用户的shell
1) vim /etc/passwd更改最后一项
2)usermod -s ...

shell的初始化
一个用户登录,需要执行一下几个文件
  /etc/profile->~/.bash_profile->~/.bashrc->/etc/bashrc
 ~/.bash_logout 退出时执行的动作

历史命令
    历史命令保存: vim ~/.bash_history
[root@localhost ~]# vim ~/.bash_history
...
cd LibO_3.3.2rc2_Linux_x86_install-rpm_en-US/
ls
...
查看历史
   [root@localhost ~]# history
1008  bash -version
 1009  bash --version
 1010  qq
 1011  vim ~/.bash_history
 1012  history
执行历史命令
 !  !! 上一次命令
    !1012 执行相关编号号指令
    !-5   执行倒数第5个
    !h !p !c  执行最后能匹配到该字符的命令

与命令相关的变量
 echo $HISTFILE 历史记录文件(可以在/etc/profile中设置)
[root@localhost ~]# echo $HISTFILE
/root/.bash_history
 echo $HISTFILESIZE 历史记录文件保存的记录大小
[root@localhost ~]# echo $HISTFILESIZE
1000
 echo $HISTSIZE   内存中保存的文件大小
[root@localhost ~]# echo $HISTSIZE
1000

注意:后两者有所不同,一个是写入文件中,一个是活动在内存中

如何禁止历史记录的方法
 [root@localhost ~]# cat ~/.bash_logout
# ~/.bash_logout

clear
[root@localhost ~]# echo "history -c" >> ~/.bash_logout
[root@localhost ~]# cat ~/.bash_logout
# ~/.bash_logout

clear
history -c

在每次退出的时候,通过执行history -c 来把命令清空即可


执行多条命令的方法
1 无条件执行 命令行之间用分号隔开
eg  mkdir a;pwd;useradd a
  ()子shell执行
[root@localhost ~]# cd /etc/X11/;ls
applnk  prefdm        sysconfig  xinit    xorg.conf
fs      serverconfig  twm        Xmodmap  Xresources
[root@localhost X11]# (cd /etc/gdm;ls)
custom.conf  locale.alias  PostLogin    PreSession           XKeepsCrashing
Init         modules       PostSession  securitytokens.conf  Xsession
[root@localhost X11]#
可以看到,你如果()这样执行指令,所开启的是一个新的shell来进行,而不是进入当前的环境

2 有条件的执行
&&  逻辑与 前一个执行成功时,再执行第二个,如果前者不成功,后者不执行
||  逻辑或 前一个执行不成功时,在执行后者,若前者执行成功,后者不执行

shell命令执行的返回值 $?  
   0: 表示成功,无错误
  非0:不同程度的问题

命令行的替换
 ! 历史记录
 {} 字符展开,如mkdir {a,b,c,d}dump
[root@localhost tmp]# ls
[root@localhost tmp]# mkdir {a,b,c,d}dump
[root@localhost tmp]# ls
adump  bdump  cdump  ddump

${} 变量替代 取变量值,有时单独一个$不安全
[root@localhost tmp]# a=1
[root@localhost tmp]# echo $a
1
[root@localhost tmp]# echo $a1

本意最后面一句,是要输出11的,结果没有任何显示
[root@localhost tmp]# echo ${a}1
11

算术运算
$(())
eg $((3+5))
`` 或$() 命令替换 如果和其他命令连用是,先执行` `中的命令
$$  显示进程号

创建shell程序的步骤
1)创建脚本文件 
2)设置其执行权限
3)运行

一个简单脚本的例子
[root@localhost shell]# vim t1.sh
#!/bin/bash
strl="how ,are you"
echo ${strl}
[root@localhost shell]# chmod u+x t1.sh
[root@localhost shell]# ./t1.sh
how ,are you


read 读数据 
格式 
    read [选项] [变量名]  
        -p 提示(数据输入时的提示)
        -s 输入不显示
        -n 接收多少个字符
[root@localhost shell]# vi t2.sh
#!/bin/bash
echo -n "输入你的数据:"
read var1
echo "你输入的数据为${var1}"
[root@localhost shell]# chmod u+x t2.sh
[root@localhost shell]# ./t2.sh
输入你的数据:1
你输入的数据为1

流程控制  三大流程控制结构  顺序  选择  循环

选择
 if [ 条件 ]
 then
     ...
fi


比较运算符  数值比较
        -eq 等于
        -ne 不等于
        -gt 大于
        -lt 小于
        -ge 大于等于
        -le 小于等于
        字符比较
        = 等于
            != 不等于
        \> 大于
        \< 小于
        -z 是否为空(长度是否为0,为0则为真)
        -n 是否不为空(长度是否不为0,不为0则为真)

条件测试
test 或者[ ]
-b file  文件存在,而且是块设备文件
-c file  文件存在,而且是字符设备文件
-f file  文件存在,而且是普通文件
-e file  文件是否存在
-h file  文件存在,而且是符号链接文件
-g file  文件是否设置了GID(特权位上G+S)
-p file  文件存在,而且是管道文件
-r file  文件是否可读
-w file  文件是否可写
-x file  文件是否可执行
-u file  文件是否设置了UID(特权位上加U+S)
-K file  文件是否设置了粘贴位(特权位上加o+T)

-O file  当前用户是否为属主
-G file  当前用户是否为属祖


file1 -nt file2 file1是否比file2新

if格式2
if [ 条件 ]
 then
    command1
else
    command2
fi


if格式3
if  嵌套
if [ ... ]
then
    if [ ... ]
then
...
else
...
fi
else
...
fi