shell参考


 shell:弱类型编程语言,即变量在使用之前不需要事前声明,甚至不区分类型。

1.变量类型:

  脚本在执行时会启动一个子shell进程,命令行中启动的脚本会继承当前shell环境变量,系统自动执行的脚本(非命令行启动)就需要自我定义需要各种环境变量。
  环境变量:export VARNAME=VALUE,作用域为当前shell进程及其子进程,同样可以再变量声明完之后再用export导出变量如:export VARNAME,不用加$符号
  本地变量:VARNAME=VLAUE,作用域为整个bash进程
  局部变量:local VARNAME=VALUE,作用域为当前代码段
  位置变量:
      $1,$2,...${10},${11},引用脚本的第几个参数
      $_ ,最后一个参数
  特殊变量:
      $?,上一个命令执行状态返回值。程序状态返回值,0正确执行;1-255:错误执行;1,2,127系统预留
      $0,脚本的路径名,可以使用dirname $0获取脚本路径名,basename $0获取文件名。
      $#,脚本的参数个数
      $*,脚本的所有参数,”$*“代表"$1 $2 $3"
      $@,脚本的所有参数,"$@"代表"$1" "$2" "$3"
  位移变量:shift,所有参数的位置依次向左移动,并$#减1
  变量子串:
      ${变量},就相当于$变量
      ${#变量},求变量内容的字符长度
      ${变量:m},从第m个字符截取变量内容直到结尾
      ${变量:m:n},在变量内容中从第m个字符开始截取共n个字符
      ${变量#m*n},在变量内容中的开头开始删除最短匹配m*n
      ${变量%m*n},在变量内容中的结尾开始删除最短匹配m*n
      ${变量##m*n},在变量内容中的开头开始删除最长匹配m*n
      ${变量%%m*n},在变量内容中的结尾开始删除最长匹配m*n
      ${变量/m/n},替换变量内容中的第一个m为n
      ${变量//m/n},替换变量内容中的所有m为n
  扩展变量:
      ${变量:-word},如果变量值为空,则返回word,但不代替变量的值
      ${变量:=word},如果变量值为空,则返回word,并替代变量的值
      ${变量:?word},如果变量值为空,则word作为标准错误输出,否则输出变量的值
      ${变量:+word},如果变量值为空,则什么都不做,否则替代变量的值

  数组:
      静态数组:array=(1 2 3)
      动态数组:array=($(ls))
      为数组赋值:array[1]=333
      打印数组所有元素:${array[@]} 或 ${array[*]}
      打印数组长度:${#array[@]} 或 ${#array[*]}
      打印单个元素:${array[i]}
      循环遍历数组列表:
        for n in ${array[*]}
          do
            echo $n
          done

2.使用变量 

  引用变量:${VARNAME},在不影响调用变量名称时,括号可省略
  撤销变量:unset VARNAME,不用加上$符号
  查看变量:set,查看当前shell中的变量,不用加任何参数符号。想要查看当前shell中的环境变量可以使用printenv、env、export都可以
  追加变量:VARNAME=${VARNAME}AAA,可以在原有变量中追加变量进来,可以加在原有变量前也可以在后面。在不影响变量名称时可以不加大括号{}

3.条件判断

  条件测试表达式: [  表达式  ]、[[   表达式   ]],有空格

  逻辑运算,在[[ ]]中使用
    逻辑与:&& ,当第一个条件为真时,后面条件继续执行;当第一个条件为假时,后面不执行
    逻辑或:| | , 当第一个条件为假时,后面条件继续执行;当第一个条件为真时,后面不执行

  组合条件,在[ ]中使用
    -a:与 $$
    -o:或||
    !:非

    if [  $# -eq 1 -a $1 -eq 2  ]

  整数比较
    -eq:测试两个整数是否相等。如 $a -eq $b
    -ne:测试两个整数是否不等。
    -gt:测试一个数是否大于另外一个数,可以使用>,但在[ ]中需要加上\
    -lt:测试一个数是否小于一个数,可以使用<,但在[ ]中需要加上\
    -ge:大于等于
    -le:小于等于 

  文件测试,有时变量要加""
           -e FILE:测试文件是否存在
           -f FILE:测试文件是否问普通文件
           -d FILE:测试指定路径是否为目录
           -r FILE:测试当前用户对指定文件是否有读取权限
           -w FILE:测试当前用户对指定文件是否有写权限
           -x FILE:测试当前用户对指定文件是否有执行权限
      -s FILE:文件存在且大小不为0
      -L FILE:文件存在,且为链接文件
      f1  -nt  f2:文件f1比f2新为真
      f1  -ot  f2:文件f1比f2旧为真

  字符串比较
    "STRING1" == "STRING2":测试是否相等,相等为真,不等为假,可以使用=代替,注意等号两端的空格
    "STRING1" != "STRING2":测试是否不等,不等为真,相等为假,注意两端的空格
    ><:大于或小于
    -z 字符串:测试指定字符串是否为空,空为真,不空为假,(变量加"")也可以[ $a == "" ]这样判断是否为空
    -n 字符串:测试指定字符串是否不空,不空为真,空为假    (变量加"")

  条件测试
    test  测试表达式 
    [ 测试表达式 ]
    [[  测试表达式  ]]
    ((  测试表达式  ))

  多分支if语句  

  if [ 判断条件 ];then
                   statements1
                   ……
         elif [ 判断条件2 ];then
                   statements2
                   ……
         elif [ 判断条件3 ];then
                   statements3
                   ……
        else
                   statements4
                   ……
         fi

  case语句  

    case "变量" in
      值1)
        指令1
        ;;
      值2)
        指令2
        ;;
      *)
        指令3
        ;;
    esac

   for循环

  for 变量 in 列表;do
      循环体
  done

   while循环:适用于循环次数未知的情况,要有退出条件  

 while [ 条件 ];do
                   循环体
       done

   seq循环

  `seq [起始数 [步进长度]] 结束数`   seq 1 1 100   从1开始,每次增长1,至100结束。默认起始和步长都为1

  用while循环读取文件

1.exec方法
exec <FILE
while read line
do
    CMD
done

2.cat方法
cat FILE | while read line
do
    CMD
done

3.while结尾处
while read line
do
    CMD
done<FILE

  select打印菜单列表

PS3="这里是要打印的循环提示符,跟select是一对"
select  变量  in  列表
do
    CMD
done  

  循环控制

break n:省略n表示退出当前循环,n表示退出循环的层数
continue n:省略n表示忽略后面剩余代码,直接进行下一次循环
exit n:退出当前shell程序,并返回值
return n:函数返回值

  

4.算术运算

  a**b:幂运算
    3**3=27

  let整数算术运算表达式
    let C=$A+$B
  $[算术运算表达式]
    C=$[$A+$B]
  $((整数算术运算符))     整数运算的常用运算符
    C=$(($A+$B))
  expr 整数算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
    C=`expr $A + 2`   echo $?   可以判断A是否为整数

  let sum+=$i   -->  sum=sum+i
    let i+=1 -->  let i++ -->  i=i+1   (+=,-+,*=,/=,%=)

  bc:计算器,scale=2代表保留两位小数
    echo `seq -s "+" 5`=`seq -s "+" 5 | bc`
    1+2+3+4+5=15 

5.读入

read -p “提示信息” -t 超时时间 变量名

6.正确错误符号

首先需要加载系统方法函数,action关键字

7.函数

function  函数名() {
       指令
       return n
}

或
function 函数名 { 指令 return n } 或
函数名() { 指令 return n }

 8.生成随机数的方法

通过RANDOM函数做加密后,用cut截取
echo $RANDOM | md5sum  | cut -c 8-10

通过openssl
openssl rand -base64 8

9.脚本调试

bash
  -n:不会执行该脚本,仅查询脚本的语法问题,并给出错误提示
  -v:先将脚本的内容打印出来
  -x:调试模式

在脚本中内容中添加set -x开启调试功能,set +x关闭调试功能

脚本内容
set -x
脚本内容
set +x
脚本内容

10.屏蔽键盘信号

可以使用trap -l查看都有哪些信号,常用信号为:

HUP 1:挂起
INT 2:中断,相当于ctrl+c
QUIT 3:退出,相当于ctrl+\
ABRT 6:终止
ALRM 14:报警
TERM 15:终止
TSTP 20:停止,相当于ctrl+z

屏蔽ctrl+c键:trap "[这里可以是命令,也可以是空]" 2 [3 4 5后面可以跟多个]
恢复ctrl+c键:trap ":" 2

  

批量生成随机字符串  

#!/bin/sh
source /etc/init.d/functions
FILEPATH=/test
FILENAME=test
[ -d $FILEPATH ] || mkdir -p $FILEPATH
for i in `seq 10`
do
        NAME=$(openssl rand -base64 40 | sed s@[^a-z]@@g | cut -c 1-10)
        touch $FILEPATH/${NAME}_$FILENAME
        action "`echo $FILEPATH/${NAME}_$FILENAME is created`" /bin/true
done

重定向

#标准输出重定向到/dev/null,错误输出到控制台
find / -name passwd > /dev/null    

#标准输出和错误输出都重定向到/dev/null      
find / -name passwd > /dev/null 2>&1
find / -name passwd &> /dev/null
find / -name passwd >& /dev/null

#错误输出重定向到/dev/null,标准输出到控制台
find / -name passwd 2> /dev/null

  

  

  

 

 

 

 

  

 

posted @ 2018-01-08 16:38  ForLivetoLearn  阅读(196)  评论(0编辑  收藏  举报