shell学习笔记(语法)

     shell脚本中的基本语法包括判断,条件,循环,函数,位置参数和特殊变量等等,下面我们就一一介绍吧


1.判断:test 语句 和 [ 

test语句和[ 都可以用于判断一条语句的真假,不过shell和c语言有区别,一定要切记在shell中:真返回0,假返回1

举个例子吧:

#!/bin/bash
val=10                                                                          
test $val -gt 9
echo $?

test $val -gt 10
echo $?

[ $val -gt 9 ] 
echo $?

[ $val -gt 10 ]
echo $?

shell学习笔记(语法)_第1张图片               

还有一些测试命令是比较常用的:

[ -d DIR ] : 如果DIR存在并且是一个目录则为真
[ -f FILE ] : 如果FILE存在且是一个通文件则为真
[ -z STRING ] : 如果STRING的长度为零则为真
[ -n STRING ] : 如果STRING的长度非零则为真
[ STRING1 = STRING2 ] : 如果两个字符串相同则为真
[ STRING1 != STRING2 ] : 如果字符串不相同则为真
我测试代码如下:

#!/bin/bash
[ -d script.sh ]  #是否是目录
echo $?
[ -f script.sh ]  #普通文件
echo $?
STRING="" 
[ -z STRING ]  #string的长度为0则真
echo $?
[ -n STRING ] #stirng长度非0则真
echo $?
STRING1="haha"
STRING2="hehe"
[ STRING1 = STRING2 ] #两字符串长度是否相等
echo $?
[ STRING1 != STRING2 ] #两字符串长度不等返回真
echo $?
[ ! -d script  ] #非
echo $?
[  -n STRING  -a  -z STRING  ] #与
echo $? 
[  -n STRING  -o  -z STRING  ] #或
echo $?
shell学习笔记(语法)_第2张图片

2.条件:if/then/elif/else/fi语句,这是shell里面的if语句,废话不多说,请看代码:

#!/bin/bash
if [ -d script.sh ];then
        echo "is dir"
elif [ -f script.sh ]
    then
        echo "is file"
fi

if : ;then
        echo "/ is always true"
fi

echo "please input your id:"
read id
echo "please input your password"
read password


if [ ${id} -eq 1 ];then
        if [ ${password} -eq 2 ];then
                echo "you are right"
        else
                 echo "error"
        fi  
else
        echo "try again"
fi
shell学习笔记(语法)_第3张图片
     需要注意if语句的格式,如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了, 另外,

then后面有换行,但这条命令没写完,Shell会自动续行,把下一行接在then后面当作一条命令处理。和[命令一样,

要注意命令和各参数之间必须用空格隔开。:是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真。

case/esac语句,和C语言的switch语句类似,其语法如下:

#!/bin/bash
read val 
case $val in
        a)  
        echo "it is a"
        ;;  
        b)  
        echo "it is b"
        ;;  
esac

其中read命令的作用是等待用户输入一行字符串,将该字符串存到一个Shell变量中


3.循环语句

循环语句常见的有for,while等等

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

for ((i=0;i<10;i++))
do
        echo "print val is:$i"
done
shell学习笔记(语法)_第4张图片

4.位置参数和特殊变量:

echo $0       #可执行文件名 ,相当于C语言main函数的argv[0]   
echo $1 $2  #这些称为位置参数(Positional Parameter),相当于C语言main函数 的argv[1]、argv[2]...
echo $#    #相当于C语言main函数的argc - 1,注意这里的#后面不表示注释(不包扩可执行文件名)
echo $$    #当前shell的进程id
echo $!     # Shell最后运行的后台Process的PID
echo $@    #表示参数列表"$1" "$2" ...(不包括 $0 ),例如可以用在for循环中的in后面。
echo $?      #退出码,上一条命令的Exit Status
    位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等 等,
原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1
#!/bin/bash
echo "$0 is done"
echo "$1 is done"
bash $1 &
echo "$#"
echo "$@"
echo "$$"
echo "$!"
echo "$?"
for val in $@
do
        echo "$val"
done


5.函数

shell中也有函数,和C语言中是有区别的:

        (1).函数定义中没有返回值也没有参数列表

        (2).注意函数体的左花括号{和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括
号}写在同一行,命令末尾必须有;号

        (3).Shell脚本中的变量不必先定义后使用但是函数必须先定义后调用

        (4).Shell函数中可以有参数,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变

量来提取参数

#!/bin/bash
fun()
{ 
        bash $1
        echo "$2"
        echo "haha i'am called"
}
fun test.sh 100 
shell学习笔记(语法)_第5张图片


以上是基本的语法了,最后我还要说的就是shell脚本的调试

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

使用这些选项有三种方法,
一是在命令行提供参数
    $ sh -x ./script.sh
二是在脚本开头提供参数
    #! /bin/sh -x

第三种方法是在脚本中用set命令启用或禁用参数
     set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。

#!/bin/bash -x
fun()
{ 
        bash $1
        echo "$2"
        echo "haha i'am called"
}
fun test.sh 100 


      好了,完了,如果大家有什么见解的话可以留言,但是我这里将到的还只是shell语法的冰山一角,

希望学透的人可以多搜集资料或者阅读相应书籍来达到目标,最后,祝大家编程快乐。


你可能感兴趣的:(shell,脚本)