SHELL学习笔记

SHELL学习笔记1read可以一次性读取多个变量readfirstsecond从文件读取 readmessage变量可以用命令替换var=`….`或者$()数组变量的访问$(var[0])2$0脚本名称$1,2,..参数。$#参数个数,没有$10,被解释成$1和0,办法:用shift移为while[“$#”-ge ‘1’]doecho$1shi

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今天的文章SHELL学习笔记分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6147.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注