Chinaunix首页 | 论坛 | 博客
  • 博客访问: 753931
  • 博文数量: 199
  • 博客积分: 3584
  • 博客等级: 中校
  • 技术积分: 2193
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 21:18
文章分类

全部博文(199)

文章存档

2018年(6)

2013年(14)

2012年(30)

2011年(28)

2010年(24)

2009年(86)

2008年(11)

分类:

2012-10-28 18:18:04

原文地址:shell脚本中的一些技巧 作者:梦飞雨

1、在shell中关于命令行参数的几个使用方法:
$#:表示命令行中有多少个参数
$0:表示调用程序的名称,也就是命令名称
$[1~9]:表示命令行中相应的参数(1~9);而对于超过10个参数的时候,对相应参数的引用应该加上花括号。也就是如果要       对第12个参数进行引用的话就要采用${12}这种表达方式。
$@:表示命令行所有的参数,例如命令 ls -l testfile,则$@表示"-l testfile"
$*:表示命令行的所有参数。
    对于$@和$*的不同就在于他们加上双引号的时候"$@"将命令行参数还是按照多个参数进行表示,而"$*"是将命令行参数合并成一个进行表示。例如:命令 cat -a1 -a2 -a3,则"$@"表示的是三个参数($1=-a1,$2=-a2,$3=-a3),而"$*"表示的是一个参数($1="-a1 -a2 -a3")。
$$:表示该进程所对应的PID
$!:表示后台进程的PID。
$?:表示的是上一个命令执行的状态(0表示正常结束,非0表示异常结束)
shift:左移命令行参数,也就是将命令行的参数向左移动。第1个参数($1)被丢弃,第2个参数($2)编程第1个参数($1),      第3个参数编程第2个参数……。也可以给shift加一个参数n表示从n位置开始进行左移。
set:命令初始化命令行参数。set命令把set后面跟的一个或几个参数赋值给位置参数,这些位置参数以$1打头。例如:
set this is it就是为位置参数$1,$2,$3赋值为$1=this,$2=is,$3=it。

:-:使用默认值。修饰符:-使用一个默认的值来替代那些空的或者没有赋值的变量。例如:${name:-default}表示当变量name没有赋值的时候用default来替代name,但是变量name并没有改变
:=:为变量赋默认值。:-不能改变变量的值,但是:=却可以。例如:${name:=default}表示当变量那么没有赋值的时候用default来替代name,同时name赋值为default。
:?:显示错误信息。例如${name:?message}表示当变量name没有赋值的时候,提示错误信息message。
::shell脚本中常常用冒号(:)后面跟扩展表示符(:=)来给任意一个空变量或者为赋值的变量赋值。冒号命令通常给命令行上其后的符号赋值而不会去执行后面的命令。假如在一行的前面没有冒号提示符,shell就会赋值并试图执行来自赋值语句的命令。

2、在shell编程中怎么改变参数变量的方法:
在shell编程中,有时候需要改变命令行的参数,或者需要获取在shell程序中获取其他命令的运行结果信息。那么就可以使用下面的方法来获取。
例如:要在shell程序中获取一个文件的链接数目,那么可以采用下面的命令
set -- $(ls -l "$filename")
linkcnt=$2
上面的命令表示重新设置命令行参数列表(也即重新设置$1~$9),其中set后面的--表示忽略以-开头的参数信息(也即如果开头是-的话,也把它当作一个普通字符,而非一个参数连接符)。接着括号里面命令ls 表示列出文件filename的相关信息。用ls列出文件的信息如下:
[root@localhost ~]# ls -l in.txt
-rw-r--r-- 1 root root 130 06-25 18:24 in.txt
其中第一项是文件的执行权限信息,第二项是连接数……
然后再通过set命令和$()引用ls执行的结果,那么新的参数表就变成了如下
$1:-rw-r--r--
$2:1            (文件的连接数)
$3:root
$4:root
$5:130
...
所以通过上面的命令就可以将文件filename的连接数保存在$2中。

而下面的例子是将文件的inode节点号保存在$1中
set $(ls -i "filename")

typeset可以将一个参数设置为局部参数。

注意:在采用上面方法重置命令行参数的时候要将原来的参数保存起来,不然会被新的结果冲掉
shell中的字符串匹配

bash提供了可操作路径名字符串以及其他字符串的类型陪陪操作符。这些操作符可以从字符串的前缀或者后缀中删去字符串,4个字符串匹配操作符如表所示:

______________________________________________
操作符               |           功能          |
----------------------------------------------|
#                    |    去除最小匹配前缀     |
----------------------------------------------|
##                   |   去除最大前缀匹配      |
----------------------------------------------|
%                    |   去除最小匹配后缀      |
----------------------------------------------|
%%                   |   去除最大匹配后缀      |
----------------------------------------------

这些操作字符的语法形式如下:
${varname    op    pattern  }
这里op是上表列出的4个操作字符中的一个,pattern是一个匹配类型,它一般和文件名很相似。这些操作符一般用来操作路径名,以便提取或者移除某些组件,或者用来改变后缀:
$   SOURCEFILE=/usr/local/src/prog.c
$   echo ${SOURCEFILE#/*/}
local/src/prog.c
最小匹配前缀就是从第一个/之后的字符往后找,因为是*号,所以匹配所有字符,一直找到第二个/,最后剩下字符串local/src/prog.c
$   echo ${SOURCEFILE##/*/}
prog.c
最大匹配前缀就是从第一个/往后找,因为是*符号,所以匹配所有字符,一直找到最后一个/,最后剩下字符串prog.c
$    echo ${SOURCEFILE%/*}
/usr/local/src
最小匹配后缀就是从后往前找,找到第一个匹配的字符串序列/prog.c
$    echo ${SOURCEFILE%%/*}

输出为空,因为最大匹配后缀就是从第一个/后面开始匹配的整个字符串。


可以用以下方法来获得字符串name的字符个数(长度)
${#name}

在对字符串进行处理的时候可以不加符号$来引用位置参数。例如
${#1}
表示参数1的长度。
${1%/*}可以表示一个参数1所代表的路径的父目录是否存在。
info bash builtin命令可以列出所有的bash内置命令。

File: bash.info,  Node: Builtin Index,  Next: Reserved Word Index,  Prev: Copying This Manual,  Up: Top

Index of Shell Builtin Commands
*******************************


* Menu:

* .:                                     Bourne Shell Builtins.
                                                              (line  16)
* ::                                     Bourne Shell Builtins.
                                                              (line  11)
* [:                                     Bourne Shell Builtins.
                                                              (line 212)
* alias:                                 Bash Builtins.       (line  11)
* bg:                                    Job Control Builtins.
                                                              (line   7)
* bind:                                  Bash Builtins.       (line  21)
* break:                                 Bourne Shell Builtins.
                                                              (line  29)
* builtin:                               Bash Builtins.       (line  92)
* caller:                                Bash Builtins.       (line 100)
* cd:                                    Bourne Shell Builtins.
                                                              (line  36)
* command:                               Bash Builtins.       (line 117)
* compgen:                               Programmable Completion Builtins.
                                                              (line  10)
* complete:                              Programmable Completion Builtins.
                                                              (line  28)
* continue:                              Bourne Shell Builtins.
                                                              (line  55)
* declare:                               Bash Builtins.       (line 136)
* dirs:                                  Directory Stack Builtins.
                                                              (line   7)
* disown:                                Job Control Builtins.
                                                              (line  83)
* echo:                                  Bash Builtins.       (line 191)
* enable:                                Bash Builtins.       (line 243)
* eval:                                  Bourne Shell Builtins.
                                                              (line  63)
* exec:                                  Bourne Shell Builtins.
                                                              (line  70)
* exit:                                  Bourne Shell Builtins.
                                                              (line  82)
* export:                                Bourne Shell Builtins.
                                                              (line  88)
* fc:                                    Bash History Builtins.
                                                              (line  10)
* fg:                                    Job Control Builtins.
                                                              (line  16)
* getopts:                               Bourne Shell Builtins.
                                                              (line 103)
* hash:                                  Bourne Shell Builtins.
                                                              (line 145)
* help:                                  Bash Builtins.       (line 271)
* history:                               Bash History Builtins.
                                                              (line  39)
* jobs:                                  Job Control Builtins.
 * kill:                                  Job Control Builtins.
                                                              (line  57)
* let:                                   Bash Builtins.       (line 280)
* local:                                 Bash Builtins.       (line 287)
* logout:                                Bash Builtins.       (line 297)
* popd:                                  Directory Stack Builtins.
                                                              (line  37)
* printf:                                Bash Builtins.       (line 301)
* pushd:                                 Directory Stack Builtins.
                                                              (line  58)
* pwd:                                   Bourne Shell Builtins.
                                                              (line 163)
* read:                                  Bash Builtins.       (line 326)
* readonly:                              Bourne Shell Builtins.
                                                              (line 172)
* return:                                Bourne Shell Builtins.
                                                              (line 187)
* set:                                   The Set Builtin.     (line   9)
* shift:                                 Bourne Shell Builtins.
                                                              (line 200)
  * shopt:                                 Bash Builtins.       (line 387)
* source:                                Bash Builtins.       (line 618)
* suspend:                               Job Control Builtins.
                                                              (line  94)
* test:                                  Bourne Shell Builtins.
                                                              (line 212)
* times:                                 Bourne Shell Builtins.
                                                              (line 278)
* trap:                                  Bourne Shell Builtins.
                                                              (line 283)
* type:                                  Bash Builtins.       (line 622)
* typeset:                               Bash Builtins.       (line 653)
* ulimit:                                Bash Builtins.       (line 659)
* umask:                                 Bourne Shell Builtins.
                                                              (line 324)
* unalias:                               Bash Builtins.       (line 737)
* unset:                                 Bourne Shell Builtins.
                                                              (line 341)
* wait:                                  Job Control Builtins.
                                                              (line  73)
                                                           (line  25)

可以通过使用命令info builtin查看所有命令的详细用法
阅读(4543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~