[Linux脚本]Shell脚本编程

Posted 凌星An

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux脚本]Shell脚本编程相关的知识,希望对你有一定的参考价值。

Shell脚本介绍

我们平时打开一个shell终端,通过键盘输入相应的命令,执行得到结果。
如下图:打开shell中断 ----输入pwd ----执行命令,输出所在路径

等上一条命令执行完毕之后,我们还可以输入命令,执行上述过程,这可以称之为互动模式。

而我们这里所要说的脚本,便于之相应,所谓脚本模式,就是将我们要使用的命令,写入一个文件(这个文件可以称之为脚本文件)中,由shell读取并执行,由此形成一个“自动化的过程”。

Shell编程

Shell脚本入门–Hello world!

shell脚本文件一般后缀为.sh ,我们创建一个脚本文件hello_wrold.sh

脚本文件的第一行永远是以 #! 开头,后面紧跟执行这个文件的某种解释器,/bin/bash就是解释器所在的路径
第三行,打印字符串Hello World! echo是相关命令

Shell脚本的执行

  1. bash hello_world.sh

    指定bash shell来解释此脚本,之前脚本的第一行可忽略
  2. 使用./ ,但需要给脚本加上可执行权限(脚本文件默认没有可执行权限)

变量

变量就是值可以变化,实质变量指向了一块存储与数据的内存空间。
shell变量是一种弱类型的变量,也就是说在声明变量时并不需要指定其变量类型,而且也不需要遵循C语言中“先声明再使用”的规定,任何时候只要想用就可以用

shell变量可以分为局部变量和环境变量,局部变量的作用域被限定在声明它们的Shell中,可以使用local内建命令来“显式”的声明局部变量,但仅限于函数内使用。换言之,每个Shell都有自己的变量空间,彼此互不影响。而环境变量不仅仅是对于该Shell生效,对其子Shell也同样生效。

变量命名规则

Shell中的变量必须以字母或者下划线开头,后面可以跟数字、字母和下划线,变量长度没有限制,且是区分大小写的
eg: ABC 和abc 是两个变量。

赋值和取值

变量名=值
注:变量名和值之间用等号相连,之间不能有任何空格,倘若值含有空格的时候,要用引号包含
eg:

name=andy

name="andy li"

取变量的值,需要使用 $ 符号,更加完美的是使用$

echo $name
echo $name

注意如果该变量是通过其他变量赋值,可以使用双引号
English_name="$name"

特殊变量

Shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定.

位置参数

即我们运行脚本文件的时候,输入的参数
eg: bash helloworld.sh hi 脚本文件名称是第一次参数 hi是第二个参数

shell的位置参数,脚本本身为 $ 0,第一个参数为 $ 1,第二个参数为 $ 2,第三个为 $ 3,以此类推。当位置参数的个数大于9时,需要用 $ 括起来标识,比如说第10个位置参数应该记为$10

eg:

  #!/bin/bash
  echo "Hello World!"
  echo $0
  echo $1


$# : 脚本参数的个数
$@和 $*表示脚本的所有参数(除脚本名称外)

脚本或者命令返回值 $?

Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行.
我们也可以通过这个变量,来判断上一次的命令是否执行成功。
eg:我们使用mv命令失败,打印$?的值,发现为1

只读变量

只读变量又称常量,是通过readonly内建命令(也可以通过declare -r)创建的变量。这种变量在声明时就要求赋值,并且之后无法修改。

test.sh: line 17: R: readonly variable
test.sh: line 21: R1: readonly variable

数组

数组是一种特殊的数据结构,可存储多个数据,每个数据称之为元素,对于每个元素,都可以用索引方式取出元素的值,Shell是弱类型语言不要求数组内存放的元素都是相同的类型,此外,最重要的一点是 shell只支持一维数组

数组定义

用declare -a 命令定义数组Array,下标从0开始

declare -a name
name[0]="andy"

直接初始化,不需要使用declare命令

age=(12,11)
year=([0]=2010 [2]=2020) #指定对应下标位置存储的元素值

数组内的元素取值

year=([0]=2010 [2]=2020)
# 单个取值   $数组名[索引]
echo $year[0]
 #取出所有元素的值
#$数组名[@]  ,值以空格进行隔开
echo $year[@]
#$数组名[*]    ,值以字符串的形式打印
echo $year[*]

#2010
#2010 2020
#2010 2020

获取数组长度

利用“@”或“*”字符,可以将数组扩展成列表,然后使用“#”来获取数组元素的个数

year=([0]=2010 [2]=2020)

echo $#year[@]
#2
echo $#year[*]
#2

流程控制

if判断

语法:

if [条件表达式]; then
        command
fi

if-else判断

if [条件表达式]; then
        command
else        
        command    
fi

if-elif-else判断

if [条件表达式]; then
        command
elif [条件表达式];then       
        command    
...
else
        command
fi

例子: 输入一个学生的成绩,90以上为A 60-80为B 小于60为C

#!/bin/bash

echo -n "输入学生成绩:"   #-n表示不会换行
read SCORE
echo "$SCORE"
if [ "$SCORE" -ge 90 ];   #-ge 表示score是否大于等于 90
then
    echo "A"
else
   if [ "$SCORE" -ge 60 ]; then
     echo "B"
   else
     echo "C"
   fi
fi

#!/bin/bash

echo -n "输入学生成绩:"
read SCORE
echo "$SCORE"
if [ "$SCORE" -ge 90 ]; then
    echo "A"
elif [ "$SCORE" -ge 60 ]; then
     echo "B"
else
     echo "C"
fi

循环

带有列表的for循环
语法:

for var in (list)
do
    command
done    

函数

函数是Shell脚本中自定义的一系列执行命令,一般来说函数应该设置有返回值(正确返回0,错误返回非0。对于错误返回,可以定义返回其他非0正值来细化错误

定义

在Shell中定义函数的方法如下(其中function为定义函数的关键字,可以省略):

#function为函数定义关键字,可省略
#FUNCTION_NAME函数名称
function  FUNCTION_NAME()
     命令

eg:

#!/bin/bash
#function关键字  SayHello函数名
function SayHello()
      echo "Hello"

#可以省略关键字function   
#SayName函数名
SayName()
    echo "an"


echo "call function SayHello"
SayHello
echo "call function SayName"
SayName
####################结果########
bash hello_world.sh 
call function SayHello
Hello
call function SayName
an

函数返回值

Shell中的函数可以使用“返回值”的方式来给调用者反馈信息(使用return关键字),不要忘了获取上一个命令返回值的方式是使用$?

#!bash/bin

#FILE=hello_world.sh
FILE=Hello_world.sh
function CheckFile()
    if [ -f "$FILE" ];then
        return 0
    else
        return 1
    fi


echo "Check File:$FILE is existing"
CheckFile
RET=$?

if [ "$RET" -eq 0 ];then
     echo "file exist"
else 
     echo "file not exist"
fi 

函数参数

在Shell中,向函数传递参数也是使用位置参数来实现的。
位置参数,我们在上面的章节 特殊变量中提到过。
因此,上面的检查文件是否存在的脚本可以改写为

#!bash/bin
function CheckFile()
    if [ -f $1 ];then
        return 0
    else
        return 1
    fi


echo "Check File:$1 is existing"
CheckFile
RET=$?

if [ "$RET" -eq 0 ];then
     echo "file $1 exist"
else 
     echo "file $1 not exist"
fi 

本文参考 《Linux系统命令及Shell脚本实践指南》 王军

以上是关于[Linux脚本]Shell脚本编程的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 片段

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]

Python如何调用别人写好的脚本

怎么用java代码调用远程Linux上的shell脚本

常用python日期日志获取内容循环的代码片段

Linux中执行shell脚本