作者: falcon 发表日期: 2006-04-03 18:32
复制链接
这里只是我自己的个人学习笔记哦,要是想系统的学shell,应该找一些比较系统的资料
这里有一篇好的:http://www.chinaunix.net/jh/24/628472.html
shell概述、Shell变量、位置参数、特殊符号、别名、各种控制语句、函数等Shell编程知识
执行Shell脚本的方式
1)输入重定向到bash: bash <exl
可以读入exl中的程序,并执行
2)以脚本名作为参数
其一般形式是:
$ bash 脚本名 [参数]
例如:
$ bash ex2 /usr/meng /usr/zhang
其执行过程与上一种方式一样,但这种方式的好处是能在脚本名后面带有参数,从而将参数值传递给程序中的命令,使一个Shell脚本可以处理多种情况,就如同函数调用时可根据具体问题给定相应的实参。
如果以目前Shell(以·表示)执行一个Shell脚本,则可以使用如下简便形式:
$ · 脚本名 [参数]
以Shell脚本作为Shell的命令行参数,这种方式可用来进行程序调试。
3)将Shell脚本的权限设置为可执行,然后在提示符下直接执行它。
具体办法:chmod 777 脚本名
Shell的执行原理
Shell
接收用户输入的命令(脚本名),并进行分析。如果文件被标记为可执行的,但不是被编译过的程序,Shell就认为它是一个Shell脚本。Shell将读
取其中的内容,并加以解释执行。所以,从用户的观点看,执行Shell脚本的方式与执行一般的可执行文件的方式相似。
因此,用户开发的Shell脚本可以驻留在命令搜索路径的目录之下(通常是“/bin”、 “/usr/bin”等),像普通命令一样使用。这样,也就开发出自己的新命令。如果打算反复使用编好的Shell脚本,那么采用这种方式就比较方便。
变量赋值
可以将一个命令的执行结果赋值给变量。有两种形式的命令替换:一种是使用倒引号引用命令,其一般形式是: `命令表`。
例如:将当前工作目录的全路径名存放到变量dir中,输入以下命令行:
$ dir=`pwd`
另一种形式是:$(命令表)。上面的命令行也可以改写为:
$ dir=$(pwd)
数组
bash只提供一维数组,并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标。下标可以是整数或算术表达式,其值应大于或等于0。用户可以使用赋值语句对数组变量赋值。对数组元素赋值的一般形式是:数组名[下标]=值例如:
$ city[0]=Beijing
$ city[1]=Shanghai
$ city[2]=Tianjin
$
也可以用declare命令显式声明一个数组,一般形式是:
declare -a 数组名
读取数组元素值的一般格式是:
${数组名[下标]}
例如:
$ echo ${city[0]}
Beijing
一个数组的各个元素可以利用上述方式一个元素一个元素地赋值,也可以组合赋值。定义一个数组并为其赋初值的一般形式是:
数组名=(值1 值2 ... 值n)
其中,各个值之间以空格分开。
例如:
$ A=(this is an example of shell script)
$ echo ${A[0]} ${A[2]} ${A[3]} ${A[6]}
this an example script
$ echo ${A[8]}
$
由于值表中初值共有7个,所以A的元素个数也是7。A[8]超出了已赋值的数组A的范围,就认为它是一个新元素,由于预先没有赋值,所以它的值是空串。
若没有给出数组元素的下标,则数组名表示下标为0的数组元素,如city就等价于city[0]。
使用*或@做下标,则会以数组中所有元素取代
或[@]。
2006.8.19
最近在写一个拆分字符串的代码的时候用到了数组,我把实例写一下
问题大概是这个样子:我需要把一个存放有ip段的字符分开,分成开始地址和结束地址。
下面是解决办法
Code:
[Ctrl+A Select All]
参数传递
假如我要编写一个shell来求两个数的和,可以怎么实现呢?
为了介绍参数传递的使用
我们用vi add编写一个这样的脚本:
let sum=$1+$2
echo $sum
保存后,我们执行一下:
#./add 5 10
15
可以看出5和10分别传给了$1和$2
其实这是shell自己某人的参数顺序,其实我们可以自己先定义好变量,然后传递进去
例如:
我们先修改上面的add文件:
let sum=$X+$Y
echo $sum
现在我们,这样执行
#X=5 Y=10 ./add
15
我们同样可以得到正确结果哦
设置环境变量
将shell程序的变量输出到环境变量export
#opid=True
#export=opid
这样子就可以拉
不过还可以直接到/etc/profile里头去添加哦
具体操作类似
在里头的export命令之前先增加
opid=True
然后在export命令后面增加opid项
键盘读起变量值
我们可以通过read来读取变量值哦
下面我们来等待用户输入一个值并且显示出来
Quote: |
falcon@falcon:~$ read -p "请输入一个值 : " input ; echo "你输入了一个值为 :" $input 请输入一个值 : 21500 你输入了一个值为 : 21500
|
设置变量的只读属性
有些重要的shell变量,赋值后不应该修改,那么我们可设置他为readonly
具体操作:
#oracle_home=/usr/oracle7/bin
#readonly oracle_home
条件测试命令test
语法:test 表达式
如果表达式为真,则返回真,否则,返回假
1)数值比较
先给出数值比较时常见的比较符:
-eg =
-ne !=
-gt >
-ge >=
-lt <
-le <=
#test var1 -gt var2
2)文件属性
文件的可读、可写、可执行,是否为普通文件,是否为目录分别对应
-r -w -x -f -d
#test -r filename
3)字符传属性以及比较
串的长度为零:-z 非零:-n
如:
#test -z s1
如果串s1长度为零,返回真
串比较:相等s1=s2 不相等 s1!=s2
我们还有一种比较串的方法(可以按字典序来比较哦):
Quote: |
falcon@falcon:~$ if [[ 'abcde' <'abcdf' ]]; then echo "yeah,果然是诶"; fi yeah,果然是诶
|
整数算术或关系运算expr
可用该命令进行的运算有
算术运算:+ - * / %
逻辑运算:= ! < <= > >=
如:
#i=5;expr $i+5
另外,bc是linux下的一个计算器,可以进行一些算术计算
控制执行流程命令
(1)条件分支命令if ,case
if命令举例:
下面的shell作用:判断输入的第一个参数的值是一个普通文件名,那么分页打印该文件;否则,判断它是否为目录名,若是则进入该目录并打印该目录下的所有文件,如果也不是目录名,那么提示相关信息。
if test -f $1
then
pr $1>/dev/lp0
elif
test-d $1
then
(cd $1;pr *>/dev/lp0)
else
echo $1 is neither a file nor a directory
fi
case命令举例:
case命令是一个基于模式匹配的多路分之命令
下面的shell将根据用户键盘输入情况决定下一步将执行那一组命令。
while [ $reply!="y" ] && [ $reply!="Y" ] #下面将学习的循环语句
do
echo "\nAre you want to continue?(Y/N)\c"
read reply #读取键盘
case $replay in
(y|Y) break;; #退出循环
(n|N) echo "\n\nTerminating\n"
exit 0;;
*) echo "\n\nPlease answer y or n"
continue; #直接返回内层循环开始出继续
esac
done
(2)循环语句
条件循环语句while,until
语法:
while/until 命令表1
do
命令表2
done
区别是,前者在执行完命令表1后,如果出口状态为零,那么执行do后面的命令表2,然后回到起始处,而后者执行命令表1后,如果出口状态非零,才执行类似操作。
[例子同上]
有限循环命令for
语法:
for 变量名 in 字符串表
do
命令表
done
举例:
FILE="test1.c myfile1.f pccn.h"
for i in $FILE
do
cd ./tmp
cp $i $i.old
echo "$i copied"
done
函数
先在我们来看看shell里头的函数怎么用
先看个例子:我们些一个函数,然后调用它显示"Hello,World!"
#函数定义
function show
{
echo $1$2;
}
H="Hello,"
W="World!"
show $H $W
保存为show
修改执行权限chmod 770 show
执行:
$./show
Hello,World!
呵呵,看出什么蹊跷了吗?
show $H $W
我们可以通过直接在函数明后面跟实参哦
实参顺序对应“虚参”的$1,$2,$3..........
注意一个地方哦,假如我要传进去一个参数,这个参数中间带空格,怎么办呢?
你先试试看
我们来显示"Hello World"(两个单词之间有个空格哦)
function show
{
echo $1
}
HW="Hello World"
show "$HW"
看看,是不是ok拉,如果你 直接show $HW
肯定是不行的,因为$1只接受到了Hello,所以结果之显示Hello
原因是字符串变量必须用"包含起来
感兴趣的你继续学习哦!
还有好多强大的东西值得你去学习呢,呵呵,比如cut, expr, sed, awk等等。