您的位置:首页 > 运维架构 > Shell

shell学习杂记(-)

2011-02-10 16:14 274 查看
单引号可以屏蔽任何特殊字符

双引号可以屏蔽$ 反斜杠\ 反引号`以外的任何特殊字符

\反斜杠屏蔽任何紧跟其后的单个特殊字符,等于在单个字符上加上单引号

$#传递给脚本的参数个数

$0正在执行的命令的名字

命令若被成功执行,返回的状态码总是0,反之则为非零值,当脚本读到exit就会无条件退出,若exit不指定状态码就会默认采用上一个命令执行后返回的状态码

case只执行其中符合条件的其中之一,执行完之后跳出,每个分支后面都有两个分号,只有最后一个分支后面的分号可以省略。

case value in

va1 ) command



command ;;

va2 ) command



Command ;;



van ) command



Command ;;

esac

字符串比较

[ string1 = string2 ] string1和string2相同

[ string1 != string2 ] string1和string2不相同

[ -n string ] string不为空

[ -z string ] string为空

整数比较

[ int1 –eq int2 ] int1等于int2

[ int1 –ne int2 ] int1不等于int2

[ int1 –gt int2 ] int1大于int2

[ int1 –ge int2 ] int1大于等于int2

[ int1 –lt int2 ] int1小于int2

[ int –le int2 ] int1小于等于int2

文件判断

[ -e file ] file存在

[ -d file ] file为目录

[ -f file ] file为普通文件

[ -r file ] file可读

[ -w file ] file可写

[ -x file ] file可执行

[ -s file ] file内容不为空

[ -L file] file为符号链接

逻辑操作符

[ express1 –a express2 ] 条件1和条件2同时满足

[ express1 –o express2 ] 条件1和条件2至少有一个满足

[ !express1 ] 条件1不满足

if test xxx=if [xxx]

for循环用来将一组命令循环执行预先确定的遍数,基本格式如下:

for var in word1 word2 … wordn

do

command

command



done

首先将word1的值给变量var执行,之后是word2...in之后有几个值就循环几次

for的另外一种形式

for ((i=1;i<10;i++))

do

echo $i

done (())是固定格式

for是执行循环,if是执行判断,while则是两者的集合,先判断后执行循环,until则正好相反,判断结果为否则往下执行

awk '{pattern + action}' {filenames}

对于awk来说整个文件就是一个记录,用$0表示,每一列用$1,$2..表示,模式匹配写在//中,需要替换的内容写在" "中,awk '{ sub(/test/, "mytest"); print }' testfile

sub对行进行操作,gsub对整个文档进行操作。把每个单词当作一个域,默认把空格和Tab作为域分隔符,可以使用-F:参数把默认的域分隔符转为冒号

查找多个模式匹配类似于awk '/AL|IN/' emp_names

脚本中使用:表示空命令,>/dev/null屏蔽输出

>/dev/null 2>&1这条命令将标准输出和错误输出都重定向到了控设备文件中,也就是都丢弃了,0-标准输入,1-标准输出,2-标准错误输出

awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。

shell命令的执行顺序

1. 命令A && 命令B

如果命令A执行成功则接下来执行命令B 否则B不会执行

2. 命令A || 命令B

如果命令A执行失败则接下来执行命令B,否则B不会执行

用()和{ }将命令结合在一起

(命令1;命令2;. . .)

在当前shell中执行一组命令

{命令1;命令2;. . .}

在子shell中执行一组命令

Ex

$ cp idoi1.txt idoi2.txt || (echo “if you see this then cp failed”| mail root; exit)

3.组合使用一般为A && B || C

注意这两个例子:

ls /tmp/abc && echo "exist" || echo "no exist"

ls /tmp/abc || echo "no exist" && echo "exist"

上面第一个是正确的,第二个有问题,为什么?注意&&和||是看$?返回的状态码来决定下一个命令是否执行的。
本文出自 “成长全记录” 博客,请务必保留此出处http://lymrg.blog.51cto.com/1551327/490552
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: