第3章 shell语法讲解

3.1 shell运算讲解

3.1.1 运算符的讲解

3.1.2 shell运算方式的讲解

3.1.2.1 $(())运算

[root@m01 test_init] # a=1

[root@m01 test_init] # b=1

[root@m01 test_init] # echo $a+$b

1+1

[root@m01 test_init] # echo $((c=a+b))

2

3.1.2.2. let运算(只能计算整数)

[root@m01 ~] # a=1

[root@m01 ~] # b=1

[root@m01 ~] # echo $d

[root@m01 ~] # let d=a+b

[root@m01 ~] # echo $d

2

[root@m01 ~] # a=1.5

[root@m01 ~] # let d=a+b

-bash: let: 1.5: syntax error: invalid arithmetic operator (error token is ".5")

[root@m01 ~] #

3.1.2.3 expr计算(expr只能计算整数,并且中间需要有空格)

[root@m01 ~] # a=1

[root@m01 ~] # b=4

[root@m01 ~] # expr c=a+b                expr计算错误

c=a+b

[root@m01 ~] # expr c = a + b

expr: non-integer argument                expr将a,b识别成参数,参数不是整数造成的

[root@m01 ~] # expr c =1+2

expr: syntax error                    expr语法错误

[root@m01 ~] # expr 1 + 2                expr正确的计算

3

[root@m01 ~] # expr 1 * 3                为什么这样计算也有问题

expr: syntax error

[root@m01 ~] # expr 1 \* 3                计算方式

3

3.1.2.3.1 expr乘法为什么需要将乘号转义下

  • 原因:因为expr在计算的时候将*认成了通配符*造成的,使用echo则知道

3.1.2.3.2 expr 0+0的错误想法

  • 问题:0+0=0,对的啊,为什么返回值是错误的
  • 原因:我们可以在加一个数字来进行计算,会发现语法错误报错提示

  • 结论:通过这个可以知道expr在计算的时候,不能是0和null

3.1.2.4 bc方法计算

3.1.2.4.1 整数计算

[root@m01 ~] # echo 3+2 | bc

5

[root@m01 ~] #

[root@m01 ~] # echo 5*3 | bc

15

[root@m01 ~] # echo 2^3|bc

8

[root@m01 ~] #

3.1.2.4.2 小数计算
  • -l            Define the standard math library.(定义标准数学计算方法)

[root@m01 ~] # echo "5/3" | bc

1                            发现bc在计算的时候只会将整数输出来,默认小数不进行输出

[root@m01 ~] #

[root@m01 ~] #

[root@m01 ~] # echo "5/3" | bc -l

1.66666666666666666666

[root@m01 ~] #

[root@m01 ~] #

3.1.2.4.3 进制计算

[root@m01 ~] # echo "obase=16;1234"|bc            10进制转16进制

4D2

[root@m01 ~] # echo "obase=8;1234"|bc            10进制转8进制

2322

[root@m01 ~] # echo "obase=2;1234"|bc            10进制转2进制

10011010010

[root@m01 ~] # echo "obase=10;10000111"|bc        10进制转10进制(测试是不是输入的默认是10进制)

10000111

[root@m01 ~] # echo "obase=2;10000111"|bc            10进制转2进制

100110001001011011101111

3.1.2.5 awk计算方法

3.1.2.5.1 awk最普通的计算方法

[root@m01 ~] # awk 'BEGIN{print 3*2}'

6

[root@m01 ~] #

3.1.2.5.2 awk利用变量的计算方法

[root@m01 ~] # a=1

[root@m01 ~] # b=2

[root@m01 ~] # awk -v n=$b 'BEGIN{print n,n**3,n*n}'

2 8 4

[root@m01 ~] #

3.1.2.5.3 awk利用变量计算方法

[root@m01 ~] # a=1

[root@m01 ~] # b=2

[root@m01 ~] # awk -v n1=$a -v n2=$b 'BEGIN{print n1,n1**n2,n1*n2}'

1 1 2

[root@m01 ~] #

3.1.2.6 $[]计算方法

[root@m01 ~] # echo $((3/2))

1

[root@m01 ~] # echo $[3/2]                    和(())一样,[]只是一对

1

3.2 shell条件测试语句的讲解

3.2.1 文件相关表达式

3.2.1.1 常见的表达式

表达式

含义

例子

-d

directory目录是否存在

[root@m01 ~] #

[root@m01 ~] # [ -d /oldboy/ ] && echo "true" || echo "false"

true

[root@m01 ~] # cd /oldboy

[root@m01 oldboy] #

-f

file文件是否存在

[root@m01 oldboy] # [ -f /oldboy/1.txt ] && echo "true" || echo "false"

true

[root@m01 oldboy] # ll /oldboy/1.txt

-rw-r--r-- 1 root root 12 Oct 1 11:50 /oldboy/1.txt

[root@m01 oldboy] #

-r

read文件是否存在,并且是否具有读权限

[root@m01 ~] # [ -r /oldboy/bb ] && echo true || echo "false"

false

[root@m01 ~] # ll /oldboy/bb

ls: cannot access /oldboy/bb: No such file or directory

[root@m01 ~] #

-w

write文件是否存在,并且是否具有写权限

[root@m01 ~] # ll /oldboy/bb

ls: cannot access /oldboy/bb: No such file or directory

[root@m01 ~] # [ -w /oldboy/bb ] && echo true || echo "false"

false

-x

execute文件是否存在,并且是否具有执行权限

[root@m01 ~] # ll /oldboy/bb

ls: cannot access /oldboy/bb: No such file or directory

[root@m01 ~] # [ -x /oldboy/bb ] && echo true || echo "false"

false

-s

size文件里面的内容是否是空的

[root@m01 ~] # [ -s /oldboy/aa ] && echo true || echo "false"

false

[root@m01 ~] # cat /oldboy/aa

[root@m01 ~] #

-e

exits文件是否存在

[root@m01 ~] # cat /oldboy/aa

[root@m01 ~] # [ -e /oldboy/aa ] && echo true || echo "false"

true

[root@m01 ~] #

-L

symlink文件是否存在,并且是不是软链接

[root@m01 ~] # [ -L /etc/rc.local ] && echo true || echo "false"

true

[root@m01 ~] # ll /etc/rc.local

lrwxrwxrwx 1 root root 13 Sep 20 11:25 /etc/rc.local -> rc.d/rc.local

[root@m01 ~] #

f1 -nt f2

文件f1是不是新于f2

[root@m01 ~] # touch aa.txt

[root@m01 ~] # touch bb.txt

[root@m01 ~] # [ /root/aa.txt -nt /root/bb.txt ] && echo true || echo "false"

false

f1 -ot f2

文件f1是不是旧于f2

[root@m01 ~] # touch aa.txt

[root@m01 ~] # touch bb.txt

[root@m01 ~] # [ /root/aa.txt -ot /root/bb.txt ] && echo true || echo "false"

true

3.2.2 字符串的比较(提示:字符串要加双引号"" )

表达式

含义

例子

-n

not zero字符串不是空的,则返回true

[root@m01 ~] # aa=0

[root@m01 ~] # [ -n "aa" ] && echo "$aa" || echo false

0

[root@m01 ~] #

-z

zero字符串是空的,则返回true

[root@m01 ~] # aa=0

[root@m01 ~] # [ -z "aa" ] && echo "$aa" || echo false

false

"A"=="B"

字符串A等于字符串B则返回true

[root@m01 ~] # aa=0

[root@m01 ~] # bb=2

[root@m01 ~] # [ "aa" == "bb" ] && echo "$aa" || echo false

false

"A"!="B"

字符串A不等于字符串B,则返回true

[root@m01 ~] # aa=0

[root@m01 ~] # bb=2

[root@m01 ~] # [ "aa" != "bb" ] && echo "$aa" || echo false

0

[root@m01 ~] #

3.2.3 整数的比较

3.2.3.1 []比较

表达式

含义

例子

-gt

greate than大于

[root@m01 ~] # [ 3 -gt 2 ] && echo yes || echo no

yes

-ge

greate equal
大于等于

[root@m01 ~] # [ 3 -ge 3 ] && echo yes || echo no

yes

[root@m01 ~] #

-lt

less than
小于

[root@m01 ~] # [ 3 -lt 2 ] && echo yes || echo no

no

[root@m01 ~] #

-le

less equal 小于等于

[root@m01 ~] # [ 3 -le 2 ] && echo yes || echo no

no

[root@m01 ~] #

-ne

not equal
不等于

[root@m01 ~] # [ 3 -ne 2 ] && echo yes || echo no

yes

[root@m01 ~] #

-eq

equal 等于

[root@m01 ~] # [ 3 -eq 4 ] && echo yes || echo no

no

3.2.3.2 (())或者[[]]比较(不常用)

表达式

含义

例子

>

大于

[root@m01 ~] # ((3>2)) && echo yes || echo no

yes

>=

大于等于

[root@m01 ~] # ((2>=3)) && echo yes || echo no

no

<

小于

[root@m01 ~] # ((3<2)) && echo yes || echo no

no

[root@m01 ~] #

<=

小于等于

[root@m01 ~] # ((2<=2)) && echo yes || echo no

yes

[root@m01 ~] #

!=

不等于

[root@m01 ~] # ((2!=2)) && echo yes || echo no

no

[root@m01 ~] #

== or =

等于

[root@m01 ~] # ((2==2)) && echo yes || echo no

yes

[root@m01 ~] #

3.2.4 逻辑符号的比较

3.2.4.1 []比较方法

表达式

含义

例子

(())比较方法

!

not取反

[root@m01 ~] # [ ! -d /etc/aa ] && echo "yes" || echo "no"

yes

[root@m01 ~] #

!

-a

and并且的关系

[root@m01 ~] # [ ! -d /etc/aa -a -f /etc/hosts ] && echo "yes" || echo "no"

yes

[root@m01 ~] #

&&

-o

or或者的关系

[root@m01 ~] # [ -d /etc/aa -o -f /etc/host ] && echo "yes" || echo "no"

no

[root@m01 ~] #

||

3.3 if语句的讲解

3.3.1 if语句的语法

3.3.1.1 单分支结构

3.3.1.1.1 语法

if [ ];then

命令

fi

if [ ]

then

命令

fi

3.3.1.1.2 例子

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

if [ 3 -gt 2 ]

then

echo "true"

fi

[root@m01 test_init] # sh para_0.sh

true

[root@m01 test_init] #

3.3.1.2 双分支结构

3.3.1.2.1 语法

if [ ]

then

echo cmd1

else

echo cmd2

fi

3.3.1.2.2 例子

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

if [ 3 -lt 2 ]

then

echo "true"

else

echo "false"

fi

[root@m01 test_init] # sh para_0.sh

false

[root@m01 test_init] #

3.3.1.3 多分枝结构

3.3.1.3.1 语法

if []

then

echo ""

elif []

then

echo ""

else

echo ""

fi

3.3.1.3.2 例子

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

read -p "please input num " num

if [ $num -lt 2 ]

then

echo "true"

elif [ $num -lt 10 ]

then

echo "el_true"

else

echo "false"

fi

[root@m01 test_init] # sh para_0.sh

please input num 12

false

[root@m01 test_init] # sh para_0.sh

please input num 9

el_true

[root@m01 test_init] #

3.4 while语句的讲解

3.4.1 语法讲解

3.4.1.1 有限的循环

while <条件表达式>

do

命令1

done

3.4.1.2 无限的循环

[root@m01 test_init] # while true

do

条件

done

3.4.1.3 while读取的方法

[root@m01 test_init] # while read 变量

do

echo ""

done<文件

3.4.2 例子

3.4.2.1 有限循环的例子

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

a=$1

while [ $a -lt 2 ]

do

echo "aa"

let a++;

done

[root@m01 test_init] # sh para_0.sh 0

aa

aa

[root@m01 test_init] #

3.4.2.2 无限循环的例子

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

while true

do

echo "aa"

done

[root@m01 test_init] #

3.4.2.3 read的例子(暴力破解超过10次就给禁止掉)

[root@m01 test_shell] # vim pojie_ip.sh

#!/bin/bash

file_txt=/server/scripts/count.txt

awk '$6~/Failed/{print $(NF-3)}' /var/log/secure | sort -nr | uniq -c > $file_txt

while read key value

do

if [ $key -gt 10 -a `iptables -nvL | grep -wc "$value"` -eq 0 ]

then

iptables -A INPUT -s $value -p tcp --dport 22 -j DROP

fi

done<$file_txt

3.5 case语句的讲解

3.5.1 case语法讲解

case "变量" in

值1)

指令1...

;;

值2)

指令2...

;;

*)

指令3...

esac

case "你有什么条件" in

有钱)

白富美结婚

;;

有权)

白富美结婚

;;

有爹)

白富美

;;

有才有能力有潜力)

先谈个对象看看

;;

*)

洗洗睡吧

esac

3.5.2 case例子讲解

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

read -p "please input num " num

case $num in

1) echo "you input num is 1" ;;

2) echo "you input num is 2" ;;

*) echo "you input num null " ;;

esac

[root@m01 test_init] # sh para_0.sh

please input num 2

you input num is 2

[root@m01 test_init] # sh para_0.sh 6

please input num 6

you input num null

[root@m01 test_init] #

3.6 函数的讲解

3.6.1 函数的概念

将程序中经常能使用的代码组合起来,并且起个函数名称

3.6.2 函数的语法格式

function 函数名() {

指令集

return n

}

function 函数名 {

指令集

return n

}

函数名() {

指令集

return n

}

3.6.3 函数的例子

3.6.3.1 函数通常使用

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

fun() {

aa=12

echo $aa

}

fun

[root@m01 test_init] # sh para_0.sh

12

[root@m01 test_init] #

3.6.3.2 函数传参方式使用

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

a1=$1

echo $a1

fun() {

aa=$2

echo $2

}

fun

[root@m01 test_init] # sh para_0.sh 1 2                2个参数为啥只识别了脚本里面的,函数里面的没有

1

[root@m01 test_init] #

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

a1=$1

echo $a1

fun() {

a2=$1

echo $a2

}

fun 66

[root@m01 test_init] # sh para_0.sh 1                发现2个参数都已经出来了

1

66

[root@m01 test_init] #

  • 结论:函数里面的参数信息和shell里面的参数信息是不一致的,函数里面的信息只对函数本身起作用,属于局部的,shell里面的参数信息是全局的,整个shell都可以使用

3.7 颜色和vimrc的讲解

3.7.1 颜色的语法

\e[字体格式;颜色
文字信息\e[0m

\033[字体格式;颜色
文字信息\033[0m

\E[字体格式;颜色
文字信息\E[0m

3.7.2 颜色的例子

3.7.3 对每个组成进行讲解

  • \e也可以使用\033替代。
  • [1数字1表示加粗显示(这个位置可以加不同的数字代表不同的意思,详细信息可man console_codes获得) 。
  • 31m表示为红色字体,这个位置可以换不同的数字,以代表不同的意思。
  • "aa":表示待设置的内容。
  • [0m表示关闭所有属性,这个位置可以换不同的数字,以代表不同的意思

man console_codes

3.7.4 vimrc的讲解

  • 当前用户生效~/.vimrc
  • 全部用户生效/etc/vimrc

3.8 for语句的讲解

3.8.1 for语法格式

for 变量 in 变量取值的列表

do

指令

done

for 变量 in 1 2 3 4 5 {a..z} `seq 10` `ls /etc`

do

指令

done

C循环使用

for((i=1;i<=10;i++))             只是用来对数字进行循环,给shell数组进行循环

do

指令

done

3.8.2 for的例子

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

for i in `seq 10`

do

echo $i

done

[root@m01 test_init] # sh para_0.sh

1

2

3

4

5

6

7

8

9

10

[root@m01 test_init] #

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

n=0

sum=0

for i in `seq 10`

do

((sum=sum+i))

done

echo $sum

[root@m01 test_init] # sh para_0.sh

55

[root@m01 test_init] #

3.8.3 循环控制

名称

含义

例子

continue (n)

终止本次循环,开始下一次的循环,n表示结束本次循环,直接跳到第n次循环

[root@m01 test_init] # vim para_0.sh

#!/bin/bash

for i in `seq 10`

do

for j in `seq 10`

do

if [ $j -eq 6 ] && continue 2

then

echo $j

else

echo $i $j

fi

done

done

break (n)

终止这次循环并且以后的循环,直接跳出,n表示结束循环,调到指定的n次循环

[root@m01 test_init] # vim para_0.sh

#!/bin/bash

for i in `seq 10`

do

for j in `seq 10`

do

for k in `seq 10`

do

[ $k -eq 6 ] && break 2

echo $i $j $k

done

done

done

exit n

退出脚本,n返回值

[root@m01 test_init] # cat para_0.sh

#!/bin/bash

for i in `seq 10`

do

if [ $i -eq 9 ]

then

exit 0

fi

done

[root@m01 test_init] # echo $?

0

[root@m01 test_init] #

return n

返回数值,n放在脚本或者函数的最后,判断函数的返回值

[root@m01 test_init] # vim para_0.sh

#!/bin/bash

fun() {

for i in `seq 10`

do

if [ $i -eq 9 ]

then

return 0

fi

done

}

fun

3.9 shell数组讲解

3.9.1 语法

3.9.1.1 通过[]方式来获取

[root@m01 ~] # ip[1]=10.0.0.61

[root@m01 ~] # ip[2]=10.0.0.51

[root@m01 ~] # ip[3]=10.0.0.41

[root@m01 ~] # echo ${#ip[*]}

3

[root@m01 ~] # echo ${ip[*]}

10.0.0.61 10.0.0.51 10.0.0.41

[root@m01 ~] #

3.9.1.2 通过()方式来获取

[root@m01 ~] # ip=(10.0.0.61 10.0.0.51 10.0.0.41)

[root@m01 ~] # echo ${ip[*]}

10.0.0.61 10.0.0.51 10.0.0.41

[root@m01 ~] # echo ${ip[0]}

10.0.0.61

[root@m01 ~] #

[root@m01 ~] # ip=(`cat /etc/hosts`)

[root@m01 ~] # echo ${ip[*]}

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.1.81 firewalld 172.16.1.5 lb01 172.16.1.6 lb02 172.16.1.7 web01 www.oldboy.com 172.16.1.8 web02 172.16.1.9 web03 172.16.1.51 db01 172.16.1.31 nfs01 172.16.1.41 backup 172.16.1.61 m01 172.16.1.71 zabbix

[root@m01 ~] # echo ${#ip[*]}

33

[root@m01 ~] #

3.9.2 例子

[root@m01 ~] # ip=(10.0.0.61 10.0.0.51 10.0.0.41)

[root@m01 ~] # for i in ${ip[*]} ;do ping -c 1 -W1 $i ;done

读完学会shell语法,shell脚本80%已经学会的更多相关文章

  1. -Shell 教程 Bash 脚本 基础语法 MD

    目录 目录 Shell 简介 Shell 脚本 Shell 环境 第一个shell脚本 Shell 变量 定义变量 使用变量 只读变量 删除变量 Shell 字符串 单引号 双引号 字符串基本操作 S ...

  2. Shell语法规范

    ver:1.0 博客:https://www.cnblogs.com/Rohn 本文介绍了Shell编程的一些语法规范,主要参考依据为谷歌的Shell语法风格. 目录 背景 使用哪一种Shell 什么 ...

  3. shell语法简单介绍

    一.基本的语法 1.1.shell文件开头 shell文件必须以以下的行開始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的參数是用来运行该文件的程序.在这个样例中我们 ...

  4. 【shell】shell脚本入门

    1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...

  5. makefile中的shell语法

    在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是 ...

  6. Linux 常用命令解析和Bash Shell使用示例脚本演示

     摘要 Linux命令是基于文本格式输入输出的一种程序,依照Unix哲学中强调的程序功能简单,输入宽松,输出严谨,各种程序组合能够具有更强大的功能,而具有这样的灵活性的主要原因是Linux规定程序 ...

  7. 初识Shell与Shell脚本

    初识Shell Shell 是一个用 C 语言编写的程序,Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内 ...

  8. Shell记录-Shell脚本基础(一)

    Shell 注释: 你可以把注释,在你的脚本如下: #!/bin/bash # Author : Zara Ali # Copyright (c) Tutorialsyiibai.com # Scri ...

  9. shell的select脚本的简单入门

    shell的select脚本的简单入门 语法:select var in ...;do break;doneecho $var 示例: #/bin/bash echo "what is yo ...

随机推荐

  1. 网络传输中的各种加密算法+SSL+CA证书详解

    1. 数据传输分类 在互联网上数据传输有两种:明文传输和加密传输.明文传输的协议有:ftp.http.smtp.telnet.但是为了数据的完整性和安全性,所以后来引用了加密等相关手段来保证数据的安全 ...

  2. 使用Web Deploy自动打包发布

    在内部测试阶段,经常改一点小东西需要更新给测试继续测试.然后就需要频繁的找到对应更改的视图/JS文件,或者是编译的dll文件,再打开测试服务器找到对应站点替换进去,整套流程下来就非常的繁琐费时. 使用 ...

  3. unable to resolve class XXX

    > Task :HelloWorld_Web:compileGroovy startup failed: E:\GradleDemoManyModules\ExampleHelloWorld\H ...

  4. SpringBoot单元测试携带Cookie

    由于我SpringBoot项目,集成了SpringSecurity,而Security框架使用Redis存储Session,所以,这里列出几个关键的类 org.springframework.sess ...

  5. 遇到的问题之“Dubbo 直连 Invoke remote method timeout 问题!”

    Dubbo 直连 Invoke remote method timeout 问题!   在测试环境消费者直连服务端进行测试时, 其中一个RPC接口抛出一个错误, 如下: Caused by: com. ...

  6. 【Visual Studio】VS 提示图标的含义

    一.前言 vs 中提示图标是什么意思 二.正文 信号图标 以下信号图标应用于所有原有的图标并指示它们的辅助功能. 图标 描述 <No Signal Icon> Public. 可从此组件中 ...

  7. Clickhouse-alter 对副本表修改表结构报元数据错误

    [应用场景] 对分片副本表的列进行 alter 操作 [问题复现] [解决办法] 检查该分片所有副本表的表结构和 zk 上存储的 column 信息保持一致,检查本地的表结构 sql 文件 /data ...

  8. 体验javascript之美6:如果你觉得什么都会了或者不知道js学什么了看这里-面向对象编程

    概述 当大家已经把js的语言基础理解了,然后能够写出一些简单的例子了,这个时候基本上达到了一年工作经验的水平,而自己能够独立的写一些小功能,完成一些小效果,或者临摹修改一些比较复杂的插件的时候差不多就 ...

  9. 解决使用 swiper 常见的问题

    使用 swiper 的过程中个人总结 1. swiper插件使用方法, 直接查看文档 swiper基础演示 swiper API文档 2.swiper近视初始化时, 其父级元素处于隐藏状态(displ ...

  10. HCNP Routing&Switching之组播技术-组播路由协议PIM

    前文我们了解了组播技术中组播分发树相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16019334.html:今天我们来聊一聊组播路由协议PIM相关话题 ...