Linux shell script编程

Linux shell script编程

什么是shell script

shell script是利用shell的功能所写的一个程序,这个程序使用纯文本文件,将一些shell的语法与命令写在里面。

shell script可以简单被看成是批处理文件,也可以被说成是一个程序语言,且这个程序语言由于都是利用shell与相关工具命令,所有不需要编译即可执行。

执行顺序

  • 命令的执行是从上而下,从左而右地分析与执行。
  • 命令,参数间的多个空白都会被忽略。
  • '#'可以作为批注(注释)
  • shell.sh文件必须要具备可读与可执行的权限(rx)

执行方式(重点)

利用bash(或sh)来执行脚本时,该script都会使用一个新的bash环境来执行脚本内的命令。其实script是在子进程的bash内执行的。

当子进程完成后,子进程内的各项变量或操作将会结束而不会传回到父进程中。

但是,如果使用source 来执行脚本,则在父进程中执行。sh02.sh结束后,其变量没有消失。

source sh02.sh

写程序的良好习惯

一个例子:

#!/bin/bash
# Program:
#     点明这个脚本的作用
# History:
#     指出修改历史
# 指出主要环境变量
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin:~/bin
export PATH

...(正文)

相关语法

shell script的默认变量($0, $1…)

command opt1 opt2 opt3
如:
bash sh01.sh one two three

其中:

$0:表示命令本身
$1:表示命令后第一个参数
$2:表示命令后第二个参数
$#:表示参数的个数(不包括$0)

加减乘除

用以下方式赋值

变量 = $((计算式))

读入用户输入

read -p "Please input the data: " data # 提示用户输入

判断式

首先介绍一个命令test,可以用来检测文件的相关属性。如下图所示:
Linux shell script编程_第1张图片

常用的测试标志:

关于文件类型:

测试标志 代表意义
-e 该文件名是否存在
-f 该文件是否存在且为文件
-d 该文件名是否存在且为目录

关于文件的权限检测:

测试标志 代表意义
-r 检测该文件名是否存在且具有“可读”的权限
-w 检测该文件名是否存在且具有“可写”的权限
-x 检测该文件名是否存在且具有“可执行”的权限
-u 检测该文件名是否存在且具有“SUID”的权限
-g 检测该文件名是否存在且具有“SGID”的权限
-k 检测该文件名是否存在且具有“Sticky bit”的权限

两个文件之间的比较:

测试标志 代表意义
-nt newer than 判断file1是否比file2新
-ot older than 判断file1是否比file2老
-ef 判断file1和file2是否为同一个文件,主要是判断是否指向同一个inode(硬连接)

多重条件判定:

测试标志 代表意义
-a 两个条件同时成立
-o 任何一个条件成立
反向

例子:

read -p "Input a file name: " filename
test -e $filename && echo "exist" || echo "Not exist" 

使用判断符号[]

[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK"

注意空格:

[(空格)"$yn"(空格)==(空格)"Y"(空格)]

注意引号

  • 在中括号[]内的每个组件都需要有空格键来分割
  • 在中括号内的变量,最好都以双引号括号起来
  • 在中括号内的常量,最好都以单或双引号括号起来
    (所以,用双引号最方便)

if … than

if [(空格)条件判断式 (空格)]; then
	内容
fi # 表示结束if

例如:

if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
  ...
fi

if else

if [ 条件判断式 ] ; then
	...
else
	...
fi
if [ 条件判断式 ] ; then
	...
elif
	...
else
	...
fi

case

case $变量名称 in
	"第一个变量内容")
		程序段
		;;
	"第二个变量内容")
		程序段
		;;
	*)
		不包含第一或者第二变量内容的
		exit 1
		;;
esac

例子

case $1 in
	"one" )
		echo "You input one"
		;;
	"two:)
		echo "You input two"
		;;
	*)
		echo "You input others"
		;;
esac

函数

function fname(){
	程序段
}

由于shell script 执行顺序是由上到下,由左到右,因此function需要写在最前面。在script中调用的时候,传参方式类似bash 执行script。
例子:

function myfun(){
	echo "you input: " $1
	# $0是函数名
}

myfun abc

循环

while [ condition ]
do
	...
done

例子:

s=0
i=0
while [ "$i" != "100" ]
do
	i=$( ($i+1) )
	s=$( ($s+$i) )
done
for var in con1 con2 con3
do
	...
	第一次循环时,$var的内容是con1
	第二次循环时,$var的内容是con2
	...
done

例子

for sitenuu in $(seq 1 100) # seq为连续的意思,从1到100
do
	
done

for ( (初始值; 限制值; 执行步长) )
do
	...
done

例子

for ( (i=1; i<=$nu; i=i+1) )
do
	...
done

shell script的追踪和调试

sh [-nvx] scripts.sh
-n:不要执行script,仅查询语法的问题
-v:在执行script前,先将script的内容输出到屏幕上
-x:将使用到的script内容显示到屏幕上

你可能感兴趣的:(操作系统,Linux)