linux-shell编程

Shell编程概述

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

每个Linux系统的用户可以拥有他自己的用户界面或Shell,用以满足他们自己专门的Shell需要。同Linux本身一样,Shell也有多种不同的版本。主要有下列版本的Shell:

  • Bourne Shell:是贝尔实验室开发的。
  • BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell。
  • Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。
  • C Shell:是SUN公司Shell的BSD版本。
  • Z Shell:The last shell you’ll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。

不论是哪一种Shell,它最主要的功用都是解译使用者在命令列提示符号下输入的指令。Shell 的另一个重要功用是提供个人化的使用者环境,这通常在 shell 的初始化档案中完成(.profile、.login、.cshrc、.tcshrc 等等)。这些档案包括了设定终端机键盘和定义窗口的特征;设定变量,定义搜寻路径、权限、提示符号和终端机类型;以及设定特殊应用程序所需要的变量,例如窗口、文字处理程序、及程序语言的链接库。Shell 也能当解译性的程序语言(interpreted programing language)。Shell 程序,通常叫做命令文件,它由列在档案内的命令所构成。此程序在编辑器中编辑(虽然也可以直接在命令列下写作程序,online scripting),由 UNIX 命令和基本的程序结构,例如变量的指定、测试条件、和循环所构成。

Shell执行步骤

Shell的编写流程:用编辑器编写Shell脚本文件;赋予文件可执行权限;执行及调试。

一个简单的例子:

#!/bin/bash

echo "Hello World!"

以上文件名为hello.sh,在终端输入命令即可运行脚本。

# 赋予权限
chmod a+x hello.sh
# 执行
./hello.sh
# 结果
Hello World!

关键字

Shell常用关键字如下:

  • echo:打印文字到屏幕
  • exec:执行另一个Shell脚本
  • read:读标准输入
  • expr:对整数型变量进行算术运算
  • test:用于测试变量是否相等、 是否为空、文件类型等
  • exit:退出

脚本实例:

#!/bin/bash
# 读入变量
read VAR
echo "VAR is $VAR"

# 计算变量
expr $VAR - 1

# 测试字符
if test "Hello"="Hello World"; then
	echo "True"
else
	echo "False"
fi

# 测试整数
if test $VAR -eq 10; then
	echo "True"
else 
	echo "False"
fi

# 测试目录
if test -d ./test; then
	echo "True"
else
	echo "False"
fi

# 执行其他shell脚本
exec ./hello.sh

# 退出
exit

数字的比较:

-eq 相等(baiequal)

-ne 不等(not equal)

-gt 大于(dugreater than)

-lt 小于(less than)

-ge 大于等于 (greater than or equal)

-le 小于等于 (less than or equal)

字符串的比较:

[ $str1 = $str2 ] 等于

[ $str1 != $str2 ] 不等于

[ -z $str ] 空字符串返回true

[ -n $str ] 或者 [ $str ] 非空字符串返回true

Shell变量

Shell变量分为用户自定义、预定义和环境变量三种。一般以一下方式定义变量:“变量名=变量值”,变量名一般大写,且等号两边不能空格,变量调用使用“$变量名”实现。

用户自定义变量

这种变量只支持字符串类型,不支持其他字符、浮点等类型,常见有以下3个前缀:

  • unset:删除变量
  • readonly:标记智度变量
  • export:指定全局变量

脚本实例:

#!/bin/bash
#定义普通变量
CITY=SHENZHEN

#定义全局变量
export NAME=cdeveloper

#定义只读变量
readonly AGE=21

#打印变量的值
echo $CITYecho $NAME 
echo $AGE

#删除CITY变量
unset CITY

#不会输出
SHENZHEN echo $CITY

预定义变量

预定义变量用来获取命令行的输入,常用的有:

  • $0 :脚本文件名
  • $1-9 :第 1-9 个命令行参数名
  • $# :命令行参数个数
  • $@ :所有命令行参数
  • $* :所有命令行参数
  • $? :前一个命令的退出状态,可用于获取函数返回值
  • $$ :执行的进程 ID

脚本实例:

#!/bin/bash 
echo "print $"
echo "\$0=$0"
echo "\$1=$1"
echo "\$2=$2"
echo "\$#=$#"
echo "\$@=$@"
echo "\$*=$"
echo "\$$=$$"
echo "\$?=$?"

环境变量

环境变量默认存在,一般包含下面几个:

  • HOME:用户主目录
  • PATH:系统环境变量 PATH
  • TERM:当前终端
  • UID:当前用户 ID
  • PWD:当前工作目录,绝对路径

Shell运算

Shell比较常见的运算包括以下4中,功能都是将m+1:

  • m=$[ m + 1 ]
  • m=`expr $m + 1` #用`字符包括起来
  • let m=m+1
  • m=$((m+1))
#!/bin/bash m=1
m=$[m+ 1]
echo $m m=`expr $m+1`
echo $m
#注意:+号左右不要加空格
let m=m+1
echo $m m=$((m+1))
echo $m

在Shell编程中如何运算浮点数?

为了要计算小数,就需要通过bc命令扩展。

例如:

echo "scale=2; 10/3" | bc

在脚本里,可以把上述运算结果放在变量中:

export c=$(echo "scale=2;  10/3" | bc)
echo $c

Shell语句

shell语句通常包括顺序, 判断和循环语句。

if语句

Shell编程中if语句与C语言类似,用于程序分支,也可构成分支嵌套形式。

脚本实例:

#!/bin/bash 
read VAR
#下面这两种判断方法都可以,使用[]注意左右加空格
#if test $VAR-eq 10
if [ $VAR-eq 10 ] 
then 
	echo "true"
else 
	echo "false"
fi

case语句

case语句格式较复杂,请注意使用细节。

脚本实例:

#!/bin/bash 
read NAME
case $NAME in
	"Linux")
	echo "Linux"
	;;
	"cdeveloper")
	echo "developer"
	;;
	*)
	echo "other"
	;;
esac

for循环

Shell编程中for语句与C语言类似,用于程序循环,也可构成循环嵌套形式。

脚本实例:

#!/bin/bash
#VAR依次代表每个元素
for VAR in 1 23
do 
	echo $VAR 
done
#普通for循环
for ((i=1;i<=3;i++))
do 
	for((j=1;j<=4;j++))
	do 
		echo $[$i*$j]
	done
done

while循环

Shell编程中while语句与C语言类似,用于程序循环,注意与for语句区别。

脚本实例:

#!/bin/bash
VAR=1
#如果VAR小于10,就打印出来
while [ $VAR -it 10 ] 
do 
	echo $VAR
	#VAR自增1
	VAR=$[ $VAR + 1 ]
done

until循环

until语句与之前的循环语句不同点是其结束条件为1(真)。

脚本实例:

#!/bin/bash 
i=0
#i大于5时,循环结束;
untill [[ "$i" -gt 5 ]]
do 
	echo $i
	i=$[ $i + 1 ]
done

break, continue语句

Shell的break语句作用是跳出循环, continue语句作用是跳过本次循环。

脚本实例:

#!/bin/bash
for VAR in 1 2 3
do
	# 如果VAR等于2就跳出循环
	if [ $VAR -eq 2 ] 
	then 
		break
        fi
   	        echo $VAR 
done

Shell函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

函数的定义及调用

Shell函数定义有2种常见格式

#!/bin/bash 
function hello_world()
{
	echo "hello world fun"
	echo $[ $1+$2 ]
	return 1
}
hello()
{
	echo "hello fun"
}

hello

hello_world 1 2

FUN=`hello_world 1 2`
echo $FUN

获取函数的返回值

利用变量预定义变量 $? 获得函数返回值。

定义本地变量

在函数中使用**local **定义本地变量。

Shell调试

使用以下命令检查脚本是否有语法错误:

bash -n **.sh

使用以下命令执行并调试脚本:

bash -x **.sh

Shell数组

Shell只支持一维数组,但在数组中可以存储不同类型的元素。数组初始化时不需要定义数组大小。与大部分编程语言类似,数组元素的下标由0开始。Shell数组用括号()来表示,元素用空格符号分割开。

#!/bin/bash
my_array=(A B "CDE" 8)
echo "第一个元素为:${my_array[0]}"
echo "第二个元素为:${my_array[1]}"
echo "第三个元素为:${my_array[2]}"
echo "第四个元素为:${my_array[3]}"

echo "数组的元素为:${my_array[*]}"
echo "数组的元素为:${my_array[@]}"

echo "数组元素个数为:${#my_array[*]}"
echo "数组元素个数为:${#my_array[@]}"
posted @ 2020-08-07 20:56  漫漫长夜何时休  阅读(192)  评论(0编辑  收藏  举报