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