注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

极夜.潜的博客

 
 
 

日志

 
 

Linux shell script 中容易混淆的要点  

2011-06-25 11:23:48|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

shell入门可参考鸟哥的基础教程(12

$$:所在脚本的进程ID。

$!:上一个在后台运行作业的PID。

$?:上一条命令的返回值。

$#:shell脚本的输入参数个数。

$N(N=0,1,2,...):脚本输入的第N个参数。

${var}
当变量var追加字符串Str时,用$varStr不行,要用${var}Str。

单引号',双引号"和反引号`(在美式键盘上,`是ESC下面的那个键)
(1)当变量var="hello"时,echo "${var}, world"输出hello world,而echo '${var}, world'输出${var}, world;
(2)`cmd`用于执行命令cmd。

&,&& ,||与;

(1)cmd&:cmd在后台运行;
(2)cmd1&&cmd2:cmd1执行成功则执行cmd2,否则不执行cmd2;
(3)cmd1||cmd2:cmd1执行成功则不执行cmd2,否则执行cmd2;
(4)cmd1;cmd2:不管cmd1是否执行成功,cmd2都将执行。

$(cmd)
和符号`cmd`(这是反引号)相同。当cmd成功执行,var=$(cmd),var的值是命令执行的输出。

()和{}都是对一串的命令进行执行,但有所区别:

A, ()只是对一串命令重新开一个子shell进行执行;
B, {}对一串命令在当前shell执行;
C, ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开;
D, ()最后一个命令可以不用分号;
E, {}最后一个命令要用分号;
F, {}的第一个命令和左括号之间必须要有一个空格;
G, ()里的各命令不必和括号有空格;
H, ()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令。

示例:

( cmd1;cmd2;...;cmdN ) #在一个子shell里执行一组命令
{ cmd1;cmd2;...;cmdN } #在当前shell里执行一组命令 
jiye@debian:~$ A=1;echo $A;{ A=2; };echo $A 


jiye@debian:~$ A=1;echo $A;( A=2; );echo $A 

${var%pattern},${var%%pattern},${var#pattern},${var##pattern},${var/str1/str2},$(var//str1/str2)——变量的删除与替换

  Linux shell script 中容易混淆的要点 - 极夜.潜 - 极夜.潜的博客

${var:-string},${var:+string},${var:=string},${var:?string},${var-string},${var+string},${var=string},${var?string}——变量的检测与替换

  Linux shell script 中容易混淆的要点 - 极夜.潜 - 极夜.潜的博客

(())——对shell中算数及赋值运算的扩展,语法:((表达式1,表达式2…))。
注:这种扩展不适用于sh,可用于bash、zsh、ksh等。
当a=10时,((a=a+9*9))后,a的值为91。
(())可扩展流程控制语句,示例:
for ((i=0;i<=num;i++)) #for后要有一个空格
do
...
done
如果双括号带$,将获得表达式值,赋值给左边变量:
$((exp))——POSIX标准的扩展计算
注:可用于sh。
只要符合C的运算符都可用在$((exp)),甚至是三目运算符。这种扩展计算是整数型的计算,不支持浮点型。若是逻辑判断,表达式exp为真则为1,假则为0。
例如:x=$((3+4,5*6,9*9)),x的值为81

计算i=i+1的三种办法
(1)i=$(($i+1))
(2)i=`expr $i + 1` #注意+两边的空格
(3)let "i=i+1"
其中第一种和第二种是可以在sh里面使用的,第三种只能在bash里使用。第一种最简单,通用。

[]
(1)用作数值计算,例如:z=$[3**4]。
(2)用作条件测试,例如:
i=9
if [ $i -lt 10 ]; then #注意if和[后以及]前都有一个空格
echo $i
fi
用于测试的指令参考
[ "$a" -lt "$b" ]也可以改成双括号的形式(( "$a" < "$b" ))

[[]]
[[]]是关键字,许多shell(如sh、ash、bsh)并不支持这种方式,ksh、bash(据说从2.02起引入对[[]]的支持)等支持。[]是一条命令,与test等价,大多数shell都支持。在现代的大多数sh实现中,[]与test是内部(builtin)命令。
  Linux shell script 中容易混淆的要点 - 极夜.潜 - 极夜.潜的博客
(1)if [ $a != 1 ] || [ $b = 2 ]] 等价于 if [[ $a != 1 || $b = 2 ]]。
(2)[[]]为字符串比较提供模式匹配(正则表达式)的高级功能,[]不提供。例如:
[[ $var = [Ss]top ]]    # var可以等于Stop或stop,注意[[后,]]前和=两边有空格。 

 

参考:
http://www.linuxsir.org/bbs/showthread.php?t=180140
http://www.linuxsense.org/archives/124.html
http://www.phpzixue.cn/detail1113.shtml
http://blog.csdn.net/taotaotheripper/archive/2010/07/25/5764963.aspx
http://090426.blog.51cto.com/445761/391467
http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731
http://mywiki.wooledge.org/BashFAQ/031

  评论这张
 
阅读(374)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018