SHELL学习笔记

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值