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

Shell脚本学习指南

2011-07-29 18:22 597 查看
http://blog.csdn.net/greatsnows/article/details/5364639

第一张 背景知识

一次做好一件事情
多使用文本
使用正则表达式
使用管道
不打印消息,除了错误
处理前后,文件格式一致
利用shell命令

第二章 入门

脚本中的引用命令使用绝对路径
每一个空格都影响结果
#!/bin/sh -可以避免某种程序的欺骗攻击(?)
";"分号,可以分隔同一行里的多条命令
"&"代表后台运行,并且其后的命令不用等待它完成。
父Shell将等待子Shell的所有相关程序完成后,才继续执行自我
变量赋值的时候"="两端没有空格,引用的时候在变量前面加上"$",当赋值里有空格的时候请加上引号
echo -n 会忽略结尾的换行符,但是echo版本上存在差异不建议过多使用。
printf "Hello $s!/n" World
ctrl+D,也就是符号^D,代表文件结尾
< 改变标准输入,只限于两个程序之间
> 改变标准输出,只限于两个程序之间
>> 追加到文件
pro1 | pro2 将pro1的标准输出重定位到pro2的标准输入。管道符可以多个程序相连
tr是极其简化的sed,他所能完成的任务sed都能,反之则不行。
printf "Enter password:"

stty -echo #关闭回显

read pass printf "Enter password again:"

read pass stty echo #打开回显
$PATH里加入.可以包含当前目录。会引起安全问题-_-!! 不如不说
$1代表第一个参数,大于9就要用括号,比如$(10)

cat > finduser

#!/bin/sh

who | grep $1

^D

使用方法:finduser aaron
Shell将忽略#开头的一行,注释。
Shell脚本里set +x会打开执行跟踪,set -x关闭跟踪。
Shell里特殊字符称作元字符(metacharacter)

第三章 查找与替换

[]内的^表示取反
[0-9a-zA-F],范围表示不建议在新程序里运用。
a/{5/}表示重复5个a,q/{10,42/}表示10到42个q
正则表达式中^表示开头,$表示结尾,^$表示空行。另外grep -v 显示不匹配的结果
ab?c匹配ac或者abc
ab+c等同于abb*c,匹配abc,abbc...,但不匹配ac
sleep|wakeup|idle 匹配于sleep,wakeup,idle。注意 | 优先级最低。
[Tt]he (computer|PC) is 匹配与The或者the和is之间出现computer或PC的句子。
/<和/>用来匹配单词,可以分开使用。
grep是ed(商用unix上的vi)中g/re/p的缩写,意思是全局匹配并打印。ed也是sed的基础。
tr是极其简化的sed。tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
sed与空字符串,匹配最长的。。。。晦涩。。。 awk也是。意思就是会匹配满足条件的从左到右最长的一段
grep和sed的绝大部分工作是用来处理行(line)。awd,perl及Python处理字符串(string)
cut用来剪下数据,join用来连接数据,sort用来排列数据。(以Tab分隔的数据)
awk -F: '{print "User", $1, "is really", $5}' /etc/passwd

第四章 文本处理

sort(排序)属于UNIX前十名主要的命令,我却从来没用到过。
uniq删除排序后的重复行
wc计算字数,行数,字节数
head和tail显示文件头和尾

第五章 管道的神奇魔力

$$代表进程编号
trap用来捕捉信号,并执行命令。格式如:trap [-lp] [arg] [sigspec ...]

第六章 变量 判断 重复动作

export用于修改和打印环境变量,readonly使其不能修改。
env用来改变环境变量
unset用来删除当前Shell的变量和函数
未定义的变量会展开为NULL,随意操作将会引发异常。
${varname:-val}如果varname存在并不是null,将返回varname,否则返回val。

${varname:=val}如果varname存在并不是null,将返回varname,否则赋值为val并返回val。

${varname:?val}如果varname存在并不是null,将返回varname,否则显示varname:val。

${varname:+val}如果varname存在并不是null,将返回val,否则返回null。

如果去掉冒号,则表示存在,可以是null。
$#参数的总数,$*,$@。shift截掉$1,$2变成$1,类推。。。
通用的变量(前面加上$将引用变量)。#参数个数,
每一条命令,不管是内置的,Shell命令,还是外部的。当他退出时,都会返回一个小的整数给调用它的函数。"0"表示成功。
exit从Shell脚本返回一个退出状态给调用者
&&逻辑与,if ... then ...。||逻辑或,ifnot ... then ...。
test测试,string非null字符串,-b块文件,-c字符文件,-d文件夹,-f一般文件,-x可执行文件,
对于test来说,if [ -f "$file"],方括号里的参数必须有引号。
test只能做整数测试,不能针对浮点
test "x$a" = "x$b",x表示不扩展
getopts简化参数处理,支持类似 -xvf 这样写在一起的参数。
函数里return的作用类似于exit。

第七章 输入输出 文件与命令执行

read,将信息读入一个或者多个Shell变量。
while read ...

do

...

done < file
set -C 当>重定向遇到目标文件存在时,会失败

program << delimiter 之后跟输入的正文+delimiter。

<> 打开一个文件作为输入和输出
2>&1必须连在一起
exec 以新的程序代替shell,或者改变shell的I/O。将不会回到脚本里,除非调用失败。
printf...
~当前用户的根目录,~name,name用户的根目录。可移植性不好
?通配一个字符,*通配多个字符,[abc]通配a,b,c [!abc]除了a,b,c
$()包括几个命令的时候,代表一个整体,术语是命令替换。
expr用于运算
反斜杠--转义

单引号--保留表面上的意思

双引号--会做变量转换之类的
eval告知Shell取出eval的参数,并执行他(们)。
shell内部的解释过程比较晦涩,定义变量尽量简单。
subshell--()括号内的命令集将单独开一个进程去执行。
command可以访问内建命令
set,头大了

第八章 产生脚本

basename 从完整路径中取出文件名。再加一个参数就是要从文件名结尾去掉的字符串。

第九章 awk

awk

第十章 文件处理

ls
od可以查看无法显示出来的字符。
touch
mktmp /tmp/myprog.xxxxxxxxxxxxx建立一个随机的文件名。
/dev/random和/dev/urandom都产生随机数,urandom比较快但是不够随机(基本够用)。这两个可以替代mktmp的功能。
type很好用的命令
find
find sth. -type f | xargs grep sth1. /dev/null,xargs只是在stdout上去的参数列表,一行一个。
使用diff的惯例是把旧文件放在第一个参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: