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

SHELL学习笔记

2014-05-11 11:29 267 查看
1 read 可以一次性读取多个变量 read first second

从文件读取 read message < /etc/motd

变量可以用命令替换 var=`....`或者$()

数组变量的访问$(var[0])

2 $0脚本名称 $1,2,..参数。$#参数个数,没有$10,被解释成$1和0,办法:用shift移为

while [ "$#" -ge '1' ]

do

echo $1

shift

done

3 $* $@ 泛指所有的参数 for var in $@;do;done

one "two three" four five区别,不在for elem in "$*"加引号,都正常输出,无视引号中的空格,,$*加引号,则one "two three" four five成为一个元素,横向输出,而"$@"能够识别每一个元素,而且识别"two three"当做一个元素不拆分

4 返回码 $? 始终返回上一条命令的返回码

#!/bin/bash

ls -R /temp &

sleep 10

strace -p $!

&表示ls命令运行如果小于10秒,则pid过期前半句提前返回,无法跟踪。大于10秒,后半句返回,ls还在运行,可以跟踪

5 测试命令test ,用[]表达 if [ ! -z "$name" ]; 表示如果$name非空

6 删除变量赋空 var= 或者 unset var

7 BASHOPTS SHELLOPTS有一些参数

8 trap命令用于指定在接收到信号后将要采取的行动trap命令的一种常见用途是在脚本程序被中断时完成清理工作

trap捕捉到信号之后,可以有三种反应方式:

  (1)执行一段程序来处理这一信号

  (2)接受信号的默认操作

  (3)忽视这一信号

  二. trap对上面三种方式提供了三种基本形式:

  第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双

  引号中的命令串。

  trap 'commands' signal-list

  trap "commands" signal-list

  为了恢复信号的默认操作,使用第二种形式的trap命令:

  trap signal-list

  第三种形式的trap命令允许忽视信号

  trap " " signal-list

HUP(1)

挂起,通常因终端掉线或用户退出而引发

INT(2)

中断,通常因按下Ctrl+C组合键而引发

QUIT(3)

退出,通常因按下Ctrl+组合键而引发

ABRT(6)

中止,通常因某些严重的执行错误而引发

ALRM(14)

报警,通常用来处理超时

TERM(15)

终止,通常在系统关机时发送

trap cleanup 1 2 3 15

cleanup()

{

echo "yeah,,,,yean"

exit 1

}

while :

do

echo "hello world"

sleep 1

done

9 BASH_COMMAND变量用于显示正在运行的程序的行,比如中断行

LINENO显示当前程序所在行数

FUNCNAME显示函数调用栈,层层向上找

FUNCNAME[0]表示func1,FUNCNAME[2]表示main函数,终止,FUNCNAME[3....都为空

同理 BASH_SOURCE[]层层往上找调用的文件的名称 main.sh中有 . lib1.sh表示引用这个sh,. 表示source命令

10 HOSTNAME主机名(就是/etc/host里面的),HOSTTYPE主机类型(i686,表示32位机),等同于uname -n 和 uname -m

11 PIPESTATUS每当echo$(PIPESTATUS[i])会覆盖[0],所以应当一次性判读用PIPESTATUS[*] grep

12 time ls用来计算命令的运行时间 TIMEFORMAT="%2lU %S %R" 设置日期输出格式,类似printf。2表示小数点的位数,小写的l表示拓展 到分钟

13 $$表示脚本自身的进程ID,$PPID表示调用SHELL的进程ID,也即是父进程ID

14 $RANDOM随机返回0~32767的数字

15 $REPLY 是在没有为read提供变量情况下的默认变量。既read回s车,输出字符串,没有变量,会默认保存到$REPLY中

16 $SECONDS计时,输出当前脚本的运行时间

17 $GLOBIGNORE忽略通配符的某些模式,例如 GLOBIGNORE=*.gif则ls 不在输出.gif结尾的图片的名字

18 $IFS设置分隔符,默认是空格,回车,可以改为冒号,有时很有用,比如冒号分割的密码

19 TMOUT=6 超时退出,防止管理员离开忘记exit root密码

20 通配符创建多文件 touch a{1,2,3}.txt

21 -O $filename测试文件是否属于当前用户,-G 用户组

22 stat -c %U file 获取文件所属用户 %G用户组

23 if [[ =~ ]]表示正则

for name in /home/danding/myscripts/*

do

nn=`basename $name`

if [[ $nn =~ ^a.* ]];then

echo $nn

else

echo "this is no .sh file"

fi

done

24 case的用法;;结尾

read -p "please input the number?" item

case $item in

1) echo "this is 1 num" ;;

2) echo "this is 2 num";;

*) echo "the other input";;

esac

1)可以用正则 a.*) ;;&多个条件匹配

25 for循环可以用((i<=10)) ((i+=1)) $i=$(($i+1)) let i=$i+1 $i=`expr $i+1`

ping -c1 -w1

26 ${1:-sdf}表明为第一个参数提供默认值,${var:-dfsf} var没有定义时,默认为dfsf

27 break 2 跳出两层循环

28 select item in 制作菜单很管用

29 x=hello y=2 echo $x+$y 自动把文本变为0 但是expr不会,报异常

30 ${#var} 变量长度,字符串长度

31 ${var:3:2}变量的裁剪,3表示起始位置,2表示长度,可以不写表示到结尾,也可以为负数,最后一个字符是-1,类推

32 正则,模式裁剪。

${variable#word} 从开头非贪婪模式匹配

${variable##word} 开头贪婪模式匹配

${variable%word} 从结尾非贪婪模式匹配

${variable%%word} 结尾非贪婪模式匹配

phone="555-456-1414"

${phone#*-} //456-1414

${phone##*-} //1414

${phone%-*} //555-456

${phone%%-*} //555

从头裁剪的意思是从头减掉不要;从尾裁剪的意思是从尾减掉不要

33 sed命令和选项:

a\ 在当前行后添加一行或多行

c\ 用新文本替换当前行中的文本

d 删除行

i\ 在当前行之前插入文本

h 把模式空间的内容复制到暂存缓冲区

H 把模式空间的内容添加到缓冲区

g 取出暂存缓冲区的内容,将其复制到模式缓冲区

G 取出暂存缓冲区的内容,将其追加到模式缓冲区

l 列出非打印字符

p 打印行

n 读入下一行输入,并从下一条而不是第一条命令对其处理

q 结束或退出sed

r 从文件中读取输入行

! 对所选行以外的行应用所有命令

s 用一个字符串替换另外一个字符串

替换标志:

g 在行内进行全局替换

p 打印行

w 将行写入文件

x 交换暂存缓冲区和模式空间的内容

y 将字符转换成另外一个字符

sed例子:

打印:p命令

sed ‘/abc/p’ file

打印file中包含abc的行。默认情况sed把所有行都打印到屏幕,如果某行匹配到模式,则把该行另外再打印一遍

sed -n ‘/abc/p’ file 和上面一样,只是去掉了sed的默认行为,只会打印匹配的行

删除:d命令

sed ‘3,$d’ file 删除从第3行到最后一行的内容。

sed ‘$d’ file 删除最后一行的内容

sed ‘/abc/d’ 删除包含abc的行。

sed ‘3d’ file 删除第三行的内容

替换:s命令

sed ‘s/abc/def/g’ file 把行内的所有abc替换成def,如果没有g,则只替换行内的第一个abc

sed -n ‘s/abc/def/p’ file 只打印发生替换的那些行

sed ‘s/abc/&def/’ file 在所有的abc后面添加def(&表示匹配的内容)

sed -n ‘s/abc/def/gp’ file 把所有的abc替换成def,并打印发生替换的那些行

sed ‘s#abc#def#g’ file 把所有的abc替换成def,跟在替换s后面的字符就是查找串和

替换串之间的分割字符,本例中试#

指定行的范围:逗号

sed -n ‘/abc/,/def/p’ file 打印模式abc到def的行

sed -n ‘5/,/def/p’ file 打印从第五行到包含def行之间的行。

sed /abd/,/def/s/aaa/bbb/g 修改从模式abc到模式def之间的行,把aaa替换成def

多重编辑-e

sed -e ‘1,3d’ -e ‘s/abc/def/g’ file 删除1-3行,然后把其余行的abc替换成def

读文件:r命令

sed ‘/abc/r newfile’ file 在包含abc的行后读入newfile的内容

写文件:w命令

sed ‘/abc/w newfile’ file 在包含abc的行写入newfile

追加:a命令

sed ‘/abc/a\def’ file 在包含abc的行后新起一行,写入def

插入:i命令

sed ‘/abc/i\def’ file 在包含abc的行前新起一行,写入def

修改:c命令

sed ‘/abc/c\def’ file 在包含abc的行替换成def,旧文本被覆盖

读取下一行:n命令

sed ‘/abc/{n ; s/aaa/bbb/g;}’ file 读取包含abc的行的下一行,替换aaa为bbb

转换:y命令

sed ‘y/abc/ABC’ file 将a替换成A,b替换成B,c替换成C(正则表达式元字符不起作用)

退出:q命令

sed ‘/abc/{ s/aaa/bbb/ ;q; }’ file 在某行包含了abc,把aaa替换成bbb,然后退出sed。

暂存和取用:h命令(把模式行存储到暂存缓冲区)和g(取出暂存缓冲区的行并覆盖模式缓冲区)G(取出临时缓冲区的行)命令

h和g是复制行为(覆盖),H和G表示追加。

sed -e ‘/abc/h’ -e ‘$G’ file 包含abc的行通过h命令保存到暂存缓冲区,在第二条命令汇中,sed读到最后一行$时,G命令从暂存缓冲区中读取一行,追加到模式缓冲区的后面。即所有包含abc的行的最后一行被复制到文件末尾。

sed -e ‘/abc/{h; d;}’

-e ‘/def/{g; }’ file 包含abc的行会移到包含def的行上,并进行覆盖。

暂存和互换:h和x命令

sed -e ‘/abc/h’

-e ‘/def/x’ file 包含abc的行会被换成def的行。

34 shell自带的字符串替换

${var/abc/def}会把第一abc替换成def,若要全局匹配用// ${var//abc/def} #表示开头,%表示末尾 ${var/#abc/def} 把开头是abc的换成def ${var/%abc/def} 把结尾......脱字符号^用于修改变量的大小写

模式删除: 第二个不写 ${var/abc}就是删除第一个abc

35 大小写转换,要是转化为大写,用 ${var^^} ,要是转化为小写${var,,}

36 ${var:-word}提供默认值${var?word}也是,${var+word}表示var有值,输出word,否则都为空

37 简介操作:

变量的变量执行;一个变量的是PATH,想返回PATH变量的内容,

myvar=PATH

echo ${!myvar}

返回/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/danding/bin

不能直接${!PATH}要的是一个间接变量 ,PATH是一个直接变量

38 可以使用source引用其他文件中的变量 . /etc/sysconfig/network 使用网关,ip地址啥的

39 函数

myfunc()

{}

可加可不加function myfunc(){} 都行 ,函数调用 myfunc $var

40 bc 浮点数运算

[root@lancy bin]# echo "2.5*3.4" |bc

8.5

[root@lancy bin]# echo "5/3; 5/3.1" |bc

1

1

[root@lancy bin]# echo "scale=2; 5/3" |bc

1.66

[root@lancy bin]# echo "ibase=10;obase=2; 4*6"|bc

11000

[root@lancy bin]# echo "ibase=2; 110*101; obase=10" |bc

30

[root@lancy bin]# echo "ibase=2; 11110; obase=2" |bc

30

41 整个函数的重定向 myfunc > log.txt ;tee 命令可以同时重定向到stdout和文件

myfunc $var | tee log.txt

42 mktemp产生临时文件的命令 temp=`mktemp`

43 #!/bin/bash

if [ $# -lt 1 ]

then

echo "there is no option";

else

while getopts ":Iti:s:v" opt;

do

case $opt in

I)echo "option is I "

;;

t)echo "option is t "

;;

i)ii=$OPTARG;echo "option is i,the value is $ii";

;;

s)ss=$OPTARG;echo "option is s ,the value is $ss";

;;

v)echo "option is v \n";

;;

:)

echo ">>> Error: '-$OPTARG' requires an argument"

;;

?)paralist=-1;

echo ">>> Error: '-$OPTARG' not supported,please input valid argument [Itisv]"

;;

esac

done

fi

下面给出几个执行的例子:

(1)sh datediff.sh -i 1 -I -v

option is i,the value is 1

option is I

option is v \n

(2)sh datediff.sh -s -i 1

option is s, the value is -i //取s选项后的值

(3)sh datediff.sh -s //选项中有前置冒号

>>> Error: '-s' requires an argument

sh datediff.sh -s //去除选项中的前置冒号后的输出

datediff.sh: option requires an argument -- s

44 数组赋值 arrar[0]=adf

一次性赋值 arr=(ad d f erw lj)

命令赋值 stat=($(cat /proc/stat)) 或者stat=(`cat /proc/stat`)

可用IFS设置换行符,一行一行读

oldIFS=$IFS

IFS="

"

hosts=(`cat /etc/hosts`)

for hostline in ${hosts[@]}

do

echo line: $hostline

done

IFS=$oldIFS

还可以是通配符 arr=(*.mp3)

从流读取 read -a 能把输入流读入到数组

read -a 和IFS联合使用,效果更佳,比如读取/etc/passwd是冒号分割的

IFS和read放在同一行,只对read起作用,更安全

while IFS=: read -a userdetails

do

done

45 readarray 能更好的处理数组 readarray -n 4 -s 2 food

-n 指定读取的最大行数 -s 从输入的开头跳过几行,-O 指定初始索引值 -t 去掉换行符

数组的访问 ${arr[0]}

数组的长度 ${#array[@]}

数组的截取 ${array[@]:2:3}

关联数组

用declare -A array 声明

array=([singer]="john") 反向引用 ${!array[john]}

数组的复制 hobbies=(${activities[@]})

追加hobbies=(${activities[@]} diving)也可以用+=

46 $$指的是当前进程id ls -l /proc/$$/fd

有四个文件 0 1 2 255 0表示stdin 1表示stdout 2stderr

exec 3> /temp/testing 创建文件描述符3

就可以echo " sdfsdf" >&3 多次运行只是追加不能清空,清空用>/temp/testing

47 命令后面加上&符号,表示此命令后台运行,可用$!返回后台进程ID ps -fp $!

48 ps -fp $! 查看后台进程 ,事前可以跑一个sleep 100

49 jobs -l 显示后台进程 fg %2 把作业2提到前台 bg %2 把作业2放到后台 kill -9 % 关闭任何作业号 wait 等待作业完成

50 stat 文件状态 stat -c %s file

51 cat -n file指定行

52 join 命令 归并两个有序文件 研究下paste 也是合并

53 tr 流替换

54 uniq 独立的

55 factor 因子分解

56 id user 查看id groups user
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: