shell 学习

一.变量设置
  1.本地变量设置: 变量名=变量值
    localtest=test          设置本地变量
    echo $localtest         打印本地变量
    set                     查看本地变量
    注:本地变量只对shell当前生命周期有效,退出重新登陆后失效
  2.环境变量:可以应用于所有用户进程
    $HOME/.bash_profile(/etc/profile)
设置方法:
export chinaitlab=shenzhen    设置环境变量
env(export)                   查看环境变量
  3.变量替换
     echo $变量名
  4.变量清除(只读变量无法清除,请谨慎使用)
     unset 变量名 
  5.标准变量(基本都是环境变量,可以/etc/profile中定义)
     EXINIT
HOME
IFS           LINUX域之间的分隔符
LOGNAME       登陆名
MAIL          当前用户邮箱存储位置
MAILCHECK     检查邮件时间间隔
MAILPATH      
TEAM          终端类型
PATH          可执行文件检索路径
TZ            时区
PS1           SHELL登陆提示符
PS2           在一行上面运行多个命令时使用
PWD           表示当前目录
     SHELL         当前运行的SHELL版本
MANPATH       帮助文件路径
TERMINFO
  6.特殊变量
     $#   传递到脚本的参数列表
     $*   以一个单子符串显示所有脚本传递参数,与位置变量不同,此选项参数可超过9个
     $$   脚本运行的当有进程ID号
     $!   后台运行的最后一个进程的进程ID号
     $@   与$#相同,但是在使用时加引号,并在引号中返回每个参数
     $-   显示shell使用的当前选项,与set命令功能相同
     $?   显示最后命令的退出状态,0表示没有错误,其它的任何值都表明有错误
  7.影响变量的命令
     decare: 设置或显示变量
  -f    显示函数名
  -r    创建只读变量(declare和typeset)
  -x    创建转出变量
  -i    创建整数变量
  使用+或- 可以颠倒选项的含义(-r是不可颠倒的)
 export 创建传给子shell的变量 
   --表示选项结束,所有后续参数都是实参
-f 表示在"名-值"对中的名字是函数名。
-n 把全局变量转换成局部变量。
-p 显示全局变量列表
 readonly  用于显示或设置只读变量
        -- 表示选项结束
        -f 创建只读变量
      set  设置或重设各种shell变量
      shift [n] 用于移动变量位置,调整位置变量,使$3的值赋于$2,          $2的值赋于$1
      typeset  用于显示或设置变量 是declare的同义词
      unset   用于取消变量的定义
        --  表示选项结束
        -f  删除只读变量,但不能取消从shell环境中删除指定的变量和函数。如:PATH,PS1,PS2,PPID,UID,EUID等的设置。
  8.引号
     1.双引号
  引用双号号可以引用除字符$、`、\外的任意字符或字符串
     2.单引号 
      与双引号类型不同的是忽略所有特殊符号
3.反引号
    把字符串当作系统命令来执行
4.反斜杠
  如是本个字符串有特殊含义,则屏蔽其特殊含义(如:*、+、……、$、`、“、|、?)
  9.运算符
     运算符是对计算机发的指令
按位运算(~、〈〈、>>、&、^、|)
~ 反运算符 把二进制中的1变为0,0变为1
 〈〈左移位运算符 
      如:op1<<op2(echo $[2<<4] 结果为32)  把OP1中的二进制向左移OP2位,忽略最左端移出的各位,最右端的各位补上0值,每做一次按位左移就有实现op1乘以2
>> 右移位运算符
op1>>op2(echo $[16>>2] 结果为4)  把OP1中的二进制向右移OP2位,忽略最右端移出的各位,最左端的各位补上0值,每做一次按位左移就有实现op1除以2
&  与比较运算符
op1&op2 (echo $[4&6] 结果为4) op1和op2对应位,对于每个二进制来说,如果二都该位都是1,则结果为1,否则结果为0 
^ 异或运算符
op1^op2 (echo $[2^4] 结果为6 ecch $[4^6] 结果为2) 比较op1与op2的对应位,如果二者该位互补,则结果为1;否则为0
| 或运算符
op1|op2 (echo $[2|4] 结果为6 echo $[2|2] 结果为2) 比较op1与op2对应位,如果二者该位有一个是1或都是1,则结果为1,否则为0
通过$[]求值,表示方括号中表达式求值
 
逻辑运算符: 
0&&0  0
0&&1  0
1&&0  0
1&&1  1
0||0  0
0||1  1
1||0  1
1||1  1
 
赋值运算符
= += -=  *+ /= %= &= ^= |= <<= >>=
let count =$count + $change
let count+=$change
example:  var=65
               let var+=4
               echo $var
               69
               let var=var+10
               echo $var
               79
表达式替换
$[]和$( () )
习惯使用$[],所有shell的求值都是用整数完成
$[]可以接受不同基数的数字
  [base#n] n表示基数从2到36的任何基数
  echo $[10#8+1]
  9
  
 运算符优先级(见图)
 

 
 
二、shell的输入与输出
     1.echo  
  显示文本行或变量
  echo [option] string
  -e 解析转义字符
  -n 回车不换行,linux系统默认回车换行
  -转义符(\c \f \t \n)
  example:
  #!/bin/bash
  #echod
  echo -e "This echo's 3 new lines\n\n\n"
  echo "OK"
  echo
  echo "This echo's 3 new lines\n\n\n"
  echo "The log files have all been done"> mylogfile.txt
  
  结果:
       This echo's 3 new lines
 
 
 
       OK
 
       This echo's 3 new lines\n\n\n   
2.read 语句可以从键盘或文件的某一行文本中读入信息,并将其同仁给一个变量。
  read varible1 varible2
   -如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车;如果输出多个变量,它们按顺序分别被赋予不同的变量。shell将用空格作为变量之间的分隔符
example:
#!/bin  /bash
#readname
echo -n "First Name:"
read firstname
echo "Last Name"
read lastname
echo -e "Your First Name is :${firstname}\n"
echo -e "Your Last Name is :{lastname}\n"
3. cat显示文件内容,创建文件,可以用它来显示控制字符
cat[option] filename1 filename2 ....
-v 显示控制字符
不分页显示
4.|管道 把一个命令的输出作为另一个命令的输入
   df -k|awk '{print $1}'|grep -v "Filesystem"
         结果:
/dev/sda1
         /dev/sda2
         none
5. tee  把输出的一个副本输送到标准输出,另一个副本拷贝到另一个文件
    -a 追加到文件末尾
    example 
who|tee who.cut
who|tee -a who.cut  
6.标准输入。输出和错误
   标准输入描述符:0(缺省是键盘也可以文件和其它命令)
标准输出描述符:1(缺省是屏幕也可以是文件)
错误文件描述符2 (缺省是屏幕,也可以是文件)
有12个描述符,3-9可以任意使用
7.文件重定向 改变程序运行的输入来源和输入地点