shell简明教程

来源:互联网 发布:怎么找淘宝上的大v 编辑:程序博客网 时间:2024/05/16 12:36
基本语法
注释
sh->bash
shell 脚本第一行#!/bin/sh, 之后对文件运行chmod +x filename,可直接执行脚本
#表注释

变量
赋值:name=value 注意等号两边不能有空格
取值:$name,当可能有名字冲突时,使用${value}取值
预设变量:
$0 当前程序的执行名字
$n 当前程序的第n个参数,n=1..9
$* 当前程序的所有参数
$# 当前程序的参数个数
$$ 当前程序的PID
$! 上一个执行的命令的PID
$? 上一个执行的命令的返回值

父进程导出变量,使子进程能使用:export name 或 export name=value

命令
命令是所有所有linux shell 命令和函数
 
命令执行:
``,运行一个命令,并把输出做为返回,eg.  A=`echo "this is valueA"`
cmd &: 将cmd做为后台运行
cmd > filename: 将cmd的输出覆盖到文件filename
cmd >> filename: 将cmd的输出追加到文件filename
cmd >> filename &2>1: 将cmd的标准输出和标准错误追加到文件filename

cmd1;cmd2: 串行执行,cmd1执行完后执行cmd2
cmd1|cmd2: 并行执行,cmd1的输出做为cmd2的输入
cmd1&&cmd2: cmd1执行成功后才能执行cmd2
cmd1||cmd2: cmd1执行失败才能执行cmd2

数值运算
bash只提供了整数运算,指令let, expr, (())
eg. let "x=$x + 1" 或 x=`expr $x + 1`, x=`expr 2 '<' 3` 或 x=$((2 + 2))
注意:如果在expr 表达式中运算符有歧义,将运算符加上引号

表达式中支持的操作符:
+  -   *  /  %  (加,减,乘,除,取模 )
>> <<  &  ^  |  (右移,左移,位与,位异或,位或)
?  :            (三元运算符.与C语言中的定义一致)
~               (取补码)
! >= <= > < == != && || (逻辑操作)
= += -= *= /= %= <<= >>= &= ^= |=  (二元赋值操作)

流程控制
注意:[]里前后都有空格

if [ expression ]; then
     ...
elif [ expression ]; then
     ...
else
     ...
fi
eg. 判断文件是否可读
if [ -r a.txt ]; then
     echo "file is readable"
fi

case $var in
cond1)
     ...;;
cond2)
     ...;;
*)
     ...;;
esac
eg.
name="hitzheng"
case $name in
"tom")
     echo "name is tom";;
"hitzheng")
     echo "name is hitzheng";;
*)
     echo "unknown name";;
esac

for var in list; do
     ...
done
eg.
list="A B C D E"
for var in $list; do 
     echo $var
done

一种特殊用法
for (( i=0; i < 10; i++)); do
     echo $i
done
(( ))内可以进行普通的数值运算

while [ expression ]; do
     ...
done
eg.
i=0
while (($i < 10)); do
     echo $i
done

var1=0
while [ $var1 -le 10 ]; do
     #var1=$(($var1+1))  #var1=$((var1+=1))
     ((var1+=1))
     echo $var1
done

until [ expression ]; do
     ...
done

break/continue

expression:
! 取反
-n str     字符串 str 是否不为空
 -z str     字符串 str 是否为空
str1  = str2     str1是否与 str2 相同
str1 != str2     str1是否与 str2 不同

int1 -eq int2     等于
int1 -le  int2     小于等于
int1 -ge int2     大于等于
int1 -lt   int2     小于
int1 -gt  int2     大于
int1 -ne int2     不等于

-b     是否块文件
-c     是否字符文件
-d     是否一个目录
-e     文件是否存在
-f     是否普通文件
-g     是否设置了文件的 SGID 位
-G     文件归本组所有
-h     是否符号连接与-L相同
-k     文件是否设置了的粘贴位
-O     是否为本用户所有
-p     文件是否为一个命名管道
-r     文件是否可读
-s     文件的长度是否不为零
-S     是否为套接字文件
-t fd     fd 是否在一个终端打开
-u     是否设置了文件的 SUID 位
-w     文件是否可写
-x     文件是否可执行

expr1 -a expr2     如果 expr1 和 expr2 为真,则为真
expr1 -o expr2     如果 expr1 或 expr2 为真,则为真

file1 -ef file2     file1和file2有同样的inode号
file1 -nt file2     file1比file2新
file1 -ot file2     file1比file2老

参考:man test

函数

定义
[function] func_name()
{
     #shell commands
}

调用
func_name $param_list

eg.
add()
{
     rst=$(($2 + $1))
     echo $rst
     return $rst
}

a=`add 100 200`
或 a=$?

参数与返回值
向函数传递的参数通过$1, $2, $3,..., $9来引用,$*为参数列表
返回值:
1. 通过return返回,调用函数之后用$?来获取返回值
2. 通过echo出来,调用函数用``来获取返回值

引用脚本文件
脚本中可以引用其它脚本文件中定义的变量和函数,方法:
. filename 或 source filename, 注意空格
. 和 source的意思是在当前进程环境下执行指定脚本,则指定脚本中定义的变量和函数会在当前脚本中有效

正则表达式
+     一个或多个前一个指定的字符
?     0个或一个前一个指定的字符
*     0个或多个前一个指定的字符
.     任意一个字符
|     或;前后两个字符串中的任意一个
r{m}     m个r
r{m,}     至少m个r
r{m,n}     m到n个r,含m,n
[abcde]     abcde中任意一个字符
[^abcde]     非abcde中任意一个字符
^abc     以abc开头
abc$     以abc结尾

常用命令
find
语法:find path -options [-print -exec -ok...]

path:查找的路径名
-print:将匹配的文件输出,默认动作
-exec:对匹配的文件执行command,格式为:'commond' {} \;,注意空格,eg. find . -group root -exec ls -l {} \;
-ok:同上,只不过每个命令都会给出提示

options:
-name <匹配模式>:指定查询文件名
-iname: 同上,不分大小写
-perm <权限数字>: 按文件权限来查找,eg. 755
-user <username>: 按文件所有者查找
-group <groupname>: 按文件所有组查找
-mtime <-|+n>:按修改时间查找,-n表修改时间在n天以内,+n表在n天以外
-atime:同上
-cmin:同上,单位分钟
-amin:同上,单位分钟
-nogroup:查找无有效组文件
-nouser:查找无有效用户的文件
-newer <filename>:查找比filename新的文件
-type <类型>:按文件类型查找;b 块文件;d 目录;c 字符文件;p 管道;l 符号连接;f 普通文件;
-size <n>[c]:按文件大小查找,带c表以字节为单位,否则以块为单位
-depth:首先在当前目录下查找,然后在子目录查找
-fstype <文件系统类型>:在指定的文件系统类型中查找,类型配置在/etc/fstab中
-follow:跟踪符号连接

例子:
find /var/logs -type f -mtime +7 -ok rm {} \; 查询7天以前的文件,并询问删除之
find /tmp -name '*.h' 查询/tmp中所有的.h文件
find . -type d 查找当前目录下的子目录
find . -size 1024c 查找当前目录下大小为1024bytes的文件
find . -user hitzheng 查找当前目录下所有者是hitzheng的文件
find . -mtime -2 查找最近两天内有修改的文件
find . -newer a.h 查找比a.h新的文件

sed
在线编辑器,一次处理一行。处理时,把当前行存入临时缓冲区(pattern space模式空间),然后用sed命令处理,然后输出到标准输出,再处理下一行

语法:sed [options] 'command' [files] 或 sed [options] -f scriptfile [files]
参考:man sed
options:
-e, --expression=脚本 添加脚本到运行列表
-f, --file=脚本文件 添加脚本文件到运行列表
-n,--quiet,--silent 不自动打印当前行

commond:
定址:用来标明所希望编辑的行,用数字表示,1表示第一行,$表示后一行
     a. 零定址 没有定址,对所有行有效
     b. 1定址 只有一个数字定址一行,只编辑某一行
     c. 范围定址 标明一个范围,两个数字,用逗号分隔,表明编辑的起止范围

a\<text> 在当前行后追加一行<text>
b <lable> 分支,到<lable>标记的地方,如果不存在到脚本末尾
c\<text> 用<text>改变本行的文本
d 删除行
D 删除模式空间的第一行
i\<text> 在当前行前抛入一行<text>
h H 拷贝/追加模式空间的内容到缓冲区
g G 拷贝/追加缓冲区的内容到模式空间
l 列出当前行不能打印的字符清单
n N 读取/追加下一行到模式空间,用下一个命令处理
p 打印模式空间的行
P 打印模式空间的第一行
q 退出sed
r <file> 读取<file>内容,追加到当前行后面
R <file> 每次读取<file>一行,追加到当前行后面
w <file> 追加模式空间的内容到<file>末尾
W <file> 追加模式空间的第一行到<file>末尾
x 交换缓冲区和模式空间的内容
y/<source>/<dest>/ 把<source>内容转换成<dest>,<source>不能使用正则表达式
s/<regex>/<replacement>/ 用<replacement>替换<regex>, <regex>是正则式
! 表示后面的命令对未选定的行起作用
= 打印当前行号
# 注释

正则表达式:以/.../标志一个正则表达式
\ 转义
^ 匹配行的开始, eg. /^sed/匹配以sed开头的行
$ 匹配行的结束
\< 单词开始
\> 单词结束
\b 单词的开始和结束
[] 单字符集合,[abcde]匹配abcde中的一个
[a-z0-9A-Z] 单字符集合,匹配一个范围内的一个字符
[^] 匹配不在这个范围内的一个字符
\w 一个字母、数字或下划线
& 保存匹配的内容,eg. s/love/***&***, love被替换成***love***
\(\) 分组,eg. s/\(love\)able/\1rs/,loverable被替换成lovers
\| 分支
r\{m\} 重复m次r
r\{m,\} 重复至少m次r
r\{m,n\} 生蚝m到n次r

\s 匹配一个空白字符
. 任意单字符
* 重复任意次
\+ 重复1次或多次
\? 重复0次或1次

例子:
sed '2d' a.h 删除a.h的第二行
sed '2,$d' a.h 删除a.h中第2行到最后一行
sed '/^\#/d' a.h 删除a.h中以#开始的行

sed 's/\bstruct\b/mystruct/' a.h 将a.h中的单词struct替换成mystruct
sed -n 's/\bstruct\b/mystruct/p' a.h  将a.h中的单词struct替换成mystruct, 并只打印发生替换的行
sed 's/^127.0.0.1/localhost:&/' b.h 将a.h中的127.0.0.1替换成localhost:127.0.0.1

sed -n '/test/,/check/p' a.h 打印a.h中包含test 和 check之间的行
sed -n '5,/^\s*You\b/p' a.h 打印第5行和第一个单词是You的行之间的所有行sed '/test/,/check/s/$/the end/' a.h 将包含test和check的两行之间的所有行末尾加上the end

sed '/^test/r b.h' a.h 在a.h中以test开头的行之后加上b.h的内容
sed '/^test/W b.h' a.h 同上,只不过每个匹配位置后顺序添加b.h中的一行

sed -n '/^test/w b.h' a.h 将a.h以test开头的行写入b.h
sed '/\bcheck\b/i\--->example' a.h 将a.h中包含单词check的行前插入一行--->example
sed '/\bcheck\b/a\--->example' a.h 将a.h中包含单词check的行后插入一行--->example
sed '/test/{n;s/a/bb/;}' a.h 如果a.h中test被匹配,则移动到下一行,把这一行的aa替换成bb

awk






grep
语法:grep [options] pattern [files]

options:
-c 只输出匹配行的计数
-I 不区分大小写
-n 显示匹配行及行号

pattren:
\ 转义
^ 匹配行的开始
$ 匹配行的结束
\< 单词开始
\> 单词结束
\b 单词的开始和结束
[] 单字符集合,[abcde]匹配abcde中的一个
[a-z0-9A-Z] 单字符集合,匹配一个范围内的一个字符
[^] 匹配不在这个范围内的一个字符
\w 一个字母、数字或下划线
\(\) 分组
\| 分支
r\{m\} 重复m次r
r\{m,\} 重复至少m次r
r\{m,n\} 生蚝m到n次r

\s 匹配一个空白字符
. 任意单字符
* 重复任意次
\+ 重复1次或多次
\? 重复0次或1次

例子:
ps -ef |grep 'ps' 简单查找,名为ps的进程
grep '^abc' file1 查找file1中以abc开头的行
grep 'abc$' file1 查找file1中以abc结尾的行
grep '\babc' file1 查找file1中以abc开头的单词
grep '\<abcd\>' file1 查找file1中abcd单词
grep '\b\(\w\+\)\b\s\+\1\b' file1 查找file1中如long long这样重复的组合
grep '\b0[xX][0-9]\{2,4\}\b' file1 查找file1中2-4位的十六进制数

date
显示、设置时间日期:date [选项]... [+格式]
选项:
-d, --date=datestr 显示由字符串描述的时间,eg. date -d "2 days ago", 另外,yesterday, tomorrow
-s, --set=datestr 设置时间,eg. 20120313 17:04:00

格式:
以+号开始,eg. date +"time now is %Y-%m-%d",输出格式见date --help

ps
显示进程状态
eg.
ps -ef 显示所有运行进程: UID        PID  PPID  C STIME TTY          TIME CMD
ps aux 所有进程:USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
RSS内存,VSZ虚拟内存
SATST进程状态
D 无法中断的休眠(IO)
R 运行中
T 停止或被追踪,静止状态
W 进入内存交换
X 死掉的进程
Z 僵尸进程

输出排序:--sort=[+|-]key1[,[+|-]key2]...,输出先按key1排,再按key2排,+升序(默认),-降序
ps aux --sort=-vsz:按使用虚拟内存降序排
ps aux --sort=-%cpu,-vsz:先按CPU降序排,再是虚拟内存

pstree
以树状显示进程

top
动态显示程序状态
-b 批处理模式(多用于自动化监控脚本)

c 显示/隐藏命令行
f键可以选择显示的列, 回车确定
o键可以选择列的显示顺序
FO键可以选择排序的列,R键可以将当前排序倒排

M 按内存排序
P 按CPU排序
T 按时间排序

sort
排序,eg. sort -nr 以数值大小倒序排列

uniq
去重,eg. uniq -c 去重,并在每行开始加上重复的次数

wc
计数,eg. wc -l 统计行数

diff
比较文件和目录的差异

patch
用diff产生的结果给某一文件打补丁

file
识别文件的类型

cpio
归档文件及从包中提取文件

ln
连接文件与目录,eg. ln -s aaa a.link,将a.link做为aaa的符号连接

locate
快速查找,locate 查找模式

mktemp
在/tmp下建立一个临时文件

mv
移动或更名文件,inode号不变

od
按不同进制输出文件:
-A:地址格式
o 八进制(默认)
d 十进制
x 十六进制
n 不打印地址

-t:内容的显示格式
c ASCII字符(\n)
d 有符号的十进制
f 浮点数
o 八进制(默认)
u 无符号十进制
x 十六进制

scp
远程文件复制:scp [options] [[user@]host1:]file1 ... [[user@]host2:]file2

rz/sz
终端上传下载命令

split
按行或字节数切割文件

tee
将输入的数据同时输出到标准输出和文件

touch
更新文件或目录的时间,没有则创建一个

umask
指定文件创建掩码:umask 0022, 创建文件时真正的权限是指定的权限减去umask指定所产生的权限

whereis
查找文件,文件应该是原始代码、二进制或帮助文件

which
在$PATH里查找文件

cat
显示文件内容

chmod
改变文件的权限模式

chown
改变文件的所有者

cksum
获取CRC校验值

cmp
列出两个文件第一个差异处的位置

cd
改变当前目录

rm/rmdir
删除目录或文件

df
显示硬盘信息,eg. df -sh 统计磁盘使用量

du
统计目录或文件的大小

pwd
显示当前目录

stat
显示文件状态

tree
以树状显示目录内容

sync
将缓冲写入磁盘

alias
设置指令别名

chroot
改变根目录

crontab
设置定时服务

depmod
分析可载入模块的依赖性

dmesg
显示开机信息

lsmod
显示系统已载入的模块

passwd
设置密码

adduser/deluser
添加/删除用户

rpm
rpm软件安装管理

ulimit
控制shell程序资源,ulimit -n 2048,程序最多可打开2048个文件

finger
查找并显示用户信息

free
显示内在状态

id
显示用户和组id

last
列出用户登陆记录

procinfo
显示系统状态

reboot
重新开机

su/sudo
变更用户

uname
显示系统信息

whoami
显示当前用户名称

who
显示当前登陆用户

原创粉丝点击