bash脚本编写
编写bash脚本程序有两种方式。
1. 可以输入一系列命令让bash交互地执行它们,
2. 也可以把这些命令保存到一个文本文件中,然后将该文件作为一个程序来调用。
在执行shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例:
[root@localhost root]# ls a* -l; free;df
长shell命令行可以使用反斜线字符(\)在命令行上扩充,例如:
[root@localhost root]# echo "this is \> long command"
注意:“>”符号是自动产生,而不是输入。
bash脚本的建立
bash程序的每一行既可以是bash语句,又可以是bash命令。
1. 程序中的注释行以#符号开始,一直持续到该行的结束。
2. 程序中第一行# !/bin/bash,它是注释语句的一种特殊形式,#!字符告诉系统同一行上紧跟在它后面的那个参数是用来执行本文件的程序。
3. /bin/bash是默认的shell程序。
例:
[root@localhost root]# vi scp1
#!/bin/bash
#一个简单例子
who
pwd
date
bash脚本的运行
1. 运行/bin/bash命令并且把脚本文件名作为它的参数。
[root@localhost root]# /bin/bash scp1
如果你的搜索路径(PATH变量)中包含了/bin目录的话,可以简单地使用bash命令。
增加环境变量的方法:
export PATH=/bin/bash:$PATH
查看环境变量
echo $PATH
在变量中有/bin/bash就可以直接用bash命令了
bash scp1
2. 脚本文件加上可执行的权限。
[root@localhost root]# chmod u+x scp1
[root@localhost root]# ./scp1
实例补充
例:编写一个shell程序mkf ,此程序的功能是:
显示root下的文件信息,
然后建立一个kk的文件夹,
在此文件夹下新建一个文件aa,
修改此文件的权限为可执行。
分析:此shell程序中需要依次执行命令:
进入root目录:cd /root
显示root目录下的文件信息:ls –l
新建文件夹kk:mkdir kk
进入root/kk目录:cd kk
新建一个文件aa:vi aa #编辑完成后需手工保存
修改aa文件的权限为可执行:chmod a+x aa
回到root目录:cd /root
[root@localhost root]#vi mkf
#!/bin/bash
cd /root
ls –l
mkdir kk
cd kk
vi aa
chmod a+x aa
cd /root
Shell变量
bash与其他程序设计语言一样也采用变量来存放数据,使用变量之前通常并不需要事先为它们做出声明。
默认情况下,所有变量都被看作字符串并以字符串来存储,即使它们被赋值为数值时也是如此。
shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。
shell变量可以分为两大类型:环境变量和用户定义变量。
1.环境变量
环境变量用来定制你的shell的运行环境,保证shell命令的正确执行。
所有环境变量会传递给shell的子进程。
这些变量大多数在/etc/profile文件中初始化,而/etc/profile是在用户登录的时候执行的。
2.用户自定义变量
变量的声明
bash不需要声明变量,没有声明的变量默认为字符串。
但有些特殊类型的变量必须要声明。
命令语法:
declare [options] [name[=value]]
typeset [options] [name[=value]]
功能:声明变量,初始化变量,设置他们的属性。当不使用name和options的时候,显示所有shell变量和他们的值。
常用选项:
-a 声明“name”是一个数组
-f 声明“name”是一个函数
-i 声明“name”是一个整数
-r 声明“name”是只读的变量
-x 表示每一个“name”变量都可以被子进程访问到,称为全局变量
例:
[root@localhost root]# declare –i age=20
#声明整型变量age并赋值为20;
[root@localhost root]# declare –rx OS=LINUX
#声明只读全局字符串变量OS并赋值为LINUX;
[root@localhost root]# declare –i
#显示所有整型变量;
[root@localhost root]# declare –x
#显示所有全局变量;
变量的赋值
格式:变量名=值
例:
x=6
a=”hello world”
注意:
必须保证等号(=)前后没有空格。
字符串类型变量不需要预先声明
上例的x如果没有预先声明,它的值6是一个字符串,你可以用declare –i查找下是否有x。
变量引用
在shell中,可以通过在变量名前加一个$符号来访问它的内容。
如:
a=”hello world”
echo “A is: $a”
一个变量给另一个变量赋值可以写成:
变量2=
变量1例如:x=
i
例:
[root@localhost root]#n=20
[root@localhost root]#n=n+30
[root@localhost root]#echo $n
n+30#显示的结果
可知默认情况下是字符串类型
例:
[root@localhost root]#declare –i n
[root@localhost root]#n=20
[root@localhost root]#n=n+30 或n=$n+30
[root@localhost root]#echo $n
50
单引号、双引号和反斜杠的使用
使用双引号可引用除字符$、`、\外的任意字符或字符串。对大多数的元字符(包括*)都将按字面意思处理。如果用双引号“”将值括起来,则允许使用$符对变量进行替换。字符串通常都被放在双引号中,以防止它们被空白字符分开。
如果用单引号‘’将值括起来,则不允许有变量替换,而不对它做shell解释。
反斜杠\用来去除某些字符的特殊含义并把它们按字面意思处理,其中就包括$。
例2.2 下面例子可以解释双引号、单引号和反斜杠的含义。
[root@localhost root]# BOOK=”linux book”
[root@localhost root]# MSG1=’$BOOK’
[root@localhost root]# MSG2=“$BOOK”
[root@localhost root]# MSG3=“\$BOOK”
[root@localhost root]# echo MSG1 MSG2 MSG3
MSG1 MSG2 MSG3
[root@localhost root]# echo $MSG1 $MSG2 $MSG3
$BOOK linux book $BOOK
命令替换
当一个命令被包含在一对括号里并在括号前加上 符号,如 (command),
或者被包含在反引号(如
command`)中的时候,shell把它替换为这个命令的输出结果。这个过程被称为命令替换
例
[root@localhost root]#pwd
/root/d1
[root@localhost root]# cmd1=pwd
[root@localhost root]# echo “The value of command is: $cmd1.”
The value of command is: pwd.
[root@localhost root]# cmd1=$(pwd)
[root@localhost root]# echo “The value of command is: $cmd1.”
The value of command is: /root/d1.
#或者
cmd1='pwd'
命令替换适用于任何命令。
在下面的例子中,在echo命令执行前,date命令的输出就替换了$(date)。
[root@localhost root]# echo “The date and time is $(date).”
The date and time is 9月20日 10:23:16 UTC 2011.
输入命令
可以使用read命令来将用户的输入赋值给一个shell变量中。
语法:read [options] variable-list
常用选项:
-a name 把词读入到name数组中去。
-e 把一整行读入到第一个变量中,其余的变量均为null。
-n 在输出echo后的字符串后,光标仍然停留在同一行。
-p prompt 如果是从终端读入数据则显示prompt字符串。
说明:多个数据或变量时用空格分隔
- 若变量个数与数据个数相等,则对应赋值。
- 若变量个数大于输入数据个数,则没有输入数据的变量取空值。
- 若变量个数小于输入数据个数,则多余的数据赋给最后一个变量。
例:
[root@localhost bin]# read n1 n2 n3
first second third 1234 abcd
[root@localhost bin]# echo $n3
third 1234 abcd
[root@localhost bin]# echo $n1 $n2
first second
[root@localhost bin]# read n1 n2 n3
1 2
[root@localhost bin]# echo $n3
[root@localhost bin]# echo $n1 $n2
1 2
例:运行程序test3,从键盘读入x、y的值,然后做加法运算,最后输出结果。
[root@localhost bin]#vi test3
#!/bin/sh
read x y
z=`expr $x + $y`
echo "The sum is $z"
#设置权限:
[root@localhost bin]#chmod +x test3
#执行:
[root@localhost bin]# ./test3
45 78
The sum is 123
shell脚本位置参数的传递
位置参数
在Linux系统中运行命令或脚本程序时,可以在命令行中进行参数的传递。
在shell脚本传递命令行参数或位置参数中,前9个参数的值被存放在shell环境变量$1到$9中。可以使用这些变量名来引用这些参数的值。
变量$#包含了传递给一个执行中的shell脚本的参数的个数。
变量$*和$@都包含了所有参数的值。
变量$0包含了脚本文件或命令的名字。
例:
demo_arg程序如下
#! /bin/bash
echo “程序名: $0”
echo “命令传递参数个数:$#”
echo “参数值分别是:$1 $2 $3 $4 $5 $6 $7 $8 $9”
echo “所有参数: $@”
exit 0
[root@localhost root]# demo_arg a b c d e f g h i
程序名:demo_arg
命令传递参数个数: 9
参数值分别是: a b c d e f g h i
所有参数: a b c d e f g h i
Shift命令
当有脚本程序的参数多于9个时,用shift命令来使用多于9个的参数。每执行一次shift命令,变量0不变,从1开始位置变量左移一位,即把2,3,4 … 9 的值分别赋值给1,2,3 … 8。
命令句法:shift [N]
功能:把命令行参数向左移动N个位置
例:
demo_shift程序如下
#! /bin/bash
echo “程序名:$0”
echo “所有参数: $@”
echo “前三个参数:$1 $2 $3”
shift
echo “程序名:$0”
echo “所有参数: $@”
echo “前三个参数:$1 $2 $3”
shift 3
echo “程序名:$0”
echo “所有参数: $@”
echo “前三个参数:$1 $2 $3”
exit 0
[root@localhost root]# demo_shift 1 2 3 4 5 6 7 8 9 10 11 12
程序名: demo_shift
所有参数: 1 2 3 4 5 6 7 8 9 10 11 12
前三个参数:1 2 3
程序名: demo_shift
所有参数: 2 3 4 5 6 7 8 9 10 11 12
前三个参数: 2 3 4
程序名: demo_shift
所有参数: 5 6 7 8 9 10 11 12
前三个参数: 5 6 7