shell语法

条件测试

shell 条件测试0为真,1为假

test

[ ] 

[[ ]]

参数之间使用空格隔开

测试命令

-d 存在且为目录

-f 存在且为普通文件

-z 字符串长度为0

-n 字符串长度非0

str1 = str2 字符串相同为真

str1 != str2 不相同为真

arg1 op arg2

-eq 相等
-ne 不等
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于

逻辑操作


-a and
-o or

两个好的习惯

X${str1} == X${str2} 字符串比较如果一个为空,那么会错误展开,可以增加前缀防止
变量取值放在””之间,理由同上

分支

if/then/elif/else/fi

#!/bin/bash
# ##################
echo “if..else if fi”
read num
if [[ $num -eq 100 ]]; then    #语句放在同一行时应当以分号隔开
    #statements
    echo “num=100”
elif [[ $num -lt 100 ]]; then
    #statements
    echo “num<100”
else
   # echo “num>100”
  : #空体应当是用冒号,,冒号作为一个命令,结果总是为真
fi

更好做法

[  ] && {}
或者[  ] || {}

case命令

case/esac

case $_op in
    “+” )
    (( sum=$num1+$num2 ))
    printf “$num1 $_op $num2 = %s\n” “$sum”
    ;;
  “+”)
  :
  ;;
  *)
  ;;

循环语句

do/done用于标识一个语句块的开始和结束,可以放在for行用分号隔开

#!/bin/bash
for i in {a..z}
do
    echo “printf val is : $i”
done

一个例子:1+2+..+100=1050

#!/bin/bash
str=`seq 1 1 100 | tr ‘\n’ ‘+’ | sed ‘s/+$/\n/’`
printf ${str}=
echo `seq 1 1 100 | tr ‘\n’ ‘+’ | sed ‘s/+$/\n/’ | bc `

执行结果

1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100=5050

另一种实现方式
sum=0
str=””
for (( i = 0; i < 101; i++ )); do
    #statements
    (( sum = $i + $sum))
    str=$str${i}
    if [[ $i -eq 100 ]]; then
        #statements 
        break
    fi
    str=$str’+’
done
echo ${str}=$sum

while [ : ];do :;done

位置参数和特殊变量

$0 位置参数0
$1 …
$2 …

$# 相当于参数个数argc-1
$@参数列表…  $1$2$3….
$* 同上
$?上一条命令的exitstatus
$$当前shell的进程号
位置参数可以使用shift命令左移(覆盖前边的n个参数)会改变$#  $@

函数

函数定义

FUNCNAME(){
}
function关键字可选
函数调用eg is_dir    #不需要参数,参数获取使用$@

#!/bin/bash
function is_dir(){
    local dir=$1
    if [[ -d $dir ]]; then
        #statements
        return 0
    else
        return 1
    fi
}

调试
-n 读一遍脚本中命令但不执行,用于检查脚本中的语法错误
-v
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

三种方法使用

#/bin/bash -x
$ sh -x ./test.sh
在脚本中使用set -x 和 set +x 对脚本中某一段代码进行跟踪

数组

bash不支持多维数组,并且没有限定数组大小.(无越界之说)下标从0开始

定义:

array_name=(value1..valuen)
或者
array_name[0]=””
array_name[3]=””
array_name[6]=””

读取
${arrname[index]}
echo ${arr[*]}
获取字符串长度或者数组长度
i=${#arr[@]}

点赞