搞基础系列-Linux系统-shell脚本的编写

前言

作为一个Android开发者,可能大部分时间都放在了上层的代码编写和学习上,对于一些基础的东西像操作系统、网络、数据结构与算法还有设计模式可能了解不多,搞基础系列准备以个人的经验为出发,整理一些个人认为比较重要的,对工作有帮助的一些基础知识点,虽不能面面俱到,但力求包含重点常见知识,这不仅是一个分享,也是个人学习的记录和总结。

Linux学习路线

image

(这个路线图只是从自己的经验和实际出发得出的,个人觉得在平时可以用到和需要了解的知识,不求面面俱到,只要重点记忆突破。)

一.什么是是shell脚本

shell脚本和windows的批处理命令是一样的,shell脚本就是利用shell功能所写的一个程序,将shell命令组合在一起,同时利用判断、循环条件的语句进行判断等实现一些复杂的功能。有人说这和普通用的java,c++编程语言有什么区别?其实没什么区别,只不过利用shell脚本不需要搭建编译环境,更具有普适性,但是功能上相对于java,c++之类的高级语言能力较差。

二.基本脚本结构

学语言最基础的就是hello world了,这里也以这个例子为入口,看一下test.sh脚本。

#!/bin/bash
#这是个demo
echo -e "Hello World!\n"
exit 0

其中第一行#!/bin/bash声明了脚本使用的shell名称,这一行用来声明这个文件内的语法使用的是bash的语法。

第二行#这是个demo 其中#代表的就是注释。

第三行echo -e "Hello World!\n"则是一个shell命令,屏幕上输出Hello World

第四行exit 0用来告知shell脚本的执行结果,这有点类似于C++的main函数,最后有个int类型的返回值,通过它可以标记一些错误信息。该返回值可以在脚本执行后通过 $?获取,上面的脚本执行完后,在命令行输入echo $?可以看到返回的是0。

三.基本语法

任何一门语言的入门其实都是有一些套路的,最基本的一些语法就是如何定义变量,条件语句与循环语句的写法,函数的定义,这些是最基础的了,shell脚本语法的编写也是这个套路。

1.变量

1.1自定义变量

在脚本中自定义变量比较简单,看代码

#!/bin/bash
#定义变量
HELLO="hello"
echo -e "Hello World!\n"
echo $HELLO
exit 0

定义了一个变量HELLO,它的值是"hello",引用该变量的时候通过$变量名来获取

1.2调用脚本是传入的参数变量

当调用shell脚本时,可以传入一些参数进入到shell脚本。我们先修改一下shell脚本

#!/bin/bash
#这是个demo
echo -e "传入的参数个数 $# \n"
echo -e "传入的参数是$@ \n"
echo -e "第0个参数是$0 \n"
echo -e "第一个参数是$1 \n"
exit 0

调用该脚本./test.sh 1 2 3,输出结果如下

传入的参数个数 3

传入的参数是1 2 3

第0个参数是./test.sh

第一个参数是1

$#代表的是shell脚本文件后跟着的参数的数目,1 2 3有三个参数,所以输出为3;

$@可以获取所有的输入的参数

$0代表的是shell文件名

$1 $2 $3...可以依次获取分别对应1 2 3,用来获取每个一空格隔开的参数。

2.条件语句

2.1if语句

if语句是常见的判断语句,基本语法如下

#!/bin/bash
#这是个demo
# if [  ];then
# 语句
# elif [  ];then
# 语句
# else
# 语句
# fi
if [ $1 == 1 ];then
    echo -e hello one
elif [ $1 == 2 ];then
    echo hello two
else
    echo hello three
fi    

这里需要注意的是空格,if空格[空格$1空格==空格1空格];then在if和判断符号([])之间以及判断符号中基本上到处都是空格,不要漏掉。

2.2case...esac语句

这个就和高级语言中的switch case语句类似。

#!/bin/bash
#这是个demo
# case $变量名称 in
#   值1)
#     语句
#     ;;
#     值2)
#     语句
#     ;;
#     *)
#     语句
#     ;;
# esac     
case $1 in
    1)
  echo one
    ;;
    2)
  echo two
    ;;
    *)
  echo three
    ;;
esac

有一个需要注意的是*)就如同java swtich中的default,可以匹配任意值。

3.循环语句

3.1while do done和until do done

其中wile代表当条件满足的时候,进行循环,直到条件不满足时才停止。而until与while相反,它的意思是当条件满足的时候,就终止循环。

#!/bin/bash
#这是个demo
# while [ condition ]
# do
#   程序段落
# done


# until [ condition ]
# do
#     程序段落
# done      
Num=$1
while [ $Num != 3 ]
do
    echo $Num
    ((Num=Num+1))
done
echo 3
exit 0  

3.2for循环

for循环有两种写法,第一种如下所示

#!/bin/bash
#这是个demo
# for var in con1 con2 con3
# do
#   程序段
# done  
for var in  1 2 3
do
    echo $var
done    

第二种

#!/bin/bash
#这是个demo
# for (( 初始值; 限制值; 步长))
# do
#   程序语段
# done  
for (( i=1; i<3; i++))
do
    echo $i
done    

4.函数

#!/bin/bash
#这是个demo
# function fname(){
#   程序段
# }
function print(){
    echo "paramer 1 is $1 2 is $2"
}

print a b

可以看到函数里有$1和$2变量,这些变量和之前定义的来调用脚本是传入的参数变量是不同的,这里$1和$2代表的是传入的参数,当调用该函数的时候需要传入参数的时候直接在参数名的空格后传入就好,以空格隔开。

4.参考

《鸟哥的Linux私房菜》

image

关注我的公众号

推荐阅读更多精彩内容