shell语法快速入门(1)

时间:2021-10-21 06:22:41
#得到绝对路径
DIR=$(cd `dirname $0`;pwd)
$DIR/file.txt
#去掉#注释
egrep -v "(#|^$)" /etc/zabbix/zabbix_server.conf
 
基本语法:
  • export 变量=变量值    声明全局变量
  • unset $变量名  清空变量
  • read  -p "真的卸载?(yes|no)"  flag
  • 使用 read [-p "提示信息" ] 变量名 声明交互变量
  • 常见环境变量$USER $LOGNAME $UID $SHELL $HOME $PWD $PATH $PS1 $PS2
  • $n (n在1-9之间)位置变量
  • 预定义变量:

$#传递到当前脚本的参数的总个数,
                     $*以一个单字符串显示所有向脚本传递的参数,
                     $?上一条指令执行后返回的状态,
                     $$当前所在进程的进程号,$!后台运行的最后一个进程,
                     $0当前执行的进程程序名

  • 条件判定:
                    &&成功执行一个命令,再执行下一个命令    modprobe ppp-compress-18 && echo success
                    ||一个命令执行失败后再执行下一个命令
                    ()在一个子shell里执行的一组命令     {}在当前shell里执行一组命令,修改变量值立即起效
  • 多种括号的使用
                    ((  ))多用于计算表达式    [[   ]]  语法最兼容,逻辑判断    ()   优先级最高    [   ]  逻辑判断,兼容性不高
  • 运算    加`expr $1 + 2` 减  `expr $1 -2 `  除`expr $1 / 2`
  • 常用文件判定
        -e文件存在               -f 文件是个普通文件        -s 文件大小不为零
        -d 文件是一个目录     -b 文件是一个块设备              -c 文件是一个字符设备
         -p 文件是一个管道       -h|-L 文件是一个符号链接       -s 文件是一个socket
         -t 文件与一个终端设备相关     -r 文件是否可读           -w 文件是否可写             -x 文件是否可执行
        f1 -nt f2 文件f1比f2新    f1 -ot f2 文件f1比f2旧    f1 –ef f2 文件f1与f2是相同文件的硬链接
  • 字符串判定
            -z 字符串为null          -n 字符串不为null
  • 数值判定
            -eq 等于     –ne不等于     –gt大于 
            –ge大于等于    –lt 小于         –le 小于等于 
  • 常用判定符
            =  != 可在[ ]中使用
            <  <=  >=  > 可在双括号内 [[ ]] 使用
  • 逻辑判定
            -a 逻辑与    -o 逻辑或
 
条件判断if
 if [ $# = 0 ] ;then           // [ =  ]间有空格, then前有;号
    ...
elif [  $a -lt 3 ];then
...
fi
多条件判断
    if [ -n $port1 ] && [ -n $port2 ] && [ -n $port3 ] && [ -n $port4 ] && [ -n $port5 ];then
    if [ -n $port1 ] || [ -n $port2 ] || [ -n $port3 ] || [ -n $port4 ] || [ -n $port5 ];then
注意:如果if 的条件中包含字符串变量变量,请注意使用“”,如:if [ -z "$test" ];then
 
条件判断case
case  $letter   in
  U|u) whoami ; ;
  L|l) ls –l / ; ;
  E|e)exit ;;
  *) echo “please input true parm!!!” ; ;
esac
 for 循环
 (使用return  0或1来退出循环)
格式1:
  int j=0
   for i in $arr   //$arr为链表
   do
    echo "第$j次循环"
    j=`expr $j + 1`
   done
格式2:
    for (( i = 0; i < $len ; i++ )) ; do
        echo "第$i次循环"
    done
 
 while循环
(使用return  0或1来退出循环)
格式:
  While [ $num  –lt  10  ]
  Do 
  Done
 
sample1:
    while [ $# -ne 2 ]
    do
        echo "输出$#"
        sleep 1            //休息1s
        if [ $i -eq 100 ]
        then
        break //退出
        fi
        shift
    done
 
until循环
 (使用return  0或1来退出循环)
  Util [ $num –lt 10 ]
  Do
  Done
 
数组
声明
array[key]=value #array[0]=one,array[1]=two
declare -a array   #array被当作数组名
array=( value1 value2 value3 ... )
array=( [1]=one [2]=two [3]=three )
array="one two three" # echo ${array[0|@|*]}  把array变量当作数组来处理,但数组元素只有字符串元素本身
访问
${array[key]}  #${array[1]}
${array[@|*]}    #输出所有元素
${array[@]:1}    #从第二(1+1)个元素开始,后面所有的元素
${array[@]:0:2} #从第一(0+1)个元素开始的两个元素
${array[@]:1:3}  #从第二个元素开始的三个元素
${#array}       #计算数组第一个元素的长度
${#array[0]}    #同上
${#array[*}}     #计算数组的个数
${#array[@]}     #同上
删除
unset array[1]  #删除数组中的第一个元素
unset array #删除整个数组
${array[@]#t*e} #删除字符串左边开始最短的匹配t*e
${array[@]##t*e} #删除字符串左边开始最长的匹配t*e
${array[@]%o}   #删除字符串右边开始最短的匹配
${array[@]%%o}   #删除字符串右边开始最长的匹配
字串替换
${array[@] /o/m} #数组中所有的o都会被替换为m
${array[@] /o/}    #所有匹配到的o都会被删除
${array[@] /#o/m}  #数组已o开头的匹配将会被替换
${array[@] /%o/m}  #数组已o结尾的匹配将会被替换
sample排序
bak_date_ns=(`cat $tmpfile1|awk -F "." '{print $1}'`)   //排序前
bak_date=($(for val in "${bak_date_ns[@]}"  //排序后
        do
          echo "$val"
        done|sort)
       )
 
函数
使用函数的好处:可以将一组功能打包,在同一shell中,多次调用。
函数的声明
function chk_clientip() #检验client_ip参数
{
         if_net_well=0
         cle_ip=$1
         client_ip=$2
         server_ip=$3
         if [ -n "$cle_ip" ]  &&  [ -n "$client_ip" ] && [ -n "$server_ip" ];then
    if_net_well=1
         fi
        return $if_net_well
}
函数的调用
chk_clientip $cle_ip $client_ip $server_ip
result=$?    //函数执行结果,返回的$if_net_well 的值
 
正则表达式:
ip地址 [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$