博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell语法
阅读量:5232 次
发布时间:2019-06-14

本文共 3923 字,大约阅读时间需要 13 分钟。

shell script的定义

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

shell脚本的基本组成

声明和注释

系统命令
变量
运算符
条件判断
循环结构
函数

shell声明和注释

shell脚本的第一行一般为:

#!/bin/bash

这条语句的作用是指定调用的解释器是/bin/bash。

注释就是脚本中#号后面的内容,类似于C语言的//

shell变量

shell变量有系统变量和自定义变量,这里主要介绍下自定义变量和使用。

定义变量时,变量名不加美元符号($),如:

[root@bogon sh]# variableName='value'[root@bogon sh]# echo $variableName  value  [root@bogon sh]# variableName=12  [root@bogon sh]# echo $variableName  12  [root@bogon sh]# variable=$(seq 3)[root@bogon sh]# echo $variable1 2 3

不仅可以将字符串、数字赋值给一个变量,还可以将命令的结果赋值给变量。

注意,变量名和等号之间不能有空格,这是和其它编程语言不一样的地方

变量名的命名规则:

  • 以字母或下划线开头
  • 中间不能有空格,可以使用下划线
  • 不能使用标点符号
  • 不能使用bash里的关键字。(可以help查看保留关键字)

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况就必须加了:

    for i in {1..20}

    do
    echo ${i}%
    echo ${i}step
    done

所有推荐常用shell编程的人员给所有变量加花括号。

运算符

算数运算符

+  -  *  /  %加 减 乘 除 取余

linux的数学运算常用(())和bc,例如:

[root@bogon sh]# echo $((5+3))  8  [root@bogon sh]# echo $((5%3))  2  [root@bogon sh]# echo 5%3|bc  2  [root@bogon sh]# echo 5+3|bc  8  [root@bogon sh]#

需要注意:(())只能用于整数的运算,bc有相应选项支持结果是小数,但是当结果是小于1时不显示整数,如下:

[root@bogon sh]# echo 'scale=2;7/10'|bc -l.70[root@bogon sh]# echo 'scale=2;17/10'|bc -l1.70[root@bogon sh]# echo 'scale=2;27/10'|bc -l2.70[root@bogon sh]#

介绍下常用的类似取磁盘使用率百分之多少方法:

[root@bogon sh]# echo 'scale=2;1/3'|bc -l  .33  [root@bogon sh]# echo 'scale=2;1/3'|bc -l|cut -d '.' -f2  33  [root@bogon sh]# echo $(echo 'scale=2;1/3'|bc -l|cut -d '.' -f2)%  33%

关系操作

<    >    <=    >=    ==    !=    &&    ||

多与(())连用

赋值运算符

=    +=    *=    /=    %=示例:[root@bogon ~]# echo $((x+3))  5  [root@bogon ~]# x=2  [root@bogon ~]# echo $((x+=3))  5

测试操作

用途:测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其它数值

语法:

test 条件表达式 或者 [ 条件表达式 ]

文件测试

-f FILE    文件存在并且是普通文件-d FILE    文件存在并且是目录-e FILE    文件存在-h FILE    文件存在并且是链接文件-b FILE    文件存在并且是块设备文件

注意:-f判断文件时,如果文件是链接文件会去判断链接文件的源文件,如果对一个目录下文件分类计数,需要先用-h去判断完链接文件

字符串测试

字符串测试建议使用双方括号,可以解决变量中带空格的问题。里面可以使用通配符。

格式:[[ 字符串1 = 字符串2 ]]

=    两个字符串相等!=    两个字符串不相等-z    字符串为空(zero)-n    非空字符串(nonzero)

示例:

[root@bogon ~]# read -p "input var1: " var1input var1: abc[root@bogon ~]# read -p "input var2: " var2input var2: 123[root@bogon ~]# [[ $var1 = $var2 ]][root@bogon ~]# echo $?1[root@bogon ~]# [[ $var1 != $var2 ]][root@bogon ~]# echo $?0[root@bogon ~]#

数值测试

操作符

-eq    等于(equal)-ne    不等于(not equal)-gt    大于(greater than)-lt    小于(less than)-ge    大于等于(greater than or equal)-le    小于等于(less than or equal)

示例:

[root@bogon ~]# read -p "input num1: " num1input num1: 20[root@bogon ~]# read -p "input num2: " num2input num2: 50[root@bogon ~]# [ $num1 -ne $num2 ][root@bogon ~]# echo $?0[root@bogon ~]# [ $num1 -gt $num2 ][root@bogon ~]# echo $?1[root@bogon ~]# [ $num1 -lt $num2 ][root@bogon ~]# echo $?0[root@bogon ~]# [ $num1 -le $num2 ][root@bogon ~]# echo $?0[root@bogon ~]#

不过建议数值比较使用双圆括号如下:

[root@bogon ~]# read -p "input num1: " num1input num1: 20[root@bogon ~]# read -p "input num2: " num2input num2: 50  [root@bogon ~]# ((num1==num2))[root@bogon ~]# echo $?1[root@bogon ~]# ((num1!=num2))[root@bogon ~]# echo $?0[root@bogon ~]# ((num1>num2))[root@bogon ~]# echo $?1[root@bogon ~]# ((num1

条件判断

if判断:

语句示例:

read -p "please input your file: " fileif [ -b $file ];then    echo "$file is block file"elif [ -f $file ];then    echo "$file is regular file"elif [ -d $file ];then    echo "$file is directory file"else    echo "$file type is unknown"fi

case语句

read -p "please input your score: " scorecase $score inA|a)echo "your score is A";;B|b)echo "your score is B";;C|c)echo "your score is C";;D|d)echo "your score is D";;*)echo "input error"esac

循环结构

while循环

[root@bogon sh]# cat while.sh #!/bin/bashi=0while [[ $i -le 10 ]]do((i++))if [[ $i -eq 3 ]];then    continueelif [[ $i -eq 8 ]];then    breakelse    echo  $ifidone[root@bogon sh]# bash  while.sh 124567[root@bogon sh]#

for循环

#!/bin/bashfor i in $(seq -w 10)do    echo $idone[root@bogon sh]# bash for.sh 01020304050607080910[root@bogon sh]#

转载于:https://www.cnblogs.com/liao-lin/p/6946887.html

你可能感兴趣的文章
[WebMatrix] 如何将SQL Compact 4.0 移转至SQL Server 2008 Express
查看>>
Java内部类详解
查看>>
python-基础
查看>>
17 案例
查看>>
【BZOJ 1221】 [HNOI2001] 软件开发
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
SQL字符型转日期型
查看>>
Java程序设计教程(第2版)阅读总结
查看>>
图论-次短路求法
查看>>
ios下opencv编译merge函数报错问题
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
兼容所有浏览器的实时监听输入的解决方案(转)
查看>>
JSON跨域解决方案收集
查看>>
【转】linux dumpe2fs命令
查看>>
SSH框架整合总结
查看>>