变量的类型
1、本地变量: 只对当前的小程序或当前的shell有效
2、环境变量: 对当前shell、子shell和其他的程序都有效  用export创建并导出环境变量  如:export A=3 创建了一个环境变量A,使用export直接显示系统中导出的所有环境变量。env 在一个指定的环境下运行某个命令。    需要记住的环境变量:
PS1:设定用户提示符格式
HISTSIZE:设定命令历史的个数
HOME:家目录
PATH:外部文件查找可执行文件的路径
LOGNAME:登录的用户名
3、特殊变量: bash内置的变量
4、位置变量:可以直接向脚本传递参数,并且能够在脚本中运用 如:$1、$2、$3、....

使用$[]将运算的表达式括起来便可执行运算。
小试牛刀:
1、 编写一个脚本,完成一下功能;
  一次性输出两个数的+、-、*、/两个数随机输入。
  #!/bin/bash
  #
  echo $[$1+$2] $[$1*$2] ...
 2、显示出Yuour Salary $5000
 echo `Yuour Salary $5000`
 echo “Yuour Salary /$5000“  用/避免转移
 
 
 
   命令别名
alias 建立命令别名 如:alias cdnet=`cd /etc/sysconfig/network-scripts`当后面有空格的时候使用``,没有的空格的话则不需要
unalias 取消命令别名:
使用命令建立的命令别名只能在当前shell下生效,重启或更换shell将失效。

全局有效的目录:/etc/profile,/etc/profile.d/*,/etc/bashrc
局部有效的目录:~/.bash_profile,~/.bashrc,~/.bash_logout

   profile类:
设置环境变量
运行用户登录时要执行的一些命令
   bashrc类:
设置别名
设置本地变量

source 或 . +文件名 重读文件,让设置的变量可以立即使用,不必等到重新登陆后才有效

  shell的分类:
交互式登录式shell:当以一个用户登录到系统后以命令的方式运行的shell
运行次序:/etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
非登陆式shell:当运行一个脚本时系统自动的运行的shell
运行次序:~/.bashrc-->/etc/bashrc-->/etc/profile.d/* 


输入/输出重定向
标准输入:对应位置/dev/stdin,描述符为 0
标准输出:/dev/stdout,描述符为 1
错误输出:/dev/stderr,描述符为 2

输入的重定向: 用 < 表示
输出的重定向: 用 > 表示覆盖输出重定向,在使用set -C功能时,可以使用>|进行覆盖 ,使用用>>表示追加输出重定向(追加方式),使用set -C 避免实现覆盖重定向 使用set +C 取消这个功能。
错误输出重定向:用 2>表示覆盖错误输出重定向,用2>>表示追加错误输出重定向(追加方式)
合并错误输出和标准输出的输出流:用 &> 表示

自定义输出重定向
exec 3>> /tmp/myout.out 将输入到/tmp/myout.out的内容用自定义的符号3来代表这个路径
ls /etc >&3 将ls /etc 内容写入3
exec 3>&- 撤销自定义的符号3


sort 排序
   -t 逆向排序

管道 |
可以连接多个命令,一直将前一个命令的执行结果当作下一个命令的输入内容。
tee 把产生的数据分成两份,一份自己保存,一份通过管道送给后面的命令 ls /etc |tee >log.ls | less
 
 
程序执行流
顺序执行:
选择分支:
循环执行:for I in LIST ;do   创建10个账户名字为user1-user10,并将密码设置为相应用户名
                                    for I in {1..10};do
                                      useradd user$I
                                      echo user$I | passwd --stdin user$I
                                      done
练习:
1、pin从192.168.0.151 -192.168.0.254 每个ip ping 一次
#!/bin/bash
  for I in {151..254}; do
  ping -c 1 192.168.0.$I
  done
2、从1累加至100
 #!/bin/bash
  let SUM=0
  for I in {1..100}; do
   SUM=$[$SUM+$I]
 done
 echo "The sum is :$SUM"
3、写一个脚本
(1)、切换工作目录/var
(2)、依次向/var目录中的每个文件或子目录问好,(提示:for I in /var/*)如:Hello,log
(3)、统计/var目录下共有多少个文件,并显示出来:
  let SUM=0
  for I in /var/*;do
  SUM=$[$SUM+1]
  done
  echo "$SUM file"

4、写一个脚本:
(1)、设定变量值为/etc/passwd
(2)、使用循环读取文件/etc/passwd的第2,4,10,13,15行,并显示其内容:(提示:LINE=`head -2 /etc/passwd | tail -l`可以读取第二行)
(3)把这些文件保存至/tmp/mypasswd文件中
  exec 3 >>/tmp/mypasswd
  FILE='/etc/bash'
   for I in 2 4 6 10 13 15; do
   LINE=`head -$I $FILE | tail -l`
   echo $LINE
   echo $LINE >$3
  done
 
for循环总结
 for VAR in LIST ; do
  statement;
  statement;
  ...
done

LIST的形式有:
简单列表:
复制列表: This is tom's cat .此LIST列表中含有',系统将误读,将其写成/'s,则可还给'应有的意义。

IFS=$'\n' 设定为只识别换行符。


文本处理命令
cut
   -d 指定分隔符 空格用" "表示
   -f 取第几段  tail -l /etc/passwd  | cut -d: -f1,7 使用cut以:为分隔符取这个文件的第1、7段

grep [options] PATTERN file 全面搜索正则表达式并将匹配的内容显示出来 如:grep 'root' /etc/passwd 过滤出这个文件中含有'root'的行
   -i 不区分大小写
   -v 和默认的字符相反。
   -n 显示所匹配的行在原文中所处的行号
   -An 同时显示出匹配行之后的n行
   -Bn 之前的n行
   -Cn 前后n行
   --color 把匹配的字符本身高亮显示出来
  
   
  
正则表达式:一堆的元字符用来表示字符本身以外的意思
1、基本正则表达式:.* 连着使用表示任意长度的任意字符。
2、扩展正则表达式:grep -E=egrep 功能多余基本正则表达式,但对有些基本正则表达式的元字符不认识。

附图2011-07-20 16-56-27 答案:
1、grep --color "^[sS]" /pro/meminfo
2、grep --color "nologin$" /etc/passwd
3、grep --color "^#[[:space:]\(1,\)].*" /etc/inittab
4、grep --color ":[0-9]:" /etc/inittab
5、grep --color "[[:space:]]\(1,\).*" /boot/grub/grub.conf
6、grep --color "^\([0-9]\).*\1$" /etc/
7、ifconfig | grep --color "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d" " -f1
8、grep --color "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\." /etc/sysconfig/network-spcripts/ifcfg-eth0
   grep -E --color "([0-9]\{1,3\}\.){3}[0-9]\{1,3}" /etc/sysconfig/network-spcripts/ifcfg-eth0


$?:上个命令执行状态的结果  echo $? 查看上一个命令执行状态的结果。
0:表示执行成功
1-255:表示执行失败,不同的数代表不同的失败原因。

command && command 前面的命令执行成功的话才执行后一个命令
command || command 前面的命令执行失败的话才执行后一个命令