Shell
Posted kris12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell相关的知识,希望对你有一定的参考价值。
常用判断条件 (1)两个整数之间比较 = 字符串比较 -lt 小于(less than) -le 小于等于(less equal) -eq 等于(equal) -gt 大于(greater than) -ge 大于等于(greater equal) -ne 不等于(Not equal) (2)按照文件权限进行判断 -r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute) (3)按照文件类型进行判断 -f 文件存在并且是一个常规的文件(file) -e 文件存在(existence) -d 文件存在并是一个目录(directory) [[email protected] datas]$ [ -x /home/kris/datas/for.sh ] [[email protected] datas]$ echo $? 1 [[email protected] datas]$ [ -r /home/kris/datas/for.sh ] [[email protected] datas]$ echo $? 0
运算式和表达式,注意区别
[[email protected] datas]$ [ $[4%2] = 0 ] && echo yes || echo no yes 表达式 [[email protected] datas]$ vi for.sh #!/bin/bash for ((i=0;i<10;i++)) do if [ $[$i%2] -eq 0 ] then echo $i fi done 或者这样写: for ((i=0;i<10;i++)) do if [ $(($i%2)) = 0 ]; then echo $i fi done [[email protected] datas]$ sh for.sh 0 2 4 6 8 #!/bin/bash for((i=0;i<10;i++)) do if [ $(($i%2)) = 0 ]; then echo $i elif [ $(($i%3)) = 0 ]; then echo $i else echo "我是奇数" fi done
case
#!/bin/bash case $1 in "1") echo "Monday" ;; "2") echo "Tuesday" ;; "3") echo "Wednesday" ;; "4") echo "Thursday" ;; "5") echo "Friday" ;; *) echo "Weekend" ;; esac [[email protected] datas]$ ./case.sh 3 Wednesday
read读取控制台输入
-p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 参数 变量:指定读取值的变量名 #/bin/bash read -p "Please input a num in 5 seconds:" a echo $a
函数function
bash 可以进入子shell,exit是退出来, source a.sh是在当前shell执行 ./a.sh是在子shell中执行的 export 使得当前shell和子shell中定义的变量都起作用
系统函数
basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。 suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。 [[email protected] datas]$ basename /home/kris/datas/while.sh while.sh [[email protected] datas]$ basename /home/kris/datas/while.sh .sh while dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)) [[email protected] datas]$ dirname /home/kris/datas/while.sh /home/kris/datas
自定义函数
必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255) #/bin/bash function sum() { s=$(($1+$2)) echo $s } sum $1 $2 ~ ~ [[email protected] datas]$ [[email protected] datas]$ sh function.sh 1 3 4
cut
-f -d -c
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
[[email protected] datas]# ifconfig | grep Bcast
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
[[email protected] datas]# ifconfig | grep Bcast | cut -c 11-14
inet
[[email protected] ~]# ifconfig | grep Bcast | cut -d : -f 2
192.168.1.100 Bcast
[[email protected] ~]# ifconfig | grep Bcast | cut -d : -f 2 | cut -d : -f 1
192.168.1.100 Bcast
[[email protected] ~]# ifconfig | grep Bcast | cut -d : -f 2 | cut -d " " -f 1
192.168.1.100
[[email protected] datas]# ifconfig | grep Bcast > temp.log
[[email protected] datas]# cat temp.log
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
[[email protected] datas]# cut -d : -f 2 temp.log
192.168.1.100 Bcast
[[email protected] datas]# cat temp.log | cut -d : -f 2 #####与上边是的等效的
192.168.1.100 Bcast
[[email protected] datas]# ifconfig | grep Bcast | cut -d : -f 2 | cut -d " " -f 3
Bcast
sed
sed按行处理; -e -i a d s
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
ifconfig | sed ‘1d‘ 删除第一行
ifconfig | sed ‘1,5d‘ 删除掉前5行
ifconfig | sed ‘1akris‘ 在第一行后面追加kris
ifconfig | sed ‘s/Link/XXX/‘ 查找并替换;注意是区分大小写的,最后的/符号不要忘记了;
ifconfig | sed ‘s/Link/XXX/‘ temp.log #并不会改变文件内容
ifconfig | sed -i ‘s/Link/XXX/‘ temp.log 加上-i就可以在文件中修改成功了;
ifconfig | sed ‘/^ *R/aXXX‘ 前边有若干个空格,以R开头的
[[email protected] datas]# ifconfig | sed -e ‘/^ *R/aXXX‘ -e‘/^ *T/d‘
以R开头的追加XXX,把以T开头的删掉;这是两个式子就不能通过一个式子搞定了,需加-e改变修改方式,只有一个时可以省略;
awk
按行处理,可以对行内的数据进行更细微的操作;
cp /etc/passwd ./
[[email protected] datas]# cat passwd | awk ‘/^a/{print}‘ 把以a开头的打印出来 [[email protected] datas]# cat passwd | awk ‘/^a/{print}‘ adm:x:3:4:adm:/var/adm:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin [[email protected] datas]# cat passwd | awk -F : ‘/^a/{print $1}‘ adm avahi-autoipd abrt apache [[email protected] datas]# cat passwd | awk -F: ‘/^a/{print $1} /^adm/{print}‘ 如果匹配到了以a开头就把print $1打印出来; 如果又匹配到了adm就把print整行打印出;
#如果不写模板它就把所有行都打印出
[[email protected] datas]# cat passwd | awk -F : ‘{print $1}‘ [[email protected] datas]# cat passwd | awk -F: ‘BEGIN{print "begin"} {print$1} END{print "end"}‘ #begin在数据输入之前先执行BEGIN这个块里边的;END是所有数据处理完了再执行这个块里边的东西; [[email protected] datas]# cat passwd | awk -F: ‘BEGIN{sum=0;print "Sum="sum} {sum+=$3} END{print "Sum="sum}‘ #把第3列的数值加到sum上,对文件的第3列做累加; Sum=0 Sum=3222 [[email protected] datas]# cat passwd | awk -F: ‘BEGIN{sum=0;print "Sum="sum} {sum+=$3; print $3"Sum="sum} END{print "Sum="sum}‘ [[email protected] datas]# which awk /bin/awk [[email protected] datas]# ll /bin/awk lrwxrwxrwx. 1 root root 4 9月 3 2013 /bin/awk -> gawk [[email protected] datas]# cat passwd | awk -F: -v sum=0 ‘BEGIN{print "Sum="sum} {sum+=$3; print $3"Sum="sum} END{print "Sum="sum}‘ #-v就是引入一个变量 awk的内置变量 [[email protected] datas]# cat temp | awk ‘BEGIN{sum=0}{sum+=1}/^$/{print sum}‘ #打印出文件的所有空行的行号,下面这种方法更简单; [[email protected] datas]# cat temp | awk ‘/^$/{print NR}‘ #NR就起到sum的作用; 2 3 5 7 8 10 11 12 [[email protected] datas]# awk ‘/^$/{print FILENAME}‘ temp temp temp temp [[email protected] datas]# awk -F : ‘{print NF}‘ passwd 7 7 7 [[email protected] datas]# awk -F: ‘{print "filename:" FILENAME ", linenumber:" NR ",columns:"NF}‘ passwd filename:passwd, linenumber:1,columns:7 filename:passwd, linenumber:2,columns:7 filename:passwd, linenumber:3,columns:7 [[email protected] datas]# ifconfig eth0 | grep "inet addr" | awk -F: ‘{print $2}‘ 192.168.1.100 Bcast [[email protected] datas]# ifconfig eth0 | grep "inet addr" | awk -F: ‘{print $2}‘ | awk -F " " ‘{print $1}‘ 192.168.1.100
sort
-n(依照数值的大小排序) -r (以相反的顺序来排序) -t (设置排序时所用的分隔字符) -k(指定需要排序的列)
[[email protected] datas]# cat passwd | grep ^a | sort -t : -k 3 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin [[email protected] datas]# cat passwd | grep ^a | sort -t : -k 3 -n adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin [[email protected] datas]# cat passwd | grep ^a | sort -t : -k 3 -nr abrt:x:173:173::/etc/abrt:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin [[email protected] datas]# sort -t : -nrk 3 sort.sh bb:40:5.4 bd:20:4.2 cls:10:3.5 xz:50:2.3 ss:30:1.6
以上是关于Shell的主要内容,如果未能解决你的问题,请参考以下文章