Shell脚本学习指南摘录---1

1、数字与数值表达式

awk并没有提供字符串转数字的函数,不过awk的做法很简单:只要加个零到字符串里边,例如s = “123”,接着n = 0 + s,便将数字123赋给n了。


2、打印前几行的方式

head -n n filename

# head -n 3 passwd

head -n filename

# head -3 passwd

awk 'FNR <= n' filename

# awk 'FNR <= 3' passwd

sed -e nq filename 

# sed -e 3q passwd 

sed nq 

# sed 3q passwd

3、限制临时性文件只能我们可以访问

umask 077 filename


mask: 新建文件、目录的默认权限是由mask决定的

umask: 会影响到mask,umask表示要减掉的权限


代表rwx------,表示owner拥有任何权限,group和other没有完全的操作权限

4、正则

# echo "jones:Adrian W. Jones/OSD211/555-0123" | sed -e 's=^\([^:]*\):[^/]*/\([^/]*\)/.*$=\1:\2='

jones:OSD211


^\([^:]*\)匹配用户名jones

[^/]*/匹配Adrian W. Jones

\([^/]*\)匹配OSD211

.*匹配$555-0123

\1:\2匹配前面()括起来的两组


# echo "jones:Adrian W. Jones/OSD211/555-0123" | sed -e 's=^\([^:]*\):[^/]*/[^/]*/\([^/]*\)=\1:\2='

jones:555-0123


5、变量赋值与环境

5.1、readonly和export


两个相似的命令提供变脸的管理,一个是readonly,它可以使变量成为只读模式;而赋值给它们是被禁止的。在Shell程序中,这是创建符号常量的一个好方法。


hour_per_day=24 赋值

readonly hour_per_day 设为只读模式


export,readonly

用途:

export用于修改或打印环境变量,readonly则使得变量不得修改。


较为常见的是export,其用法是将变量放进环境(environment)里。环境是一个名称与值的简单列表。可供所有执行中的程序使用。新的进程会从其父进程继承环境,也可以再建立新的子进程之前修改它。export命令可以将新变量添加到环境中:

PATH=$PATH:/usr/local/bin 更新PATH

export PATH 导出它


简单化也可以写成这样的:

export PATH=$PATH:/usr/local/bin


export -p 显示当前的环境


export命令仅将变量加到环境中,如果你要从程序的环境变量中删除变量,则要用env命令,env命令也可以临时的改变换进变量值:

env -i PATH=$PATH HOME=$HOME LC_ALL=C awk '...' file1 file2


-i 选项是用来初始化环境变量的;也就是丢弃任何的继承值,仅传递命令行上指定的变量给程序使用。


5.2、unset

unset命令从执行中的Shell中删除变量和函数。默认情况下,它会解除变量设置,也可以加上-v来完成:

unset full_name 删除变量full_name

unset -v first middle last 删除其他变量


使用-f删除函数

who_is_on () { 定义函数

who | awk '{print $1}' | sort -u 产生排序后的用户列表

}

...

unset -f who_is_on 删除函数


5.3、赋值为null和删除变量

myvar=赋值并不会将myvar删除,只不过是将其设为null字符串。相对的:unset myvar则会完全的删除它。


5.4、参数展开

参数展开(parameter expansion)是shell提供变量值在程序中使用的过程。


在shell下,更复杂的形式可用于更特殊的情况。这些形式都是将变量名称括号在花括号里(${variable}),然后再增加额外的语法以告诉shell该做些什么。当你需要在变量名称之后马上跟一个可能会解释为名称的一部分的字符时,就会用到花括号了:


reminder="Time to go to the dentist!" 将值存储在reminder中

sleep 120 等待两分钟

echo _${reminder}_ 加上下划线符号强调现实的信息


警告:

默认情况下,未定义的变量会展开为null(空的)字符串。程序随便乱写,就可能会导致灾难发生:

rm -rf /$MYPROGRAM 如果未设置MTPROGRAM,就会导致大灾难!


所以写程序一定要很小心!


6、算数运算

i++与++i

# i=5

# echo $((i++)) $i

5 6

# echo $((++i)) $i

7 7


怎么会出现结果不同的情况呢?都是i的值加1,但是运算符返回的值会根据它与变量的相对位置而定。后缀式(postfix)的运算符(运算符出现在变量之后),在结果产生后,将旧值返回给变量,再执行变量加1的操作。相对的,前缀式(prefix)中,运算数则是放在变量的前面,先将变量加1,再返回新值给变量,--的工作方式和++类似,只不过它的操作是将变量减1。



7、退出状态

每一台命令退出都会返回一个小的整数值给引用它的程序,这就是大家熟知的退出状态(exit statu)。


7.1、退出状态值

退出状态为0表示“成功”,其他任何的退出状态都为失败。


内置变量?(以$?访问它)包括了Shell最近一次所执行的一个程序的退出状态。


7.2、POSIX的结束状态

意义

0 命令成功的退出

>0 在重定向或单词展开期间(~、变量、命令、算数展开,以及单词切割)失败

1-125 命令不成功的退出。特定的退出值得含义,是由各个单独的命令定义的。

126 命令找不到了,但文件无法执行。

127 命令找不到 

>128 命令因受到信号而死亡


猜你喜欢

转载自blog.51cto.com/xiaoxiaozhou/2128872