shell2

Posted 森森2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell2相关的知识,希望对你有一定的参考价值。

对于简单的需求,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]#

 

Is前面没有路径,需要加上,于是用vim 2.sh然后按esc后输入::%s /var/1/g,就可以把var变成1

 

# !/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

~                                                        

~              

 

:%s /var/1/g

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

/etc

/etc is direcotry

[root@u test]#

 

放到/usr/bin,就可以在任何一个文件夹运行2.sh

[root@u test]# cp 2.sh /usr/bin/

[root@u test]# cd

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

/etc

/etc is direcotry

[root@u ~]#

如果放到profile中,就是永久保存

 

如果把脚本写到终端上,就要用分号

 

[root@u ~]# x=1

[root@u ~]# if [ $x -eq 1 ];then echo \'x is 1\';fi

x is 1

[root@u ~]#

 

 

[root@u test]# cat 5.sh

#test.sh

echo $0

echo $1

echo $2

echo $3

echo ${11}

echo \'$$\' $$

echo \'$*\' $*

echo \'$@\' $@

echo \'$#\' $#

echo \'$?\' $?

[root@u test]#

 

[root@u test]# ./5.sh 1 2 3 4 5 6 7 8 9 10 11

./5.sh     ($0就是./5.sh)

1

2

3

11

$$ 2236   (进程号,kill -9 2236就会杀掉,如果要睡眠10000秒,就sleep 10000)

$* 1 2 3 4 5 6 7 8 9 10 11

$@ 1 2 3 4 5 6 7 8 9 10 11

$# 11    (多少个参数)

$? 0      ($# 11这个执行成功没有)

[root@u test]#

 

查看nginx的状态:

[root@u test]# systemctl status nginx

开启:systemctl start nginx

 

写一个脚本,看是否正在启动nginx,如果没,就开启

红色这行的干扰项,需要去掉,用grep -v \'grep\'

[root@u test]# ps aux | grep nginx

root        925  0.0  0.2 122808  2080 ?        Ss   12月11   0:00 nginx: master process /usr/sbin/ngin

nginx       927  0.0  0.3 125324  3524 ?        S    12月11   0:00 nginx: worker process

root       2587  0.0  0.0 112676   980 pts/0    R+   00:00   0:00 grep --color=auto nginx

[root@u test]# ps aux | grep nginx | grep -v \'grep\'

root        925  0.0  0.2 122808  2080 ?        Ss   12月11   0:00 nginx: master process /usr/sbin/nginx

nginx       927  0.0  0.3 125324  3524 ?        S    12月11   0:00 nginx: worker process

[root@u test]#

 

 

 

[root@u test]# vim ningx_check.sh (名字不能带nginx,否则脚本的语句判断出错)

[root@u test]# cat ningx_check.sh

#!/bin/bash

ps aux | grep nginx | grep -v \'grep\'

if [ $? -ne 0 ]

then

    systemctl start nginx

fi

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

[root@u test]# systemctl stop nginx

[root@u test]# systemctl status nginx

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

[root@u test]# systemctl status nginx

 

[root@u ~]# var=10

[root@u ~]# awk -v x=$var \'{print x}\' b.txt

10

10

10

10

10

10

10

10

10

10

[root@u ~]#

 

以上是关于shell2的主要内容,如果未能解决你的问题,请参考以下文章