shell编程初步
1.通配符与文件名变量
符号 | 说明 |
* | 匹配任何字符和任何数目的字符组合 |
? | 匹配任何单个字符 |
[] | 匹配任何包含在括号里的单个字符 |
注意:正常的文件名中不应该出现这些字符。
2.输入、输出重定向
2.1、输入重定向
符号:<
用法:命令 < 文件名
功能:输入重定向是指把命令或可执行程序的标准输入重定向到指定的文件。也就是说输入可以不来自键盘,而来自一个指定的文件。
例子:
$ wc < man.conf
146 730 4709
2.2、输出重定向
符号:>
用法:命令>文件名
功能:输出重定向能把一个命令的输出重定向到一个文件里,而不在屏幕上显示。
例子:
注意:如果">"符号后指定的文件已经存在,那么这个文件将要被重写。
另外:如果要将一条命令的输出结果追加到指定的文件后面,可以使用追加重定向,操作符">>",格式:命令>>文件名
3、管道
符号:|
用法:命令|命令
功能:管道功能是将一个程序的输出作为另一个程序输入
例子:cat man.conf | grep "wsh" | wc -l
4、Shell脚本的执行
方法1:
格式:bash shell 程序名
方法2:
格式:bash < Shell程序名
相当于用重定向的方法执行程序
方法3:
格式:. *.sh
当用系统编辑器生成一个文件时,系统赋予的许可权都是644,可用chmod把*.sh程序权限更改为755。
5.Shell变量
5.1、用户自定义变量
5.1.1、用户自定义变量
符号:
用法:变量名=变量值
功能:自定义一个变量,并将其赋值为“变量值”
例子:$ MYNAME=ABC
$ echo $MYNAME
ABC
注意:在给变量赋值时"="两边一定不能使用空格。
另外:可以使用unset命令删除一个已经定义的变量。
5.1.2、参数置换的语法和功能
(1)语法:变量={参数:-word}
功能:这种变量的值等于某一个参数的值,如果该参数没有设置,怎变量的值就是word的值。
(2)变量={参数:=word}
功能:如果设置了参数,就用参数的值赋给变量,否则吧参数的值设置为word,然后再用word赋值。
(3)变量={参数:?word}
功能:如果设置了参数,则用参数的值赋给变量,否则就显示word并从Shell中退出;如果省略了word,则显示标准信息。此种变量要求一定等于某一个参数的值,如果没有该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
(4)变量={参数:+word}
功能:如果设置了参数,就用word置换变量,否则不进行置换。
5.2、环境变量
Shell在开始执行时就已经定义了一些和系统工作环境有关的变量,用户还可以重定义这些变量,常用的Shell环境变量如下:
(1)PWD:当前工作目录的绝对路径。
(2)PATH:用户保存用冒号分隔的目录路径名,Shell将按照PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
(3)UID:当前用户的是别字,取值是由数位构成的字串。
5.3、预定义变量
预定义变量和环境变量类似,唯一变的不同是预定义变量不能有用户重定义。常用的预定义变量如下:
(1)$0:当前进程的进程名。
(2)$!:后台运行的最后一个进程号。
(3)$?:命令执行后返回的状态,即指:上一条命令的返回代码,用于检查上一个命令执行是否正确,命令退出状态为0表示该命令正确执行,任何非0值均表示命令出错。
(4)$*:所有位置参数的内容。
(5)$#:位置参数的数量。
(6)$$:当前进程的进程号。
(7)$-:使用set及执行时传递给Shell的标志位。
(8)$@:
5.4、位置变量
位置变量是指在调用Shell程序的命令行中按照各自的位置决定的变量,值在程序名之后输入的参数。Shell取第一个位置变量替换程序文件中的$1,第二个替换$2,依次……。$0指的是Shell程序的文件名。
6.测试命令
符号:test
用法:test 需要测试的表达式
功能:如果成功会返回0,失败返回1;常用在两个整数值的比较、字符比较、文件操作(如文件是否存在以及读写权限的状态等),逻辑操作。
例子:如测试两个变量是否相等:
num1=2
num2=4
test $num1 -eq $num2
echo $?
0
常用的测试符及其相应的功能参数如下:
(1)数值测试:-eq 等于,-ge 大于等于, -gt 大于为真,-le 小于等于为真, -lt 小于为真,-ne 不等于为真。
(2)字符测试:= 等于为真, != 不等于为真, -z 字串 字符长度为0则为真,-n 字符 字符长度不为0则为真
(3)文件测试:-b 文件名 文件存在且为块特殊文件则为真, -c 文件名 文件存在且为字符型文件, -d 文件名 文件存在且为目录, -e 文件名 文件存在则为真,-f 文件名 文件存在且为普通文件则为真,-s 文件名 文件存在且至少有一个字符,-r 文件名 文件存在且可读, -w 文件名 可写, -x 文件名 文件存在且可执行。
注意:bash在使用test测试时提供了另一种标准的方法:用方括号将要测试的语句括起来,格式为[ 测试语句 ],并且左方括号‘[’的后面和右方括号 ]的前面一定要有空格。
例子:如:
$ [ $num1 -eq $num2 ]
$ echo $?
1
7.内部命令
符号:readonly
用法:readonly 变量名
功能:定义值读变量,应用于说明一个变量并为它赋一个特定的值后就不再改变该值的情况。
符号:export
用法:export 变量名
功能:定义全局变量。即export命令可以将一个局部变量供给Shell执行的其他命令使用。
符号:read
用法:read 变量名表
功能:从标准输入设备读入一行,分解为若干个字,然后赋给该命令中定义的变量。
8.Shell程序设计流程控制
8.1 符合结构
bash中可以使用一对花括号{}或圆括号()将多条命令符合在一起,是他们在逻辑上成为一条名命令。
(1)使用“{}”括起来的多条命令在逻辑上成为一条命令,一般出现在管道附“|”的左边。bash将从左到右依次执行各条命令,并将各自的输出结果汇集到一起,形成输入流,作为“|”后面的输入。注意:{}和[]的格式一样,必须有空格。
(2)bash执行“()”中的命令时,会再创建一个新的子进程,然后由这个子进程去执行“()”中的命令。如果不想让命令运行时对状态集合(如位置参数等)的改变影响到下面语句的执行,就应该把这些命令放在()中。注意:()前后都没有空格。
8.2 条件判断
(1)if条件语句
i 格式:
if 条件命令串
then
条件为真时执行
fi
ii 格式:
if 条件命令串
then
条件为真时执行
elif 条件命令串
then
命令串
else
then
命令串
fi
(2)case 条件选择
case string in
pattern1)
命令串;;
pattern2)
命令串;;
*)
其它命令串
8.3 循环控制
(1)for循环
for 变量名 in 参数1 参数2 参数3 ... 参数n
do
n个命令行
done
(2)while和until
while 条件命令串
do
n个命令行
done
until 条件命令串
do
n个命令行
done
8.4 shift命令
bash的位置参数变量为$1~$9,因此通过位置变量只能访问前9个参数,如果要想方位前9个参数之后的参数,就必须使用shift命令。如果shift命令后加整数,则可以一次进行多个移位。
例如:
#! /bin/bash
#this is a example for shift_add
if [ $# -eq 0 ]
then
echo no number!
exit 1
fi
export TOTAL=0
until [ $3 -eq 0 ]
do
TOTAL=$[TOTAL+$1]
shift
done
echo $TOTAL
9.Shell脚本中的函数