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的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 片段

vue2.0 代码功能片段

nodejs常用代码片段

sh shell片段

常用python日期日志获取内容循环的代码片段

Eclipse 中的通用代码片段或模板