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[@]}"