Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82933
  • 博文数量: 24
  • 博客积分: 375
  • 博客等级: 一等列兵
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-13 22:14
文章分类

全部博文(24)

文章存档

2014年(6)

2011年(18)

我的朋友

分类: LINUX

2011-08-09 16:06:52

文件测试比较操作:

 

-f file 是一个regular 文件(不是目录或者设备文件)

-s 文件长度不为0

-d 文件是个目录

-b 文件是个块设备(软盘,cdrom 等等)

-c 文件是个字符设备(键盘,modem,声卡等等)

-p 文件是个管道

-h 文件是个符号链接

-L 文件是个符号链接

-S 文件是个socket

-t 关联到一个终端设备的文件描述符

这个选项一般都用来检测是否在一个给定脚本中的 stdin[-t0][-t1]是一个终端

-r 文件具有读权限(对于用户运行这个test)

-w 文件具有写权限(对于用户运行这个test)

-x 文件具有执行权限(对于用户运行这个test)

-g set-group-id(sgid)标志到文件或目录上

如果一个目录具有 sgid 标志,那么一个被创建在这个目录里的文件,这个目录属于创建

这个目录的用户组,并不一定与创建这个文件的用户的组相同.对于workgroup 的目录

共享来说,这非常有用.<环境高级编程中文版>>58 .

-u set-user-id(suid)标志到文件上

如果运行一个具有 root 权限的文件,那么运行进程将取得root 权限,即使你是一个普通

用户.[1]这对于需要存取系统硬件的执行操作(比如pppd cdrecord)非常有用.如果

没有 suid 标志的话,那么普通用户(没有root 权限)将无法运行这种程序.

<环境高级编程中文版>>58 .

-rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd

对于设置了 suid 的文件,在它的权限标志中有"s".

-k 设置粘贴位,<环境高级编程中文版>>65 .

对于"sticky bit",save-text-mode 标志是一个文件权限的特殊类型.如果设置了这

个标志,那么这个文件将被保存在交换区,为了达到快速存取的目的.如果设置在目录

,它将限制写权限.对于设置了sticky bit 位的文件或目录,权限标志中有"t".

drwxrwxrwt 7 root 1024 May 19 21:26 tmp/

如果一个用户并不时具有 stick bit 位的目录的拥有者,但是具有写权限,那么用户只

能在这个目录下删除自己所拥有的文件.这将防止用户在一个公开的目录中不慎覆盖

或者删除别人的文件,比如/tmp(当然root 或者是目录的所有者可以随便删除或重命名

其中的文件).

-O 你是文件的所有者.

-G 文件的group-id 和你的相同.

-N 从文件最后被阅读到现在,是否被修改.

f1 -nt f2

文件 f1 f2

f1 -ot f2

f1f2

f1 -ef f2

f1f2 都硬连接到同一个文件.

! --反转上边测试的结果(如果条件缺席,将返回true)

 

 

较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq 等于,:if [ "$a" -eq "$b" ]

-ne 不等于,:if [ "$a" -ne "$b" ]

-gt 大于,:if [ "$a" -gt "$b" ]

-ge 大于等于,:if [ "$a" -ge "$b" ]

-lt 小于,:if [ "$a" -lt "$b" ]

-le 小于等于,:if [ "$a" -le "$b" ]

< 小于(需要双括号),:(("$a" < "$b"))

<= 小于等于(需要双括号),:(("$a" <= "$b"))

> 大于(需要双括号),:(("$a" > "$b"))

>= 大于等于(需要双括号),:(("$a" >= "$b"))

字符串比较

= 等于,:if [ "$a" = "$b" ]

== 等于,:if [ "$a" == "$b" ],=等价

注意:==的功能在[[]][]中的行为是不同的,如下:

1 [[ $a == z* ]] # 如果$a "z"开头(模式匹配)那么将为true

2 [[ $a == "z*" ]] # 如果$a 等于z*(字符匹配),那么结果为true

3

4 [ $a == z* ] # File globbing word splitting 将会发生

5 [ "$a" == "z*" ] # 如果$a 等于z*(字符匹配),那么结果为true

一点解释,关于File globbing 是一种关于文件的速记法,比如"*.c"就是,再如~也是.

但是 file globbing 并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!= 不等于,:if [ "$a" != "$b" ]

这个操作符将在[[]]结构中使用模式匹配.

< 小于,ASCII 字母顺序下.:

if [[ "$a" < "$b" ]]

if [ "$a" \< "$b" ]

注意:[]结构中"<"需要被转义.

> 大于,ASCII 字母顺序下.:

if [[ "$a" > "$b" ]]

if [ "$a" \> "$b" ]

注意:[]结构中">"需要被转义.

具体参考 Example 26-11 来查看这个操作符应用的例子.

-z 字符串为"null".就是长度为0.

-n 字符串不为"null"

注意:

使用-n []结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z

或者就是未用""引用的字符串本身,放到[]结构中(Example 7-6)虽然一般情况下可

以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.

 

 

 

位置参数

$0, $1, $2,等等...

位置参数,从命令行传递给脚本,或者是传递给函数.或者赋职给一个变量.

(具体见Example 4-5 Example 11-15)

$#

命令行或者是位置参数的个数.(Example 33-2)

$*

所有的位置参数,被作为一个单词.

注意:"$*"必须被""引用.

$@

$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,

并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的

单词.

注意:"$@"必须被引用.

 

 

 

内部变量

------------

Builtin variable

这些内建的变量,将影响bash 脚本的行为.

$BASH

这个变量将指向 Bash 的二进制执行文件的位置.

bash$ echo $BASH

/bin/bash

$BASH_ENV

这个环境变量将指向一个 Bash 启动文件,这个启动文件将在调用一个脚本时被读取.

$BASH_SUBSHELL

这个变量将提醒 subshell 的层次,这是一个在version3 才被添加到Bash 中的新特性.

Example 20-1.

$BASH_VERSINFO[n]

记录 Bash 安装信息的一个6 元素的数组.与下边的$BASH_VERSION 很像,但这个更加详

 

$DIRSTACK

在目录栈中最上边的值(将受到pushd popd 的影响).

这个内建的变量与 dirs 命令是保持一致的,但是dirs 命令将显示目录栈的整个内容.

$EDITOR

脚本调用的默认编辑器,一般是vi 或者是emacs.

$EUID

"effective"用户ID .

当前用户被假定的任何 id .可能在su 命令中使用.

注意:$EUID 并不一定与$UID 相同.

$FUNCNAME

当前函数的名字.

 

 

$GLOBIGNORE

一个文件名的模式匹配列表,如果在file globbing 中匹配到的文件包含这个列表中的

某个文件,那么这个文件将被从匹配到的文件中去掉.

$GROUPS

当前用户属于的组.

这是一个当前用户的组 id 列表(数组),就像在/etc/passwd 中记录的一样.

 

$HOME

用户的 home 目录,一般都是/home/username(Example 9-14)

$HOSTNAME

hostname 命令将在一个init 脚本中,在启动的时候分配一个系统名字.

gethostname()函数将用来设置这个$HOSTNAME 内部变量.(Example 9-14)

$HOSTTYPE

主机类型

就像$MACHTYPE,识别系统的硬件.

bash$ echo $HOSTTYPE

i686

$IFS

内部域分隔符.

这个变量用来决定 Bash 在解释字符串时如何识别域,或者单词边界.

$IFS默认为空白(空格,tab,和新行),但可以修改,比如在分析逗号分隔的数据文件时.

 

$IGNOREEOF

忽略 EOF: 告诉shell log out 之前要忽略多少文件结束符(control-D).

$LC_COLLATE

常在.bashrc /etc/profile 中设置,这个变量用来在文件名扩展和模式匹配校对顺序.

如果$LC_COLLATE 被错误的设置,那么将会在filename globbing 中引起错误的结果.

 

$LC_CTYPE

这个内部变量用来控制 globbing 和模式匹配的字符串解释.

$LINENO

这个变量记录它所在的 shell 脚本中它所在行的行号.这个变量一般用于调试目的.

 

$MACHTYPE

系统类型

提示系统硬件

bash$ echo $MACHTYPE

i686

$OLDPWD

老的工作目录("OLD-print-working-directory",你所在的之前的目录)

$OSTYPE

操作系统类型.

bash$ echo $OSTYPE

linux

$PATH

指向 Bash 外部命令所在的位置,一般为/usr/bin,/usr/X11R6/bin,/usr/local/bin .

当给出一个命令时,Bash 将自动对$PATH 中的目录做一张hash .$PATH 中以":"分隔的

目录列表将被存储在环境变量中.一般的,系统存储的$PATH 定义在/ect/processed

~/.bashrc(Appendix G).

 

$PIPESTATUS

数组变量将保存最后一个运行的前台管道的退出码.有趣的是,这个退出码和最后一个命令

 

$PPID

一个进程的$PPID 就是它的父进程的进程id(pid).[1]

使用 pidof 命令对比一下.

$PROMPT_COMMAND

这个变量保存一个在主提示符($PS1)显示之前需要执行的命令.

$PS1

主提示符,具体见命令行上的显示.

$PS2

2 提示符,当你需要额外的输入的时候将会显示,默认为">".

$PS3

3 提示符,在一个select 循环中显示(Example 10-29).

$PS4

4 提示符,当使用-x 选项调用脚本时,这个提示符将出现在每行的输出前边.

默认为"+".

$PWD

工作目录(你当前所在的目录).

pwd 内建命令作用相同.

 

$SHELLOPTS

这个变量里保存 shell 允许的选项,这个变量是只读的.

bash$ echo $SHELLOPTS

braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs

$SHLVL

Shell层次,就是shell 层叠的层次,如果是命令行那$SHLVL 就是1,如果命令行执行的脚

本中,$SHLVL 就是2,以此类推.

$TMOUT

如果$TMOUT 环境变量被设置为一个非零的时间值,那么在过了这个指定的时间之后,

shell提示符将会超时,这会引起一个logout.

 

$UID

用户 ID .

当前用户的 id ,/etc/passwd 中记录.

这个值不会因为用户使用了 su 命令而改变.$UID 是只读变量,不容易在命令行或者是脚

本中被修改,并且和内建的id 命令很相像.

 

位置参数

$0, $1, $2,等等...

位置参数,从命令行传递给脚本,或者是传递给函数.或者赋职给一个变量.

(具体见Example 4-5 Example 11-15)

$#

命令行或者是位置参数的个数.(Example 33-2)

$*

所有的位置参数,被作为一个单词.

注意:"$*"必须被""引用.

$@

$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,

并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的

单词.

注意:"$@"必须被引用.

 

$-

传递给脚本的 falg(使用set 命令).

$!

在后台运行的最后的工作的 PID(进程ID).

$_

保存之前执行的命令的最后一个参数.

$?

命令,函数或者脚本本身的退出状态

$$

脚本自身的进程 ID.这个变量经常用来构造一个"unique"的临时文件名.

 

提取子串

${string:position}

string 中从位置$position 开始提取子串.

如果$string "*""@",那么将提取从位置$position 开始的位置参数,[1]

${string:position:length}

string 中从位置$position 开始提取$length 长度的子串.

 

 子串削除
${string#substring}
从$string 的左边截掉第一个匹配的$substring
${string##substring}
从$string 的左边截掉最后一个个匹配的$substring

 

${string%substring}
从$string 的右边截掉第一个匹配的$substring
${string%%substring}
从$string 的右边截掉最后一个匹配的$substring

 

子串替换

${string/substring/replacement}

使用$replacement 来替换第一个匹配的$substring.

${string//substring/replacement}

使用$replacement 来替换所有匹配的$substring.

 

${string/#substring/replacement}

如果$substring 匹配$string 的开头部分,那么就用$replacement 来替换$substring.

${string/%substring/replacement}

如果$substring 匹配$string 的结尾部分,那么就用$replacement 来替换$substring.

 

 

阅读(496) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~