Linux教程

Linux中Shell脚本编程

本文主要是介绍Linux中Shell脚本编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、shell定义与执行

shell既是一种应用程序,又是一种程序设计语言
shell是用户和Linux内核之间的接口程序

image

》作为应用程序:
交互式地解释、执行用户输入的命令,将用
户的操作翻译成机器可以识别的语言,完成相应
功能
》作为程序设计语言:
它定义了各种变量和参数,并提供了许多在
高级语言中才具有的控制结构,包括循环和分支
完成类似于windows下批处理操作,简化我们
对系统的管理与应用程序的部署

》Linux系统中提供了好几种不同的shell命令解释器,如sh、ash、bash等。
》一般默认使用bash作为默认的解释器。
》我们后面编写的shell脚本,都是由上述shell命令解释器解释执行的。

给文件添加权限
chmod  +  r  +  文件名       给该文件增加可读的权限
chmod  +  w  +  文件名       给该文件增加可写的权限
chmod  +  x  +  文件名       给该文件增加可执行的权限
./文件名   	 执行该文件
系统进行调用的shell脚本

》/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公告环境变量在这里设置,开始自启动的程序,一般也在这里设置。
》~/.bashrc
用户自己的家目录中的.bashrc
登录时会自动调用,打开任意终端时也会自动调用
这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等。

1.定义以 #!/bin/bash 开头
2.单个 # 代表注释当前行
3.bash 直接指定使用bash解释文件

例如:

chmod +x test.sh;
./test.sh
bash test.sh
.test.sh
》三种执行脚本的方式不同点:
1、./ 和 bash 执行过程基本一致,后者明确指定bash解释器去执行脚本,
脚本中 #! 指定的解释器不起作用。前者首先检测 #! ,使用 #! 指定的shell,
如果没有,使用默认的shell。
2、用 ./ 和 bash 去执行会在后台启动一个新的shell去执行脚本。
用 . 去执行脚本不会启动新的shell,直接由当前的shell去解释执行脚本。

二、shell变量

 *shell的变量按照变量的作用可以分为4类:
1.环境变量:主要保存与环境相关的参数
2.用户自定义变量:用在脚本内表达运行过程中数据
3.位置参数变量:用来向脚本中传递参数,变量名不能自定
义
4.预定义变量:是bash中已定义的变量,按照变量的作用范
围可以分为2类:
	1.全局变量:是环境变量,其值不随shell脚本的执行结束而消失
	2.局部变量:shell程序内部定义的,其使用范围仅限于定义
	它的程序,包括用户自定义变量、位置变量和预定义变量。

一、自定义变量

定义变量    变量名 = 变量值  如:num = 10
引用变量    $变量名               如:i = $num  把变量num的值付给变量i
显示变量    使用echo命令可以显示单个变量取值    如:echo $num
清除变量    使用unset命令清除变量    如:unset num

二、读取变量

read string  从键盘输入一个字符串赋值给变量string,若string没定义,则先定义再使用。

readonly string = 100   定义一个只读变量,只能在定义时初始化赋值,
			以后其值不能改变,不能被清除。

export STRING = 300   使用export说明的变量,会被导出为环境变量。其他shell均可使用。

传统上,所有环境变量均为大写
显示环境变量 使用env命令可以查看所有的环境变量
清除环境变量 使用unset命令清除环境变量

三、注意事项

1.变量名只能是英语字母、下划线、数字。开头不能是数字
	1_num = 10   错误
	num_1 = 10   正确
2.等号两边不能直接接空格符,若变量中本身就包含了空格,
则整个字符串都要用双引号、或单引号括起来;双引号内的特殊字符(即 $变量)
可以保留变量的特性,但是单引号内的特殊字符则仅为一般的字符,没有特殊意义。
name=aa bb		//错误
name="aa bb"		//正确
echo "$name is me"	//输出:aa bb is me
echo "$name is me"	//输出:$name is me

四、环境变量:

》shell在开始执行时就已经定义了一些和系统的工作环境有
关的变量,我们在shell中可以直接使用$name引用
》定义:
一般在~/.bashrc或/etc/profile文件中(系统自动调用的脚
本)使用export设置,允许用户后来更改
VARNAME = value ;export VARNAME
》传统上,所有环境变量均为大写
》显示环境变量
使用env 命令可以查看所有的环境变量。
》清除环境变量
使用unset 命令清除环境变量

常见环境变量:
HOME		用于保存注册目录的完全路径名
PATH		用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这目录,
		找到的第一个与命令名称一致的可执行文件将被执行
		PATH=$HOME/bin:/bin:/usr/bin;export PATH
HOSTNAME	主机名
SHELL		默认的shell命令解析器
LOGNAME		此变量保存登录名
PWD		当前工作目录的绝对路径名
······

image

五、预定义变量

预定义变量:
$#	传给shell脚本参数的数量
$*	传给shell脚本参数的内容
$1、$2、$3、...、$9	运行脚本时传递给其的参数,用空格隔开
$?	命令执行后返回的状态,"$?"用于检查上一个命令是否正确
	(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)
$0	当前执行的进程名
$$	当前进程的进程号,"$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复

image

脚本变量的特殊用法:"" `` ' \ () {}

》""(双引号):包含的变量会被解释
》''(单引号):包含的变量会当做字符串解释
》``(数字键1左面的反引号):反引号中的内容作为系统命令
,并执行其内容,可以替换输出为一个变量
$ echo "today is image "
today is 2012年07月29日星期日 12:55:21 CST
》\ 转义字符:
同c语言 \n \t \r \a等 echo命令需加-e转义
》(命令序列):
由子shell来完成,不影响当前shell中的变量
》{ 命令序列 }:---注意:“{”、“}”前后有一空格
在当前shell中执行,会影响当前变量
image

三、条件测试语句

》在写shell脚本时,经常遇到的问题就是判断字符串是否相等,
可能还要检查文件状态或进行数字测试,只有这些测试完成才能
做下一步动作
》test命令:用于测试字符串、文件状态和数字
》test命令有两种格式:
test condition 或[ condition ]
使用方括号时,要注意在条件两边加上空格
》shell脚本中的条件测试如下:
文件测试、字符串测试、数字测试、复合测试
》测试语句一般与后面讲的条件语句联合使用

*文件测试:测试文件状态的条件表达式
-e 	是否存在
-d 	是目录
-f 	是文件
-r 	可读
-w 	可写
-x 	可执行
-L 	符号连接
-c	是否字符设备
-b	是否块设备
-s 	文件非空

image

字符串测试:
test str_operator “str”
test “str1” str_operator “str2”
[ str_operator “str” ]
[ “str1” str_operator “str2”]
》其中str_operator可以是:
=	两个字符串相等
!=	两个字符串不相等
-z	空串
-n	非空串

image

测试数值格式如下:
test num1 num_operator num2
[ num1 num_operator num2 ]
》*num_operator可以是:
-eq 	数值相等
-ne 	数值不相等
-gt 	数1大于数2
-ge 	数1大于等于数2
-le 	数1小于等于数2
-lt 	数1小于数2

image

命令执行控制:
》&&:
command1 && command2
&&左边命令(command1)执行成功(即返回0)shell才执行&&
右边的命令(command2)
》||
command1 || command2
||左边的命令(command1)未执行成功(即返回非0)shell才
执行||右边的命令(command2)
例:
test -e /home && test -d /home && echo "true"
test 2 -lt 3 && test 5 -gt 3 && echo "equal"
test "aaa" = "aaa" || echo "not equal" && echo "equal"
多重条件判定:
-a (and)两状况同时成立!test -r file -a -x file,file同时具有r与x权限时,才为true.
-o (or)两状况任何一个成立!t t est -r file -o -x file,file具有r或x权限时,就传回true.
! 相反状态test ! -x file,当file不具有x时,回传true.

四、控制语句 if case for while until break

①====》
if [条件1];
then
    执行第一段程序
else
    执行第二段程序
fi
②====》
if [条件1];
then
    执行第一段程序
elif [条件2]
then
    执行第二段程序
else
    执行第三段程序
fi

image

case $变量名称 in
“第一个变量内容”)
    程序段一
    ;;
“第二个变量内容”)
    程序段二
    ;;
*)
    其它程序段
    exit 1
esac

image

for (( 初始值; 限制值; 执行步阶
))
do
    程序段
done
初始值:变量在循环中的起始值
限制值:当变量值在这个限制范围内时,就继续进行循环
执行步阶:每作一次循环时,变量的变化量

》declare是bash的一个内建命令,可以用来声明shell
变量、设置变量的属性。declare也可以写作typeset。
declare -i s 代表强制把s变量当做int型参数运算
image

for var in con1 con2 con3 ...
do
    程序段
done
第一次循环时,$var的内容为con1
第二次循环时,$var的内容为con2
第三次循环时,$var的内容为con3
......

image
image

while [ condition ]
do
    程序段
done
当condition成立的时候进入while循环,直到condition不成立时才退出循环。

image

until [ condition ]
do
    程序段
done
这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环。

image

 break
》break命令允许跳出循环。
》break 通常在进行一些处理后退出循环或case 语句
 continue
》continue 命令类似于break 命令
》只有一点重要差别,它不会跳出循环,只是跳过这个循环步

五、函数

》 有些脚本段间互相重复,如果能只写一次代码块而在任何地方都能引用那就提高了代码的可重用性。
》 shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。
》 定义函数的两种格式:
函数名() {
命令 ...
}
function 函数名() {
命令 ...
}
》 函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。
》 所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。

调用函数的格式为:
  函数名 param1 param2……
》 使用参数同在一般脚本中使用特殊变量
$1,$2 ...$9一样
》 函数可以使用return 提前结束并带回返回值
return 从函数中返回,用最后状态命令决定返回值。
return 0 无错误返回
return 1 有错误返回

image

这篇关于Linux中Shell脚本编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!