免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cuci
打印 上一主题 下一主题

Unix系列shell程序编写(转)  关闭 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-09-19 14:58 |只看该作者
谢谢楼主了,我现在对shell很有兴趣,偶尔写点小脚本,方便自己的工作。
shell太实用了。

论坛徽章:
0
42 [报告]
发表于 2007-09-22 15:19 |只看该作者
关于第3节变量替换的部分,一开始看的时候没看懂,网上找了下资料,贴在这里给有需要的朋友看看

变量替换

变量替换可使shell程序员根据变量的值去操作。变量替换分成两类:
1、当变量有值时去发生动作
2、当变量没有值时去发生动作

动作的范围从一次值替换到退出脚本。
这些分类可以把分成四种形式的变量替换。下面列出全部变量替换的方法:
${parameter:-word}   如果parameter是空或者没有设置,word替换parameter。parameter的值不会发变化。
${parameter:=word}   如果parameter是空或者没有设置,parameter被设置成word的值。
${parametermessage}如果parameter是空或者没有设置,messeage是被打印到屏幕上错误信息。它检查这个变量是否被设置正确。
${parameter:+word}   如果parameter是被设置,word替换parameter。parameter的值不会发变化。

用一个默认的值替换
第一种形式当一个变量没有设值时或者空时,可以用一个默认的值代替。如下简单的例子:
PS1=${HOST:-localhost}"$ " ; export PS1 ;
你可以使用这种方法在用户的.profile中确保他的提示符总是正确的。这种形式的变量替换不影响变量的值。它执行替换动作仅仅当变量没有设值时。

分配一个默认的值
去设置变量的值,第二种形式的变量必须被用到。如下例:
PS1=${HOST:='uname -n'}"$ " ; export PS1 HOST ;
执行完上面的命令后,PS1和HOST都被设值。这个例子也说明实事上默认的字串不必是先设置好的,也可以通过命令去设定。如果这个替换在shell中不存在。
那就只能用下面的行去执行达到同样的效果:
if [ -z "$HOST" ] ; then HOST='uname –n' ; fi ; PS1="$HOST$ ";export PS1 HOST ;
可以看到,变量替换比上面的描述更短,更清楚。

由于变量错误的异常退出
有时替换默认值能隐藏问题,像sh支持第三种形式的变量替换,可以使系统输出错误信息到屏幕上面当变量没有设置的时候。
一个常用的地方是在脚本中,shell的函数要求一些变量被设置成正确的值后才被正确执行。如下例:
${HOME"Your home directory is undefined."}
最后一种变量替换是当变量被设置时。
这种形式不改变变量的值,它仅仅改变要替换成的内容。最常用的是当一个脚正在运行在DEBUG模式。
echo ${DEBUG:+"Debug is active."}

命令和数学运算替换
分为:
命令替换
数学运算替换

命令替换是一种方式,shell执行一个被给定的命令,然后在执行命令的地方输出结果。当命令如下面的形式时命令替换执行。
`command`
命令替换的主要用途是分配一个命令的输出给一个变量的值。如下:
DATE=`date`
USERS=`who | wc –l`
UP=`date ; uptime`
在第一个例子中date的输出赋给变量DATE,第二个例子wc | wc -l执行的结果送给USERS变量当值。最后一个例子的输出也成为了UP的值。
你也可以用命令替换作为其它命令的参数如下:
grep `id –un` /etc/passwd

数学运算替换
在ksh和bash中它们提供expr或者bc去做数学运算在shell脚本中。这些特性在sh中不提供。
但是可以用如下形式:
$((expression))
expression是根据标准的数学约定的,操作符有+,-,*,/,()。
如下例;
foo=$(( ((5 + 3*2) - 4) / 2 ))
最后foo的结果是3。

论坛徽章:
0
43 [报告]
发表于 2007-09-22 15:35 |只看该作者
长文,留名学习

论坛徽章:
0
44 [报告]
发表于 2007-09-25 16:28 |只看该作者
#测试continue
I=1
while [ $I -lt 10 ]
do
  if [ $I -eq 3 ]
  then
    continue
  fi
  if [ $I -eq 7 ]
  then
    break
  fi
  echo "$I\c"
done

执行上面程序,结果如下:

12456789

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

这个结果应该是12456吧?

论坛徽章:
0
45 [报告]
发表于 2007-10-12 14:10 |只看该作者
东本挺好的,学习学习:wink:

论坛徽章:
0
46 [报告]
发表于 2007-11-15 11:15 |只看该作者
看完了      好东西,对我这样的新手很不错的入门教材···        支持一下!

论坛徽章:
0
47 [报告]
发表于 2007-12-04 11:09 |只看该作者
好铁 狂顶

论坛徽章:
0
48 [报告]
发表于 2008-04-03 10:16 |只看该作者

回复 #44 ken1984 的帖子

这个我也没看懂,I的值是如何变化的呢?循环里没有表现出来啊

论坛徽章:
0
49 [报告]
发表于 2008-04-03 10:16 |只看该作者
原帖由 ken1984 于 2007-9-25 16:28 发表
#测试continue
I=1
while [ $I -lt 10 ]
do
  if [ $I -eq 3 ]
  then
    continue
  fi
  if [ $I -eq 7 ]
  then
    break
  fi
  echo "$I\c"
done

...


这个我也没看懂,I的值是如何变化的呢?循环里没有表现出来啊,我觉得结果应该是死循环,一直显示1

[ 本帖最后由 snake_blue 于 2008-4-3 10:18 编辑 ]

论坛徽章:
0
50 [报告]
发表于 2008-04-03 12:29 |只看该作者

回复 #1 cuci 的帖子

  -a 将所有变量输出
  -c "string"从string中读取命令
  -e 使用非交互式模式
  -f 禁止shell文件名产生
  -h 定义
  -i 交互式模式
  -k 为命令的执行设置选项
  -n 读取命令但不执行
  -r 受限模式
  -s 命令从标准输入读取
  -t 执行一命令,然后退出shell
  -u 在替换时,使用未设置的变量将会出错
  -v 显示shell的输入行
  -x 跟踪模式,显示执行的命令

能对这些具体解释下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP