[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脚本的执行
- bash hello_world.sh
指定bash shell来解释此脚本,之前脚本的第一行可忽略 - 使用./ ,但需要给脚本加上可执行权限(脚本文件默认没有可执行权限)
变量
变量就是值可以变化,实质变量指向了一块存储与数据的内存空间。
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脚本编程的主要内容,如果未能解决你的问题,请参考以下文章
每天三分钟搞定linux shell脚本10 字符串相关的if判断