James Yu


写了那么多的if else 依然未能参透其精髓。。。


shell基本语法总结

变量

#赋值=号左右不能有空格
a=11  
#使用变量,变量前加$
echo $a

#只读变量,声明变量前加readonly关键字
readonly a=2

#删除变量,变量前加unset
a=2  
unset a  

变量替换

语法 说明

${a}

直接获取变量的值,如”获取变量: ${a}"

${a:-word}

如果a不存在或者被unset,那么返回word,不改变a的值

${a:=word}

如果a不存在或者被unset,那么a的值为word

${a:?message}

如果a不存在或者被unset,message输出到标准错误输出,出现此message,shell脚本停止运行

${a:+word}

如果a已经被定义,返回word,不改变a的值

特殊变量

变量 说明

$0

当前脚本文件名称

$n

传给脚本或者函数参数,$1 表示第一个参数,$2表示第二个参数

$#

传给脚本或者函数的参数个数

$*

传给脚本或者函数的所有参数,形式"$1 $2 $3 $4"

$@

传给脚本或者函数的所有参数,形式"$1" "$2" "$3" "$4"

$?

上一个命令的执行结果,或者函数的返回值

$$

当前shell的进程ID

if ... else

#if
if [[ condition ]]; then  
    #statements
fi

#if ... else ... fi
if [[ condition ]]; then  
    #statements
else  
    #statements
fi

#if ... elif ... else ... fi
if [[ condition ]]; then  
    #statements
elif [[ condition ]]; then  
    #statements
else  
    #statements
fi

运算符

关系运算符(只适用于数字,或者字符串是数字)

运算符 说明

-eq

等于

-ne

不等于

-gt

大于

-lt

小于

-ge

大于等于

-le

小于等于

布尔运算符

运算符 说明

!

-o

-a

字符串运算符

运算符 说明

=

相等 [ $a = $b ]

!=

不相等 [ $a != $b ]

-z

长度是否为0 [ -z $a ]

-n

长度是否大于0 [ -n $a]

str

字符串是否为空 [ $a ]

文件测试运算符

运算符 说明

-b

[ -b $file ] 文件是否为块设备文件

-c

[ -c $file ] 文件是否为字符设备文件

-d

[ -d $file ] 文件是否为目录

-f

[ -f $file ] 文件是否为普通文件(非目录,非设备文件)

-g

[ -g $file ] 文件是否设置了SGID位

-k

[ -k $file ] 文件是否设置了粘着位

-p

[ -p $file ] 文件是否是命名管道

-u

[ -u $file ] 文件是否设置了SUID

-r

[ -r $file ] 文件是否可读

-w

[ -w $file ] 文件是否可写

-x

[ -x $file ] 文件是否可执行

-s

[ -s $file ] 文件是否为空

-e

[ -e $file ] 检测文件是否存在(包括目录)

case esac

#;;类似break,*类似default
case 值 in

匹配1)
    #command
    ...
    #command
    ;;
匹配2)
    #command
    ...
    #command
    ;;
*)
    #command
    ...
    #command
    ;;

 esac

#demo
option=1

case ${option} in  
      1)
        echo '1'
        ;;
      2)
        echo '2'
        ;;
      *)
        echo 'all'
    ;;
esac

for循环

for i in words; do  
    #statements
done

#demo

for i in 1 2 3 4  
do  
    echo $i
done  

while循环

while [[ condition ]]; do  
    #statements
done

#demo
count=1  
while [[ $count -lt 5 ]]; do  
    echo $count
    count=`expr $count + 1`
done

until循环

until [[ condition ]]; do  
    #statements
done

#demo
count=1  
until [[ $count -ge 5 ]]; do  
    echo $count
    count=`expr $count + 1`
done  

跳出循环

和其他语言一样,
可以使用break和continue

字符串

#字符串用单引号和双引号表示,
#单引号字符串原样输出,不支持转义
#双引号里面可以包含变量,可以包含转义符
str='string'  
str1="string ${str}"

#字符串拼接

hello="hello"  
world="world"  
echo $hello $world

#字符串长度
echo ${#hello} #输出5

#字符串提取
string="this is a string"  
echo ${string:5:11} #输出is a string

数组

#数组和其他语言一样,取的时候也是下标0,1,2...元素之间以空格分开
values=(1 2 3 4 5)  
values[6]=6  
values[7]=7  
for i in $values; do  
    echo $values[i]
done  
#输出1 2 3 4 5 6 7

#获取数组长度
length=${#values[@]}  
或者
length=${#values[*]}  

函数

#函数定义和调用
function_name () {  
    echo '3232'
    return 0 #返回值通过$?获取
}
function_name #输出3232

#函数删除

函数参数

#函数定义不需要指定参数,函数内部通过$n来获取参数

function_name() {  
    echo "first param is $1"
    echo "second param is $2"
}

function_name "param1" "param2"
comments powered by Disqus