`
rorely
  • 浏览: 113303 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

几个shell程序设计小知识(shell常识部分)

阅读更多

几个shell程序设计小知识(shell常识部分)

时间:2006-07-16 21:17:50  来源:  作者:

 

转载:http://www.xxlinux.com/linux/article/development/shell/2006-07-16/2805.html

一、用户登陆进入系统后的系统环境变量:
$HOME 使用者自己的目录
$PATH 执行命令时所搜寻的目录
$TZ 时区
$MAILCHECK 每隔多少秒检查是否有新的信件
$PS1 在命令列时的提示号
$PS2 当命令尚未打完时,Shell 要求再输入时的提示号
$MANPATH man 指令的搜寻路径

二、特殊变量:

$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1..9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个指令的PID
$? 执行上一个指令的返回值

三、shell中的变元:
* 任意字符串
? 一个任意字符
[abc] a, b, c三者中之一
[a-n] 从a到n的任一字符

四、几个特殊字符表示

\b 退回
\c 打印一行时没有换行符 这个我们经常会用到
\f 换页
\r 回车
\t 制表
\v 垂直制表
\\ 反斜线本身

五、判断文件的属性

格式:-操作符 filename
-e 文件存在返回1, 否则返回0
-r 文件可读返回1,否则返回0
-w 文件可写返回1,否则返回0
-x 文件可执行返回1,否则返回0
-o 文件属于用户本人返回1, 否则返回0
-z 文件长度为0返回1, 否则返回0.
-f 文件为普通文件返回1, 否则返回0
-d 文件为目录文件时返回1, 否则返回0

六、测试字符串
字符串1 = 字符串2 当两个字串相等时为真
字符串1 != 字符串2 当两个字串不等时为真
-n 字符串      当字符串的长度大于0时为真
-z 字符串      当字符串的长度为0时为真
字符串       当串字符串为非空时为真

七、测试两个整数关系
数字1 -eq 数字2     两数相等为真
数字1 -ne 数字2     两数不等为真
数字1 -gt 数字2     数字1大于数字2为真
数字1 -ge 数字2     数字1大于等于数字2为真
数字1 -lt 数字2     数字1小于数字2为真
数字1 -le 数字2     数字1小于等于数字2为真

八、逻辑测试
-a         与
-o        或
!        非



今天介绍shell特殊字符的引用
===============================
shell中的特殊字符有

1、$ 美元符
2、\ 反斜杠
3、` 反引号
4、" 双引号
5、< ,>,*,?,[,]

下面我一一举列说明
一、$符号
1、echo $? 显示的是上一条指令退出状态
2、echo "$?" 效果同上
3、echo '$?' 显示的是$?
4、echo \$? 显示的是$?
5、echo "\$?" 显示的是$?

  大家可能已经看出 $符号在双引号中具有特殊意义 双引号对$符号不起作用
而单引号可以将特殊字符的的特殊意义屏蔽掉,使其能显示为字符本身,反斜
杠也可以将特殊字符的特殊含义屏蔽掉,使特殊字符失去特殊含义。

二、\ 反斜杠
  反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符
A=1234
echo \$A 显示为$A 如果不加\将显示为1234
echo \` 显示为`
echo \" 显示为双引号
echo \\ 显示为\

三、` 反引号
  反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量

A=`date`
echo $A 显示的不是date而是当时的时间串
比如有一文件A的内容如下 
ABCDEFG
1234456
abcdefg

B=`cat A|grep 234` # 检索文件A中含有字符串234的行
echo $B 将显示为1234456
echo "$B" 将显示为什么?
echo "\$B" 将显示为什么?读者自己试试

四、" 双引号
  在系统中有些特殊字符,为避免引用这些特殊字符 往往用双引号或单引号将这些特殊字符引起来,使其不具有特殊含义。
  但有一部分特殊字符在引号中还是具有特殊含义,用双引号引起来是不起作用的。本文中所列的前四个特殊字符在双引号中还是特殊字符。为了使其不具有特殊含义一是用单引号引进来二是用\反斜线使其失去作用。

  比如我们想原样输出这些特殊字符

echo """
echo "$"
echo "\"
echo "`"
   以上不是你所期望的结果,因为双引号对它们不起作用,你只能这样才能输出这些特殊字符的原形
echo '"'
echo '$'
echo '\'
echo '`'

echo "\""
echo "\$"
echo "\\"
echo "\`"
将分别显示为 " $ \ `
五、其它特殊字符
  大家注意到 除了前四个特殊字符外 我将其它的特殊字符都放在一块,这是因为前四个特殊字符在双引号中还是具有特殊含义,所以单独拿出来讲,除此以外的特殊字符如果你要输出这些特殊字符的原形,你就可以用双引号或单引号引起来使其失去特殊含义。
< ,>,*,?,[,]对shell有特殊含义 但你可以用双引号引起来输入这些原形

  讲了这么多大家是不是已经注意到所有的特殊字符在单引号中失去特殊含义,如果你要输出特殊字符原形但又记不清那些特殊字符在双引号中不能输出原形,建议你干脆用单引号引起来。

今天介绍条件测试语句

一、if 条件语句 
格式:
if 条件表达式
then #当条件为真时执行以下语句
命令列表
else #为假时执行以下语句
命令列表
fi

if 语句也可以嵌套使用

if 条件表达式1
then
if 条件表达式2
then
命令列表
else
if 条件表达式3
then
命令列表
else
命令列表
fi
fi
else
命令列表
fi

你可以进行多层嵌套 一个if语句一定要跟一个fi 表示该层条件结束  否则会造成语法错误
结合前面讲的 举例如下:
这里先讲一个条件语句中用到的命令test 表示测试test后面的条件是否为真

if test -f "$1"
then
lpr $1
else
if test -d "$1"
then
cd $1
lpr $1
else
echo "$1不是文件或目录"
fi
fi

以上的例子还可以改成如下所示

if test -f "$1"
then
lpr $1
elif test -d "$1" #elif 同else if
then
(cd $1;lpr $1)
else
echo "$1不是文件或目录"
fi

以上的例子不知您是否看懂是什么意思吗?
假如我们现在将这个例子保存为prfile
chmod +x prfile
执行刚才的程序
./prfile aaa

这个例子是检查你的输入的参数是否是一个文件 如果是就打印 如果是一个目录 先转目录再打印 如果即不是文件也不是目录给出提示

二、多重条件测试语句case
格式:
case 字串 in
模式) 命令列表;;
模式) 命令列表;;
....
esac

多重条件语句是以case 开始以esac结束 中间可以有多个条件列表 功能是测试字串和和里面的模式有没有匹配的,有就执行里面的命令列表 模式也可以是*号 表示任意字串,每个模式里面的最后要心;;双引号结束,否则会发生语法错误。

现举例如下:

case $1 in
*.c)
cc $1
;;
*.txt)
lpr $1
;;
*)
echo "未知的类型"
esac

假如将以上内容保存在文件abc中

chmod +x abc
执行 ./abc a.c   将会对文件a.c进行编译
执行 ./abc readme.txt 将会把文件通过打印机
假如我将以上内容改一下,你是否会知道它的执行结果?

case $1 in
*)
cc $1
;;
*.txt)
lpr $1
;;
*.c)
echo "未知的类型"
esac

今天介绍循环语句
一. while 循环
while 命令格式

while 条件表
do
命令表
done

执行过程

shell首先执行条件表,如果条件表的最后一条语句的退出状态为零,则执行盾环体内的命令
表,执行完后,再检查条件表,如果退出状态为零将继续执行,如此循环往复直到条件表的
最后一条语句的退出状态非零. 退出状态为零就是条件为真True.

举例说明 假如shell文件的内容如下:

Sum=0
i=0
while true #true是系统的关键词 表示真
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
if [ $i = "100" ]
then
break;
fi
done
echo $i $Sum
最后这个程序显示的是 100 5050
这个程序的运算就是将1到100加起来

下面将这个程序再改动一下


Sum=0
i=0
while [ $i != "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum

改动后的程序运算结果和上面是一样 但程序比上面的要简练

在这个循环中还可以以until做为测试条件 它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子.


Sum=0
i=0
until [ $i = "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
当i不等于100时循环 就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100
时循环,也就是测试条件为真时循环.

二.for 循环

命令格式:
for 变量 in 名字列表
do
命令列表
done

这里的名字列表是一个由空格分隔的字符串列表,shell在执行for循环时每次依次从名字表
中取出一个字符串赋给循环变量作为变量的值.
在写for语句时,也可以省略in 名字列表部分,这表示用当前的位置参数来代替这时的名
字列表.
下面举个例子
比如在你的电脑中有两个目录,一个是aa,一个是bb在这两个目录中有5个相同的文件,但其
中一个目录中的一个或多个文件刚刚修改过,现在我忘记刚才改的是那几个文件 了,那么我靠梢员冉弦幌抡饬礁瞿柯嫉奈募椭懒?程序如下:

for File in a1 a2 a3 a4 a5
do
diff aa/$File bb/$File
done

下面再举一个不带名字列表的例子

for File
do
echo $Filw
done

文件内容保存在a.sh中 并可执行
我们在执行这个shell程序时命令行如下:
a.sh a1 a2 a3 a4 a5
执行结果如下:
a1
a2
a3
a4
a5
大家从这个例子中可以看到命令行的参数被逐一读入一次
三.循环控制语句
break 命令不执行当前循环体内break下面的语句从当前循环退出.
continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行.

一,命令组合:圆括号和花括号
shell中有两种方法将命令组合在一起:圆括号和花括号.圆括号使shell创建一个子shell
来读取并执行括起来的名命令.左括号和右括号不论出现在命令行中的什么位置,shell都会
认为它们具有特殊的组合意义的.只有用双引号将它们括起来引用,才表示圆括号或花括号
的原义.例如:

echo a(b)
将出现语法上的错误,要想输出a(b)字符串 只能括起来
echo "a(b)"
或echo a"("b")"
这样才能被shell正确解释.
利用组合命令有什么作用呢?
一,用圆括号组合命令
圆括号的组合命令可以创建子进程运行组合程序,建立子进程的功能是很有用的,因为
子shell在组合命令中的种种操作都不会影响到当前shell的各变量的值.
例如:
子进程在执行组合命令时改变了工作目录,并在新的工作目录下执行一系例命令,执行
完后它可以不必返回原工作目录,因为子进程工作目录的改变不会影响到当前工作目录.

创建子进程后将当前的环境也同样传给子shell,当前shell中用export输出到环境中的
各变量在子shell中同样有效.


花括号也可以将命令组合在一起.左 右花括号只有作为一条命令的第一个字出现时,
shell才它们含有特殊含义.
与圆括号不同的是花括号并不创建子shell,只是由当前的shell来读取并执行括起来的
命令.有时用户希望使用一组命令的顺序输出作为另一组命令的输入,此时用花括号是很方
便的.
不论是用圆括号不是花括号,退出状态都是等于最后一条括起来的命令的退出状态.


二,可以在当前shell中执行的命令

用户在使用shell时一定要了解那些是可以在当前shell中执行的命令 那些不可以
可以在当前shell中执行的命令有:

break case cd continue
echo eval exec exit
export for if read
readonly return set shift
test times trap umask
until wait while
: {}

分享到:
评论

相关推荐

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建嵌入式...

    Shell脚本专家指南

    24.4 几个值的匹配域 24.5 确定域的数目 24.6 确定最后一个域 24.7 确定倒数第二个域 24.8 给awk传送变量 24.9 在一定条件下使用给awk传送的变量 24.10 显示域的范围(主要方法) 24.11 显示域的范围(备选方法) 24.12 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建嵌入式...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建嵌入式...

    嵌入式Linux程序设计案例与实验教程-实例代码

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建...

    linux shell 正则表达式(BREs,EREs,PREs)差异比较.docx

    许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex...

    Linux C程序设计教程

    主要包括进程间通信,文件IO,网络编程进阶和shell脚本几个部分。

    私有收藏夹管理程序(Windows Shell扩展)

    一段乐谱需要关联几个音色设置参数。这些关联文档有时是已经存在的,需要在浩瀚的历史记录中寻找。依靠记忆、回忆或其他关联信息,在花费了不小的代价之后或许能够找到,或许需要重新设计。这些是困扰人们有效使用...

    为自己的程序设计命令行模式教程

    命令行模式是程序的可编程接口之一,设计了这个模式,就可以让其他程序通过如Shell语句的启动语句来调用你的程序中的各种功能,这也是方便以后对软件进行检修的一种方法

    linux shell实现随机数几种方法分享(date,random,uuid)

    那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了。现在很多都是操作系统内核会提供相应的api,这些原始参数是获取一些计算机运行原始信息,如内存,电压,物理信号等等,它的值在一个时间段可以...

    python3.6.0入门指南(官方版)

    如果你要用计算机做很多工作,最后你会发现有一些任务你更希望用自动化的方式进行处理。比如,你想要在大量的文本文件中 ...用 Python 编写的程序通常比同样的 C 、 C++ 或 Java 程序更短小,这是因为以下几个原因

    边干边学——LINUX内核指导

    2. 2 实现一个简单的shell程序 2. 3 shell编程 第3章 内核时钟 3. 1 关于时钟和定时器 3. 2 Linux系统时钟 3. 3 Linux系统定时器 3. 4 时钟命令介绍 3. 5 定时器的应用 第4章 内核模块 4. 1 概述 4. 2 模块实现机制 ...

    UNIXLinux实验报告.doc

    Linux实验报告,实验结果图形都很清晰

    快捷运维,,项目基于shell、python,运维脚本工具库+源代码+文档说明

    - 于是我就思考如何能优化我的运维工作,提高效率,本来要几个小时的工作任务,能否在几分钟之内完成呢? ## 使用快捷运维脚本的好处 - 工作任务可以快速完成,提高效率,减少加班,这样就有更多的时间陪家人,或做...

    Linux中Bash环境变量的配置方法

    Shell 既是一种命令语言,又是一种程序设计语言。 以下是几种shell版本,bash是默认的: sh(全称 Bourne Shell): 是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用。 Bourne Shell 在 shell 编程方面相当优秀...

    银行家算法目六、linux模块加载或内核编译

    项目七、linux shell程序设计 设计要求: 1.熟练掌握shell的使用,会编写简单的shell程序。 2.Linux环境下利用 shell设计和实现机房的辅助管理系统 3.利用Linux shell进行程序脚本设计,实现两大功能:编辑生成上机...

    入门学习Linux常用必会60个命令实例详解doc/txt

    建议在/mnt里建几个/mnt/cdrom、/mnt/floppy、/mnt/mo等目录,当作目录的专用挂载点。举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设都是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ==...

    Tcl_TK编程权威指南pdf

    这是因为Tcl/Tk的shell程序wish提供了对其他程序、文件系统和网络套接字的存取功能,同时还能够创建图形用户界面。不管怎样,现在发现包含几千行Tcl脚本的应用程序并不稀奇。 我编写这本书的原因就是,虽然自己...

    C++程序设计实践项目——学生信息管理系统,基于Qt+MySQL.zip

    MySQL内部包含几个特殊的系统数据库,如: information_schema:提供关于所有数据库、表、列、索引等元数据信息,是查询数据库结构的标准接口。 mysql:存储MySQL自身的系统信息,如用户权限、服务器配置、事件...

    毕业设计,微信小程序-一款基于校园跑步的社交小程序.zip

    MySQL内部包含几个特殊的系统数据库,如: information_schema:提供关于所有数据库、表、列、索引等元数据信息,是查询数据库结构的标准接口。 mysql:存储MySQL自身的系统信息,如用户权限、服务器配置、事件...

Global site tag (gtag.js) - Google Analytics