shell

对于简单的需求,shell比python好,语法简单

一 什么是shell script

将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.
  再加上些智能(条件/流控)控制,就变成了智能化脚本了.

 

系统变量

set和env的区别

set:显示所有变量
env:环境变量

[root@www ~]# xxxxxx=1

[root@www ~]# set |grep xxxx

xxxxxx=1

[root@www ~]#

 

要取消abd的赋值,就用unset,因为set保存了。

[root@www ~]# abd=value

[root@www ~]# echo $abd

value

[root@www ~]# unset abd

[root@www ~]# echo $abd

 

[root@www ~]#

 

常用系统变量 

PATH
PWD
LANG
HOME
HISTSIZE
PS1
IFS
域分隔符 是空格,换行,TAB键的合集

part6 全局变量与局部变量

[root@www ~]# HISTSIZE=2

[root@www ~]# history

  172  HISTSIZE=2

  173  history

[root@www ~]#

 

Profile上面就有HISTSIZE=1000

[root@www ~]# vim /etc/profile

HISTSIZE=1000

 

\u是用户名,\h是hostname, \W是所在目录

[root@www ~]# echo $PS1

[\u@\h \W]\$

[root@www ~]#

 

母函数和子函数,母函数能用到子函数上,但是子函数(局部变量)不会用到母函数上

[root@www ~]# export money=10000

[root@www ~]# echo $money

10000

[root@www ~]# bash

[root@www ~]# echo $money

10000

[root@www ~]# export mon=200

[root@www ~]# exit

exit

[root@www ~]# echo $mon

 

[root@www ~]#

 

取第3行第2个

[root@www ~]# free

              total        used        free      shared  buff/cache   available

Mem:         999696      261084      387380        7400      351232      555268

Swap:       2097148           0     2097148

[root@www ~]# free |awk 'NR==3{print $2}'

2097148

[root@www ~]#

 

运算符号:

[root@u ~]# ((2<10))

[root@u ~]# echo $?

0

[root@u ~]#

 

如果想用[],要查man test

       STRING1 != STRING2

              the strings are not equal

 

       INTEGER1 -eq INTEGER2

              INTEGER1 is equal to INTEGER2

-eq表示==

-lt表示小于

-gt 表示大于

-a表示&&

-o表示||

-ge表示大于等于

-le表示小于等于

-ne表示不等于

 

例子:

[root@u ~]# [ 2 -eq 10 ]

[root@u ~]# echo $?

1

[root@u ~]# [ 2 -eq 2 ]

[root@u ~]# echo $?

0

[root@u ~]#

 

2小于等于10

[root@u ~]# [ 2 -le 10 ]

[root@u ~]# echo $?

0

[root@u ~]#

 

赋值:

[root@u ~]# x=7

[root@u ~]# y=$x

[root@u ~]# echo $x

7

[root@u ~]# echo $y

7

[root@u ~]#

 

数学运算要在[]内

[root@u ~]# x=2

[root@u ~]# x=$[$x+1]

[root@u ~]# echo $x

3

[root@u ~]#

 

最好用下面的方法:直观

[root@u ~]# echo $x

4

[root@u ~]# ((x=x+1))

[root@u ~]# echo $x

5

[root@u ~]#

这样也行:

[root@u ~]# x=1

[root@u ~]# ((x+=1))

[root@u ~]# echo $x

2

[root@u ~]#

如果自增1的话,可以用++

[root@u ~]# i=0

[root@u ~]# ((i++))

[root@u ~]# echo $i

1

[root@u ~]#

自减1,--

 

[root@u ~]# x=1

[root@u ~]# echo $((x+=1))

2

[root@u ~]#

 

 

Shell的所有计算器

$[]

(())

expr

[root@u ~]# expr 1 + 2

3

[root@u ~]#

[root@u ~]# x=1

[root@u ~]# y=2

[root@u ~]# expr $x + $y

3

[root@u ~]#

[root@u ~]# a=`expr $x + $y`

[root@u ~]# echo $a

3

[root@u ~]#

 

上面都只取整数

[root@u ~]# expr 99 / 134

0

[root@u ~]#

 

要是除数结果有小数点,就要安装BC软件包

[root@u ~]# yum install bc -y

 

保留两位小数

[root@u ~]# echo 'scale=2;30/1000'|bc -l

.03

[root@u ~]#

 

找使用率

[root@u ~]# free

              total        used        free      shared  buff/cache   available

Mem:         999696      306920      214848        7384      477928      487236

Swap:       2097148           0     2097148

 

计算小数要用双引号

[root@u ~]# total=`free | awk 'NR==2{print $2}'`

[root@u ~]# echo $total

999696

[root@u ~]# use=`free | awk 'NR==2{print $3}'`

[root@u ~]# echo $use

307648

[root@u ~]# echo "scale=2;$use/$total"|bc -l

.30

[root@u ~]#

如果要输出百分比,就要取以.做分割cut -d.,取第2个,再加%

[root@u ~]# echo "scale=2;$use/$total"|bc -l|cut -d. -f2

30

[root@u ~]# b=`echo "scale=2;$use/$total"|bc -l|cut -d. -f2`

[root@u ~]# echo $b%

30%

[root@u ~]# echo ${b}%

30%

[root@u ~]#

 

part5-1、测试文件状态
-d 测试目录是否存在

[root@u ~]# test -d /etc

[root@u ~]# echo $?

0

[root@u ~]# [ -d /etc  ]

[root@u ~]# echo $?

0

[root@u ~]#

 

-e文件

[root@u ~]# [ -e /root/a.txt  ]

[root@u ~]# echo $?

0

[root@u ~]#


-s 文件长度 > 0、非空(文件存在且非空)

[root@u ~]# [ -s /etc/passwd  ]

[root@u ~]# echo $?

0


-f 正规文件(普通文件)
-w 可写

-r 可读

-x 可执行

[root@u ~]# [ -w /etc/passwd  ]

[root@u ~]# echo $?

0

[root@u ~]# [ -r /etc/passwd  ]

[root@u ~]# echo $?

0

[root@u ~]# [ -x /etc/passwd  ]

[root@u ~]# echo $?

1

[root@u ~]# ll -d /etc/passwd

-rw-r--r--. 1 root root 2225 11月 16 23:22 /etc/passwd

当前用户是否具有可读可写可执行权限

[root@u ~]#

 

-L 符号连接

-u 文件有 suid 位设置

 

-h连接文件

[root@u ~]# ln -s /root/abg.txt /tmp/

[root@u ~]# ll /tmp/abg.txt

lrwxrwxrwx 1 root root 13 12月  9 22:53 /tmp/abg.txt -> /root/abg.txt

[root@u ~]# [ -h /tmp/abg.txt  ]

[root@u ~]# echo $?

0

[root@u ~]#

 

 

 

part5-2、字符串测试
= 两个字符串相等
!= 两个字符串不相等
-z 空串
-n 非空串

 

[root@u ~]# x='hello'

[root@u ~]# y='hello'

[root@u ~]# [ -z $x ]

[root@u ~]# echo $?

1

[root@u ~]# [ -n $x ]

[root@u ~]# echo $?

0

[root@u ~]# [ $x = $y ]

[root@u ~]# echo $?

0

[root@u ~]# [ $x != $y ]

[root@u ~]# echo $?

1

[root@u ~]#

 

[root@MiWiFi-R3-srv ~]# var1='abc'
[root@MiWiFi-R3-srv ~]# var2='123'
[root@MiWiFi-R3-srv ~]# [ $var1 == $var2 ]
[root@MiWiFi-R3-srv ~]# echo $?
1

part5-3、测试数值
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

 

建一个脚本:写脚本判断文件是什么文件

[root@u ~]# mkdir /test

mkdir: 无法创建目录"/test": 文件已存在

[root@u ~]# cd /test

[root@u test]# ls

a.txt  b.txt  c.txt  d.txt  gaizhujiming.sh  root.txt  son

[root@u test]#

 

[root@u test]# vim 1.sh

[root@u test]# cat 1.sh

# !/bin/bash

var='/etc/passwd'

if [ -f $var  ]

    then

        echo "$var is regular file"

elif [ -b $var  ]

    then

        echo "$var is block"

elif [ -d $var  ]

    then

        echo "$var is direcotry"

elif [ -h $var  ]

    then

        echo "$var is symlink"

else

    echo "$var is unkown"

fi

[root@u test]#

 

[root@u test]# chmod +x 1.sh

[root@u test]# ./1.sh

/etc/passwd is regular file

[root@u test]#

 

修改var的赋值,得到:

[root@u test]# cat 1.sh

# !/bin/bash

var='/etc/passwd'

var='/dev/sda'

var='/etc'

var='sdf'

if [ -f $var  ]

    then

        echo "$var is regular file"

elif [ -b $var  ]

    then

        echo "$var is block"

elif [ -d $var  ]

    then

        echo "$var is direcotry"

elif [ -h $var  ]

    then

        echo "$var is symlink"

else

    echo "$var is unkown"

fi

[root@u test]#

 

 

[root@u test]# vim 1.sh

[root@u test]# ./1.sh

/dev/sda is block

[root@u test]# vim 1.sh

[root@u test]# ./1.sh

/etc is direcotry

[root@u test]# ./1.sh

sdf is unkown

[root@u test]#

 

把1.sh是全部信息和权限都复制到2.sh

[root@u test]# cp -a 1.sh 2.sh

[root@u test]#

 

如果想不打开文件,直接修改脚本就要:

[root@u test]# vim 1.sh

[root@u test]# cat 1.sh

# !/bin/bash

read -p 'please input your file paht:' var

if [ -f $var  ]

    then

        echo "$var is regular file"

elif [ -b $var  ]

    then

        echo "$var is block"

elif [ -d $var  ]

    then

        echo "$var is direcotry"

elif [ -h $var  ]

    then

        echo "$var is symlink"

else

    echo "$var is unkown"

fi

[root@u test]#

 

输入,就可以自动得到结果:

[root@u test]# ./1.sh

please input your file paht:/etc

/etc is direcotry

[root@u test]#

 

[root@u test]# ./1.sh

please input your file paht:/etc/passwd

/etc/passwd is regular file

[root@u test]#

如果不要./的话,就用整个目录,如:

[root@u test]# /test/1.sh

please input your file paht:/root

/root is direcotry

[root@u test]#

 

 

[root@u test]# vim 4.sh

脚本意思是取第1、2、3、4、5、10个数

[root@u test]# cat 4.sh

#!/bin/bash

 

echo $1

echo $2

echo $3

echo $4

echo $5

echo ${10}

[root@u test]#

[root@u test]# ./4.sh

-bash: ./4.sh: 权限不够

[root@u test]# chmod +x 4.sh

先执行看看:

[root@u test]# ./4.sh

 

 

 

 

 

 

[root@u test]#

[root@u test]# ./4.sh a b c e u y zz 1 2 3 4 5

a

b

c

e

u

3

[root@u test]#

 

如果想直接在./2.sh后面直接写var要输入的值,可以这样写:

[root@u test]# cat 2.sh

# !/bin/bash

echo $1

if [ -f $var  ]

    then

        echo "$var is regular file"

elif [ -b $var  ]

    then

        echo "$var is block"

elif [ -d $var  ]

    then

        echo "$var is direcotry"

elif [ -h $var  ]

    then

        echo "$var is symlink"

else

    echo "$var is unkown"

fi

[root@u test]#

 

[root@u test]# ./2.sh /etc

/etc

 is regular file

[root@u test]#

 

posted @ 2017-12-11 22:52  森森2017  阅读(115)  评论(0)    收藏  举报