首页 电脑 电脑学堂 查看内容

shell基础--带条件的参数替换

2011-12-31 16:34 603 0

摘要: 这次我们来讨论一下变量的求值运算。变量求值运算的结果取决于该变量的值是null还是一个数值。shell的这个特性被称为参数替换。Bourne shell也有这个特性。变量求值运算的一般形式为: ${...
关键词: 变量 运算 一个 flname clipboard 结果 脚本 如果 程序 特性

这次我们来讨论一下变量的求值运算。变量求值运算的结果取决于该变量的值是null还是一个数值。shell的这个特性被称为参数替换。Bourne shell也有这个特性。变量求值运算的一般形式为: ${<var>:<opt><stg>} 上式中,<var>表示一个变量,后面跟一个冒号(:),冒号后面的<opt>是可选项,它是+、-、=、?四个符号中的任一个;符号后面又跟一个字符串<stg>。除了一种例外情况外,参数替换不会改变变量本身的值,但会影响变量的求值运算结果。变量的求值运算有四种方式: +可选项 这种方式下,如果变量var已经定义且是一个非空字符串,则对变量var的求值运算结果为stg。常利用这个可选项,当变量值为非空时,把命令的结果赋给这个变量,并回显一个消息: [Copy to clipboard]View Code BASH found=`ls` echo ${found:+”This directory is not empty”} 如果ls命令找不到任何文件,则它不会回显任何消息,在这种情况下,变量found为一个空值。当然当ls命令至少找到一个文件时,则回显"This directory is not empty"信息。 -可选项 当变量还没有定义,或者变量是一个空值(正好与+可选项相反),则对变量的求值运算的结果为stg,在程序中我们经常利用这个特性让用户输入一个文件名,如果用户只按了回车键,则使用一个默认的文件名: [Copy to clipboard]View Code BASH echo "Enter the filename : \c" read flname fname=${flname:-emp.lst} 如果flname为空值,或者还没有赋值,则它的求值运算结果为emp.lst。flname变量仍然是一个空值。这种简洁的赋值语句,相当于if条件语句。 =可选项 这个可选项与-可选项类似,只是它更进一步,对于变量进行求值运算,并为变量赋值。利用这个可选项,我们可以在命令中使用参数替换,而不需要通过中间量: [Copy to clipboard]View Code BASH echo "Enter the filename : \c" read flname grep $pattern {flname:=emp.lst} #flname is now assigned 注意最后一个语句,现在变量flname本身也赋予emp.list文件名(条件是它还没有赋值,或是空值)。这个特性常用在循环的控制命令中,给变量赋初始值。下面的两个语句: [Copy to clipboard]View Code BASH x=1; while [ $x –le 10 ] 可以简化为一个语句 [Copy to clipboard]View Code BASH while [ ${x:=1} –le 10 ] ?可选项 如果变量已设置值且非空,则变量的求值运算结果就是这个变量的值,否则回显一个字符串并终止shell脚本程序的运行。这个特性在脚本中非常有用,当用户输入不符合程序的要求时,就终止脚本程序的运行: [Copy to clipboard]View Code BASH echo "Enter the filename : \c" read flname grep $pattern ${flname:?"No filename entered"} 如果用户没有输入文件名,则输出"No filename entered"消息,同事终止脚本程序的执行,不需要用exit命令。 除了=运算符外,其他三个运算符都可以与位置参数一起使用。有了这些可选项后,如果调用脚本程序时没有使用参数,则我们可以很容易把某个默认值赋给某个变量: [Copy to clipboard]View Code BASH flname=${1:-emp.lst} #$1 is null if script invoked without arguments 利用这些特性,读者可以进一步简化以前的一些脚本程序。 注:只有=可选项会给变量赋值。其他可选项只影响变量的求值运算结果。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部