您的位置: 首页 >> 文章首页 >> 软件瞭望 >> 网络资讯 >> shell编程Bash中对变量的操作方法谈
搜 索 发布软件 文章投搞 说明






分类列表
4软件新闻
4新鲜点评
4硬件资讯
4网络资讯
4安全资讯
4业界新闻
4数码资讯
4深入报道

shell编程Bash中对变量的操作方法谈
作者: 来源: 时间:2004-12-3 13:32:02

呵呵,其实很多东西,在 ksh,甚至是 sh 里就已经存在了的。刚才把我在念大学时发的一个帖子找出来了,贴出来大家参考一下吧。

- ksh中的串编辑命令:
${variable#pattern} 删除匹配variable值头部的pattern的最短部分,返回剩余部分。
${variable##pattern} 删除匹配variable值头部的pattern的最长部分,返回剩余部分。
${variable%pattern} 删除匹配variable值尾部的pattern的最短部分,返回剩余部分。
${variable%%pattern} 删除匹配variable值尾部的pattern的最短部分,返回剩余部分。
其中,pattern可以是文件名通配符。

例如:
var=/home/cheyenne/programs/shell/e.f.g
${var} ====> /home/cheyenne/programs/shell/e.f.g
${var#/*/} ====> cheyenne/programs/shell/e.f.g
${var##/*/} ====> e.f.g
${var%.*} ====> /home/cheyenne/programs/shell/e.f
${var%%.*} ====> /home/cheyenne/programs/shell/e
${var%%/*/} ====> /home/cheyenne/programs/shell/e.f.g
${var%%/*} ====>
${var%/sailing*} ====> /home
${var%%/sailing*} ====> /home

- 用通配符匹配所有圆点文件:
在Bourne Shell,Korn Shell和bash中,可以用 .[!.]* 来匹配所有的以圆点开头的文件。
在tcsh中,可以用 .[^.]* 来匹配。
解决办法:通过shell设置文件。
dots=".[`echo \\\\001--0-\\\\0177`]*"    # sh, ksh, bash
set dots=".[`echo Y--0-Z | tr YZ \\001\\117`]"  # csh, tcsh

- ls命令技巧:
-t选项:根据文件的修改时间(ctime)来进行分类,先列出新的文件。
-u选项:显示文件的最后访问时间(atime),但是必须和-t或-l一起使用(单独的 ls -u 命令不起作用)。
-C选项:沿列向下而不是横向排列文件。
-A选项:同-a选项(列出所有文件),但是不包括.和..目录。
-L选项:列出这个链接指向的文件而不是链接本身。

- 不能访问一个文件?====>寻找文件名中的空格:
例如:
$ls
project     exefiles    tools
$cat project
cat: project: No such file or directory

可以试一下这个命令:
$ls -l | cat -v -t -e
total 89$
-rw-rw-rw- 1 sailing      28 Jan 7 10:00 project $
-rw-r--r--  1 root   25179 Mar 2 15:00 exefiles$

cat命令的-e选项用一个$来标志行的末尾。project后面的$并没有紧跟文件名,这说明这个文件名是以一个空格结尾的。可以把它改名:
$mv 'project ' project

ls命令有个-q选项,把空格、TAB等空白字符显示为?。

- 显示文件名中的非打印字符:
例如:
$ls
ab??cd  # 这表示在ab和cd之间有两个非打印字符

若想删除或重命名该文件,可以使用通配符,如 ab??cd。
[注意]有很多时候,可能会生成许多奇怪的文件名,ls命令显示它们是都是以????开始。这时,许多新手会天真地输入 rm ????*……
可以使用ls命令的-b选项来打印出任何非打印字符的八进制值(前加\)。
$ls -b
ab\013\014cd

- 巧设文件权限:
在对权限进行测试时,系统会依次检查各个组。若用户权限被拒绝,UNIX就不会再检查下一个组了。那么考虑这样一个情况,某个文件由用户sailing所有,位于组guests中,且有权限-----xrwx(八进制的017)。这会产生这样的结果:用户sailing自己不能使用该文件,组guests中的任何用户都可以执行该程序,且除了sailing和guests之外的任何人都能读、写和执行该程序。
这不是很常见的设置,但可以用类似的机制来拒绝一组用户访问或使用某个文件。
====> 假设用户在一台计算机上工作,其中有一些私人的、“客人”不能使用的文件。在该机器上工作的其他人应具有访问权。那么,可以把这些文件放到一个名叫deny的组所拥有的目录中,然后用chmod来拒绝对该组的权限:
#chmod 705 /dir
#ls -lgd /dir
drwx---r-x  2  root  deny      512  Dec 11 12:00 /dir

- 从另一个用户的终端来清除你的屏幕(主要是为了保护显示器):
首先从另一个终端登录或者su到自己的帐号,然后:
$who | grep sailing
sailing ttyp3 Jan 1 10:00
$clear > /dev/ttyp3

若是在一个不同类型的终端上,那么应先临时设置TERM环境变量。

- tail命令:
$tail -n  #显示最后n行
$tail +n  #抛弃前面的n-1行,给出第n行和它后面的所有内容。
$tail -nb  #显示文件的最后n块(n*512个字节)的内容。
$tail -r  #以相反的顺序显示文件(从最后一行开始)

- wc命令的技巧:
$expr `wc -w < file1` - `wc -w < file2`  #比较file1中的单词比file2中的多多少

- tr命令的-d和-s选项:
$tr -d ",.!?;:'"'"`' < file  #从输入中删除所有在字符串中指定的一个或多个字符
$tr -s " " " " < file  #删除第二个参数中多次连续出现的相同字符

- sort排序:
$sort -f  #不区分大写字母和小写字母
$sort -nb +0  #忽略开始的空格(必须指定开始字段,即0)

UNIX对数字排序时是把前面额外加有空格的数字排在前面,用上面的命令可以解决这个麻烦。而sort -n命令则不行。

- Bourne Shell的冒号操作符:
1、代替UNIX的true命令来做一个无限while循环的条件:
while :
do commands
done

2、在if中使用else,但又要使then为空(什么都不干)时:
if condition
then :
else commands
fi

3、有的Bourne shell版本没有真正的#注释符,可以用冒号来伪装(最好使用引号,比较安全):
: 'written by sailing'

4、可用于像${var?}或${var=default}这样的参数替换:
: ${USER?} ${HOME?}  #在USER或HOME变量没有设置时显示一个错误并退出
上一篇文章:
下一篇文章:[推荐]SCO UNIX宝典
相关文章:
首 页广告联系本站声明下载帮助发布软件访客留言关于我们
© CopyRight 2002-2004, 软件588下载站(破解资源下载基地) www1.rj588.com, Inc. All Rights ReservedPowered by
明日互联提供空间及带宽
绵IDC备00274号