linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > SHELL >
栏目导栏
资料搜索
热门文章
·csh shell编程入门
·玩转Linux shell命令提示符
·Bourne Shell及shell编程
·Shell 编程实例集锦
·Linux下的shell编程入门
·Shell编程基础
·linux shell 编程基础
·shell基础十二篇
·Linux的Shell编程
·linux Shell编程入门 实例讲解
·Linux主要shell命令详解
·Linux shell 脚本实例一
·深入浅出Shell编程: Shell 变量
·shell命令(一)
·UNIX/LINUX SHELL 正则表达式语
最新文章
·Linux系统中加入自定义Shell为
·Shell学习:关于替换命令-tr-R
·Linux Shell学习:uniq命令使用
·uClinux操作系统下的shell功能
·Shell编程基础:单引号和双引号
·Linux操作系统下Shell语句元字
·Linux系统环境程序设计之路
·Linux Shell中PS命令中的%CPU的
·Linux Shell元字符知识笔记
·压缩命令-vi-认识SHELL-正规表
·Linux系统下Shell命令行快捷键
·谈Linux Shell下的输出重定向
·在Shell中执行vi/cp/mv时自动备
·shell数组介绍
·开启和关闭Shell特性的小技巧
Google
 
几个shell程序设计小知识(shell常识部分)
[ 作者:  加入时间:2006-07-16 21:17:50  来自: ]
一、用户登陆进入系统后的系统环境变量: k6TLinux联盟
$HOME 使用者自己的目录 k6TLinux联盟
$PATH 执行命令时所搜寻的目录 k6TLinux联盟
$TZ 时区 k6TLinux联盟
$MAILCHECK 每隔多少秒检查是否有新的信件 k6TLinux联盟
$PS1 在命令列时的提示号 k6TLinux联盟
$PS2 当命令尚未打完时,Shell 要求再输入时的提示号 k6TLinux联盟
$MANPATH man 指令的搜寻路径 k6TLinux联盟
k6TLinux联盟
二、特殊变量: k6TLinux联盟
k6TLinux联盟
$0 这个程序的执行名字 k6TLinux联盟
$n 这个程序的第n个参数值,n=1..9 k6TLinux联盟
$* 这个程序的所有参数 k6TLinux联盟
$# 这个程序的参数个数 k6TLinux联盟
$$ 这个程序的PID k6TLinux联盟
$! 执行上一个指令的PID k6TLinux联盟
$? 执行上一个指令的返回值 k6TLinux联盟
k6TLinux联盟
三、shell中的变元: k6TLinux联盟
* 任意字符串 k6TLinux联盟
? 一个任意字符 k6TLinux联盟
[abc] a, b, c三者中之一 k6TLinux联盟
[a-n] 从a到n的任一字符 k6TLinux联盟
k6TLinux联盟
四、几个特殊字符表示 k6TLinux联盟
k6TLinux联盟
\b 退回 k6TLinux联盟
\c 打印一行时没有换行符 这个我们经常会用到 k6TLinux联盟
\f 换页 k6TLinux联盟
\r 回车 k6TLinux联盟
\t 制表 k6TLinux联盟
\v 垂直制表 k6TLinux联盟
\\ 反斜线本身 k6TLinux联盟
k6TLinux联盟
五、判断文件的属性 k6TLinux联盟
k6TLinux联盟
格式:-操作符 filename k6TLinux联盟
-e 文件存在返回1, 否则返回0 k6TLinux联盟
-r 文件可读返回1,否则返回0 k6TLinux联盟
-w 文件可写返回1,否则返回0 k6TLinux联盟
-x 文件可执行返回1,否则返回0 k6TLinux联盟
-o 文件属于用户本人返回1, 否则返回0 k6TLinux联盟
-z 文件长度为0返回1, 否则返回0. k6TLinux联盟
-f 文件为普通文件返回1, 否则返回0 k6TLinux联盟
-d 文件为目录文件时返回1, 否则返回0 k6TLinux联盟
k6TLinux联盟
六、测试字符串 k6TLinux联盟
字符串1 = 字符串2 当两个字串相等时为真 k6TLinux联盟
字符串1 != 字符串2 当两个字串不等时为真 k6TLinux联盟
-n 字符串      当字符串的长度大于0时为真 k6TLinux联盟
-z 字符串      当字符串的长度为0时为真 k6TLinux联盟
字符串       当串字符串为非空时为真 k6TLinux联盟
k6TLinux联盟
七、测试两个整数关系 k6TLinux联盟
数字1 -eq 数字2     两数相等为真 k6TLinux联盟
数字1 -ne 数字2     两数不等为真 k6TLinux联盟
数字1 -gt 数字2     数字1大于数字2为真 k6TLinux联盟
数字1 -ge 数字2     数字1大于等于数字2为真 k6TLinux联盟
数字1 -lt 数字2     数字1小于数字2为真 k6TLinux联盟
数字1 -le 数字2     数字1小于等于数字2为真 k6TLinux联盟
k6TLinux联盟
八、逻辑测试 k6TLinux联盟
-a         与 k6TLinux联盟
-o        或 k6TLinux联盟
!        非 k6TLinux联盟
k6TLinux联盟
k6TLinux联盟
k6TLinux联盟
今天介绍shell特殊字符的引用 k6TLinux联盟
=============================== k6TLinux联盟
shell中的特殊字符有 k6TLinux联盟
k6TLinux联盟
1、$ 美元符 k6TLinux联盟
2、\ 反斜杠 k6TLinux联盟
3、` 反引号 k6TLinux联盟
4、" 双引号 k6TLinux联盟
5、< ,>,*,?,[,] k6TLinux联盟
k6TLinux联盟
下面我一一举列说明 k6TLinux联盟
一、$符号 k6TLinux联盟
1、echo $? 显示的是上一条指令退出状态 k6TLinux联盟
2、echo "$?" 效果同上 k6TLinux联盟
3、echo '$?' 显示的是$? k6TLinux联盟
4、echo \$? 显示的是$? k6TLinux联盟
5、echo "\$?" 显示的是$? k6TLinux联盟
k6TLinux联盟
  大家可能已经看出 $符号在双引号中具有特殊意义 双引号对$符号不起作用 k6TLinux联盟
而单引号可以将特殊字符的的特殊意义屏蔽掉,使其能显示为字符本身,反斜 k6TLinux联盟
杠也可以将特殊字符的特殊含义屏蔽掉,使特殊字符失去特殊含义。 k6TLinux联盟
k6TLinux联盟
二、\ 反斜杠 k6TLinux联盟
  反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符 k6TLinux联盟
A=1234 k6TLinux联盟
echo \$A 显示为$A 如果不加\将显示为1234 k6TLinux联盟
echo \` 显示为` k6TLinux联盟
echo \" 显示为双引号 k6TLinux联盟
echo \\ 显示为\ k6TLinux联盟
k6TLinux联盟
三、` 反引号 k6TLinux联盟
  反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量 k6TLinux联盟
k6TLinux联盟
A=`date` k6TLinux联盟
echo $A 显示的不是date而是当时的时间串 k6TLinux联盟
比如有一文件A的内容如下  k6TLinux联盟
ABCDEFG k6TLinux联盟
1234456 k6TLinux联盟
abcdefg k6TLinux联盟
k6TLinux联盟
B=`cat A|grep 234` # 检索文件A中含有字符串234的行 k6TLinux联盟
echo $B 将显示为1234456 k6TLinux联盟
echo "$B" 将显示为什么? k6TLinux联盟
echo "\$B" 将显示为什么?读者自己试试 k6TLinux联盟
k6TLinux联盟
四、" 双引号 k6TLinux联盟
  在系统中有些特殊字符,为避免引用这些特殊字符 往往用双引号或单引号将这些特殊字符引起来,使其不具有特殊含义。 k6TLinux联盟
  但有一部分特殊字符在引号中还是具有特殊含义,用双引号引起来是不起作用的。本文中所列的前四个特殊字符在双引号中还是特殊字符。为了使其不具有特殊含义一是用单引号引进来二是用\反斜线使其失去作用。 k6TLinux联盟
k6TLinux联盟
  比如我们想原样输出这些特殊字符 k6TLinux联盟
k6TLinux联盟
echo """ k6TLinux联盟
echo "$" k6TLinux联盟
echo "\" k6TLinux联盟
echo "`" k6TLinux联盟
   以上不是你所期望的结果,因为双引号对它们不起作用,你只能这样才能输出这些特殊字符的原形 k6TLinux联盟
echo '"' k6TLinux联盟
echo '$' k6TLinux联盟
echo '\' k6TLinux联盟
echo '`' k6TLinux联盟
k6TLinux联盟
echo "\"" k6TLinux联盟
echo "\$" k6TLinux联盟
echo "\\" k6TLinux联盟
echo "\`" k6TLinux联盟
将分别显示为 " $ \ ` k6TLinux联盟
五、其它特殊字符 k6TLinux联盟
  大家注意到 除了前四个特殊字符外 我将其它的特殊字符都放在一块,这是因为前四个特殊字符在双引号中还是具有特殊含义,所以单独拿出来讲,除此以外的特殊字符如果你要输出这些特殊字符的原形,你就可以用双引号或单引号引起来使其失去特殊含义。 k6TLinux联盟
< ,>,*,?,[,]对shell有特殊含义 但你可以用双引号引起来输入这些原形 k6TLinux联盟
k6TLinux联盟
  讲了这么多大家是不是已经注意到所有的特殊字符在单引号中失去特殊含义,如果你要输出特殊字符原形但又记不清那些特殊字符在双引号中不能输出原形,建议你干脆用单引号引起来。 k6TLinux联盟
k6TLinux联盟
今天介绍条件测试语句 k6TLinux联盟
k6TLinux联盟
一、if 条件语句  k6TLinux联盟
格式: k6TLinux联盟
if 条件表达式 k6TLinux联盟
then #当条件为真时执行以下语句 k6TLinux联盟
命令列表 k6TLinux联盟
else #为假时执行以下语句 k6TLinux联盟
命令列表 k6TLinux联盟
fi k6TLinux联盟
k6TLinux联盟
if 语句也可以嵌套使用 k6TLinux联盟
k6TLinux联盟
if 条件表达式1 k6TLinux联盟
then k6TLinux联盟
if 条件表达式2 k6TLinux联盟
then k6TLinux联盟
命令列表 k6TLinux联盟
else k6TLinux联盟
if 条件表达式3 k6TLinux联盟
then k6TLinux联盟
命令列表 k6TLinux联盟
else k6TLinux联盟
命令列表 k6TLinux联盟
fi k6TLinux联盟
fi k6TLinux联盟
else k6TLinux联盟
命令列表 k6TLinux联盟
fi k6TLinux联盟
k6TLinux联盟
你可以进行多层嵌套 一个if语句一定要跟一个fi 表示该层条件结束  否则会造成语法错误 k6TLinux联盟
结合前面讲的 举例如下: k6TLinux联盟
这里先讲一个条件语句中用到的命令test 表示测试test后面的条件是否为真 k6TLinux联盟
k6TLinux联盟
if test -f "$1" k6TLinux联盟
then k6TLinux联盟
lpr $1 k6TLinux联盟
else k6TLinux联盟
if test -d "$1" k6TLinux联盟
then k6TLinux联盟
cd $1 k6TLinux联盟
lpr $1 k6TLinux联盟
else k6TLinux联盟
echo "$1不是文件或目录" k6TLinux联盟
fi k6TLinux联盟
fi k6TLinux联盟
k6TLinux联盟
以上的例子还可以改成如下所示 k6TLinux联盟
k6TLinux联盟
if test -f "$1" k6TLinux联盟
then k6TLinux联盟
lpr $1 k6TLinux联盟
elif test -d "$1" #elif 同else if k6TLinux联盟
then k6TLinux联盟
(cd $1;lpr $1) k6TLinux联盟
else k6TLinux联盟
echo "$1不是文件或目录" k6TLinux联盟
fi k6TLinux联盟
k6TLinux联盟
以上的例子不知您是否看懂是什么意思吗? k6TLinux联盟
假如我们现在将这个例子保存为prfile k6TLinux联盟
chmod +x prfile k6TLinux联盟
执行刚才的程序 k6TLinux联盟
./prfile aaa k6TLinux联盟
k6TLinux联盟
这个例子是检查你的输入的参数是否是一个文件 如果是就打印 如果是一个目录 先转目录再打印 如果即不是文件也不是目录给出提示 k6TLinux联盟
k6TLinux联盟
二、多重条件测试语句case k6TLinux联盟
格式: k6TLinux联盟
case 字串 in k6TLinux联盟
模式) 命令列表;; k6TLinux联盟
模式) 命令列表;; k6TLinux联盟
.... k6TLinux联盟
esac k6TLinux联盟
k6TLinux联盟
多重条件语句是以case 开始以esac结束 中间可以有多个条件列表 功能是测试字串和和里面的模式有没有匹配的,有就执行里面的命令列表 模式也可以是*号 表示任意字串,每个模式里面的最后要心;;双引号结束,否则会发生语法错误。 k6TLinux联盟
k6TLinux联盟
现举例如下: k6TLinux联盟
k6TLinux联盟
case $1 in k6TLinux联盟
*.c) k6TLinux联盟
cc $1 k6TLinux联盟
;; k6TLinux联盟
*.txt) k6TLinux联盟
lpr $1 k6TLinux联盟
;; k6TLinux联盟
*) k6TLinux联盟
echo "未知的类型" k6TLinux联盟
esac k6TLinux联盟
k6TLinux联盟
假如将以上内容保存在文件abc中 k6TLinux联盟
k6TLinux联盟
chmod +x abc k6TLinux联盟
执行 ./abc a.c   将会对文件a.c进行编译 k6TLinux联盟
执行 ./abc readme.txt 将会把文件通过打印机 k6TLinux联盟
假如我将以上内容改一下,你是否会知道它的执行结果? k6TLinux联盟
k6TLinux联盟
case $1 in k6TLinux联盟
*) k6TLinux联盟
cc $1 k6TLinux联盟
;; k6TLinux联盟
*.txt) k6TLinux联盟
lpr $1 k6TLinux联盟
;; k6TLinux联盟
*.c) k6TLinux联盟
echo "未知的类型" k6TLinux联盟
esac k6TLinux联盟
k6TLinux联盟
今天介绍循环语句 k6TLinux联盟
一. while 循环 k6TLinux联盟
while 命令格式 k6TLinux联盟
k6TLinux联盟
while 条件表 k6TLinux联盟
do k6TLinux联盟
命令表 k6TLinux联盟
done k6TLinux联盟
k6TLinux联盟
执行过程 k6TLinux联盟
k6TLinux联盟
shell首先执行条件表,如果条件表的最后一条语句的退出状态为零,则执行盾环体内的命令 k6TLinux联盟
表,执行完后,再检查条件表,如果退出状态为零将继续执行,如此循环往复直到条件表的 k6TLinux联盟
最后一条语句的退出状态非零. 退出状态为零就是条件为真True. k6TLinux联盟
k6TLinux联盟
举例说明 假如shell文件的内容如下: k6TLinux联盟
k6TLinux联盟
Sum=0 k6TLinux联盟
i=0 k6TLinux联盟
while true #true是系统的关键词 表示真 k6TLinux联盟
do k6TLinux联盟
i=`expr $i + 1` k6TLinux联盟
Sum=`expr $Sum + $i` k6TLinux联盟
if [ $i = "100" ] k6TLinux联盟
then k6TLinux联盟
break; k6TLinux联盟
fi k6TLinux联盟
done k6TLinux联盟
echo $i $Sum k6TLinux联盟
最后这个程序显示的是 100 5050 k6TLinux联盟
这个程序的运算就是将1到100加起来 k6TLinux联盟
k6TLinux联盟
下面将这个程序再改动一下 k6TLinux联盟
k6TLinux联盟
k6TLinux联盟
Sum=0 k6TLinux联盟
i=0 k6TLinux联盟
while [ $i != "100" ] k6TLinux联盟
do k6TLinux联盟
i=`expr $i + 1` k6TLinux联盟
Sum=`expr $Sum + $i` k6TLinux联盟
done k6TLinux联盟
echo $i $Sum k6TLinux联盟
k6TLinux联盟
改动后的程序运算结果和上面是一样 但程序比上面的要简练 k6TLinux联盟
k6TLinux联盟
在这个循环中还可以以until做为测试条件 它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子. k6TLinux联盟
k6TLinux联盟
k6TLinux联盟
Sum=0 k6TLinux联盟
i=0 k6TLinux联盟
until [ $i = "100" ] k6TLinux联盟
do k6TLinux联盟
i=`expr $i + 1` k6TLinux联盟
Sum=`expr $Sum + $i` k6TLinux联盟
done k6TLinux联盟
echo $i $Sum k6TLinux联盟
当i不等于100时循环 就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100 k6TLinux联盟
时循环,也就是测试条件为真时循环. k6TLinux联盟
k6TLinux联盟
二.for 循环 k6TLinux联盟
k6TLinux联盟
命令格式: k6TLinux联盟
for 变量 in 名字列表 k6TLinux联盟
do k6TLinux联盟
命令列表 k6TLinux联盟
done k6TLinux联盟
k6TLinux联盟
这里的名字列表是一个由空格分隔的字符串列表,shell在执行for循环时每次依次从名字表 k6TLinux联盟
中取出一个字符串赋给循环变量作为变量的值. k6TLinux联盟
在写for语句时,也可以省略in 名字列表部分,这表示用当前的位置参数来代替这时的名 k6TLinux联盟
字列表. k6TLinux联盟
下面举个例子 k6TLinux联盟
比如在你的电脑中有两个目录,一个是aa,一个是bb在这两个目录中有5个相同的文件,但其 k6TLinux联盟
中一个目录中的一个或多个文件刚刚修改过,现在我忘记刚才改的是那几个文件 了,那么我靠梢员冉弦幌抡饬礁瞿柯嫉奈募椭懒?程序如下: k6TLinux联盟
k6TLinux联盟
for File in a1 a2 a3 a4 a5 k6TLinux联盟
do k6TLinux联盟
diff aa/$File bb/$File k6TLinux联盟
done k6TLinux联盟
k6TLinux联盟
下面再举一个不带名字列表的例子 k6TLinux联盟
k6TLinux联盟
for File k6TLinux联盟
do k6TLinux联盟
echo $Filw k6TLinux联盟
done k6TLinux联盟
k6TLinux联盟
文件内容保存在a.sh中 并可执行 k6TLinux联盟
我们在执行这个shell程序时命令行如下: k6TLinux联盟
a.sh a1 a2 a3 a4 a5 k6TLinux联盟
执行结果如下: k6TLinux联盟
a1 k6TLinux联盟
a2 k6TLinux联盟
a3 k6TLinux联盟
a4 k6TLinux联盟
a5 k6TLinux联盟
大家从这个例子中可以看到命令行的参数被逐一读入一次 k6TLinux联盟
三.循环控制语句 k6TLinux联盟
break 命令不执行当前循环体内break下面的语句从当前循环退出. k6TLinux联盟
continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行. k6TLinux联盟
k6TLinux联盟
一,命令组合:圆括号和花括号 k6TLinux联盟
shell中有两种方法将命令组合在一起:圆括号和花括号.圆括号使shell创建一个子shell k6TLinux联盟
来读取并执行括起来的名命令.左括号和右括号不论出现在命令行中的什么位置,shell都会 k6TLinux联盟
认为它们具有特殊的组合意义的.只有用双引号将它们括起来引用,才表示圆括号或花括号 k6TLinux联盟
的原义.例如: k6TLinux联盟
k6TLinux联盟
echo a(b) k6TLinux联盟
将出现语法上的错误,要想输出a(b)字符串 只能括起来 k6TLinux联盟
echo "a(b)" k6TLinux联盟
或echo a"("b")" k6TLinux联盟
这样才能被shell正确解释. k6TLinux联盟
利用组合命令有什么作用呢? k6TLinux联盟
一,用圆括号组合命令 k6TLinux联盟
圆括号的组合命令可以创建子进程运行组合程序,建立子进程的功能是很有用的,因为 k6TLinux联盟
子shell在组合命令中的种种操作都不会影响到当前shell的各变量的值. k6TLinux联盟
例如: k6TLinux联盟
子进程在执行组合命令时改变了工作目录,并在新的工作目录下执行一系例命令,执行 k6TLinux联盟
完后它可以不必返回原工作目录,因为子进程工作目录的改变不会影响到当前工作目录. k6TLinux联盟
k6TLinux联盟
创建子进程后将当前的环境也同样传给子shell,当前shell中用export输出到环境中的 k6TLinux联盟
各变量在子shell中同样有效. k6TLinux联盟
k6TLinux联盟
k6TLinux联盟
花括号也可以将命令组合在一起.左 右花括号只有作为一条命令的第一个字出现时, k6TLinux联盟
shell才它们含有特殊含义. k6TLinux联盟
与圆括号不同的是花括号并不创建子shell,只是由当前的shell来读取并执行括起来的 k6TLinux联盟
命令.有时用户希望使用一组命令的顺序输出作为另一组命令的输入,此时用花括号是很方 k6TLinux联盟
便的. k6TLinux联盟
不论是用圆括号不是花括号,退出状态都是等于最后一条括起来的命令的退出状态. k6TLinux联盟
k6TLinux联盟
k6TLinux联盟
二,可以在当前shell中执行的命令 k6TLinux联盟
k6TLinux联盟
用户在使用shell时一定要了解那些是可以在当前shell中执行的命令 那些不可以 k6TLinux联盟
可以在当前shell中执行的命令有: k6TLinux联盟
k6TLinux联盟
break case cd continue k6TLinux联盟
echo eval exec exit k6TLinux联盟
export for if read k6TLinux联盟
readonly return set shift k6TLinux联盟
test times trap umask k6TLinux联盟
until wait while k6TLinux联盟
: {} Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息