Bootstrap

shell脚本的学习

shell和shell脚本

  从程序员的角度来看,shell本身就是一种C语言编写的程序,从用户角度来看,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以使用shell脚本来一次执行多个命令。
  Linux的shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C shell (/usr/bin/csh)、K shell(/usr/bin/Ksh)等等,在本文中,我们关注的重点是Bash,由于易用和免费,Bash在日常工作中被广泛的使用;同时,Bash也是大多数Linux系统默认的Shell。

一、Shell实例和执行

1、hello world

#指定使用bash来解释这个shell脚本
#!/bin/bash

#shell脚本不需要指定变量的类型
str="hello world"

#使用$来引用这个变量的值,echo打印命令
echo $str

执行脚本
在这里插入图片描述
可以看到有权限限制,我们可以把这个sh文件加上可执行权限,使用chmod
在这里插入图片描述
也可以使用bash 加上shell脚本:
在这里插入图片描述

2、简单的加法

#!/bin/bash

var1=1
var2=2

#这样只能做简单的拼接
total=$var1+$var2
echo $total

#这样也是只能做简单的拼接,``这个不是单引号,他叫做命令置换符,他是ESC键的下面一个
total=`expr $var1+$var2`
echo $total

var=$var1$var2
echo $var

#因为expr是一个命令 var1 +号 和var2都是参数,所以必须使用空格隔开
total=`expr $var1 + $var2`
echo "total=$total"

在这里插入图片描述

二、shell的条件判断

1、if语句

用一个if语句来判断该系统是什么系统

#!/bin/bash

SYSTEM=`uname -s`

if [ $SYSTEM == "Linux" ] ; then
        echo "Linux System"
elif [ $SYSTEM == "FreeBSD" ] ; then
        echo "FreeBSD System"
elif [ $SYSTEM == "Solaris" ] ; then
        echo "Solaris System"
else
        echo "Unkonw System"
fi
#if 和 fi 相当于{},因为在shell里面和C语言里面的{}含义不同,所以不能使用
#类似的还有switch语句中的 case 和 esac

在这里插入图片描述
注意: 在if的后面必须要有一个空格,然后在[]的左右两边都必须要有一个空格
不然会报错的:
在这里插入图片描述
还有一个点是:可以只用一个=来判断是否等于,但是等号两边必须要有等号,没有等号会被认为是赋值。(箭头处应该有空格)
在这里插入图片描述

#!/bin/bash

# gt(>) lt(<) eq(=) ge(>=) le(<=)
#因为<>号里面会被认为是重定向的标志,所以不能使用

var=5

if [ $var -gt 5 ] ; then
        echo "var > 5"
elif [ $var -le 5 ] ; then
        echo "var <= 5"
else
        echo "I don't konw"
fi

在这里插入图片描述

2、Shell常见的判断

1、字符串的判断

在这里插入图片描述

2、数字的判断

在这里插入图片描述

3、文件的判断

在这里插入图片描述

#!/bin/bash

#判断是否存在
if [ -s if1.sh ] ; then
#判断是否有执行权限
        if [ -x if1.sh ] ; then
                echo "./if1.sh"
        else
                echo "bash if1.sh"
        fi
fi

因为if1.sh我没有给它加执行权限,所以应该会输出 bash if1.sh,看看结果:
在这里插入图片描述

4、逻辑判断

在这里插入图片描述
把上一个例子的两个if合起来

#!/bin/bash

#判断是否存在并且是否可执行
if [ -s if1.sh -a -x if1.sh ] ; then
        echo "if1.sh -s -x"
else
        echo "unkonw if1.sh"
fi

应该打印下面一个结果
在这里插入图片描述

三、Shell switch/case

完成一个和第一个if例子相同功能的事情

#!/bin/bash

SYSTEM=`uname -s`

#shell中不用switch
#两个;;代表break
#*代表default
#esac和case配对
case $SYSTEM in
        Linux)
                echo "Linux System"
                ;;

        FreeBSD)
                echo "FreeBSD System"
                ;;

        Solaris)
                echo "Solaris System"
                ;;

        *)
                echo "Unknow System"
                ;;
esac

在这里插入图片描述

四、shell循环

1、for循环

#!/bin/bash

#使用seq命令可以参数一个序列然后完成遍历
for i in `seq 1 10`; do
        echo $i

done


#打印当前路径下的所有文件名
for file in `ls`
do
        echo $file
done

在这里插入图片描述

2、while循环

#!/bin/bash

min=1
max=10

while [ $min -le $max ]
do
        echo $min
        min=`expr $min + 1`

done

同样需要注意[]左右两边的空格
在这里插入图片描述

五、shell的参数解析

1、参数值

#!/bin/bash

#参数个数
echo "Arguments count :$#"
#参数列表
echo "Arguments List :$*"
#shell文件名
echo "argv[0] : $0"
#第一个参数
echo "argv[1] : $1"
#第二个参数
echo "argv[2] : $2"

别的我就不写了
在这里插入图片描述

2、函数

#!/bin/bash


#和C语言不一样的是函数中不需要确定参数类型,也不用确定参数的个数
function test()
{
        echo "function arguments count: $#"
        echo "function arguments list : $*"

        echo "function 1st argument : $1"
        echo "function 2rd argument : $2"
}

test hehe haha

在这里插入图片描述

六、shell其他应用

1、shell调试 代开和关闭

set -x 和 set +x可以在shell脚本中打开调试和关闭调试

#!/bin/bash


#和C语言不一样的是函数中不需要确定参数类型,也不用确定参数的个数
function test()
{
		#打开调试
        set -x
        echo "function arguments count: $#"
        echo "function arguments list : $*"
        #关闭调试
        set +x
        echo "function 1st argument : $1"
        echo "function 2rd argument : $2"
}

test hehe haha

在这里插入图片描述

也可以使用bash -x xxx.sh来使得整个shell脚本都打开调试
在这里插入图片描述

2、shell段注释

:<< EOF

EOF

#!/bin/bash


#和C语言不一样的是函数中不需要确定参数类型,也不用确定参数的个数
function test()
{
        echo "function arguments count: $#"
        echo "function arguments list : $*"

:<<EOF
        echo "function 1st argument : $1"
        echo "function 2rd argument : $2"
EOF
}

test hehe haha

在这里插入图片描述
单句注释就是#号,但是有的时候#有特殊的作用,比如第一句使用bash来解释执行shell的语句就不是注释,但是百分之99的#都是注释。

3、source 或 .命令 让INI格式文件生效

总结

为什么我要学习shell呢,主要是因为我要写一个开机自启动的脚本让我的项目开机自启动,因为启动我的项目不止需要一条命令,所以shell脚本可以很好的解决这个问题。一步一步学习,学习了shell之后也可以完成除了开机自启动的脚本外的东西了。

;