90%的Shell脚本,一篇搞定! 您所在的位置:网站首页 grep括号 90%的Shell脚本,一篇搞定!

90%的Shell脚本,一篇搞定!

2023-04-12 12:24| 来源: 网络整理| 查看: 265

今天来复习下shell脚本的写法和常用语法。

Shell概述

​Shell位于Linux和外层应用程序之间,是一个命令行解释器,接收应用程序或用户的命令去调用操作系统的内核,同时Shell编程语言易编写、灵活性强。

Shell解析器:

[Robofly@node1 ~]$ cat /etc/shells /bin/sh /bin/bash # CentOS默认解析器是bash /usr/bin/sh # sh -> bash /usr/bin/bash /bin/tcsh /bin/cshShell脚本入门脚本格式

脚本以#!/bin/bash开头。

# 直接用echo打印 [Robofly@node1 datas]$ touch helloworld.sh [Robofly@node1 datas]$ vim helloworld.sh #!/bin/bash echo "Hello World!" # 用echo追加内容到文件 [Robofly@node1 datas]$ touch batch.sh [Robofly@node1 datas]$ vim batch.sh #!/bin/bash cd /home/datas touch cls.txt echo "I love cls" >>cls.txt执行方式采用bash或sh+脚本的相对或绝对路径执行,此方式不用赋予脚本执行权限。# sh脚本的相对路径,前提是进入脚本所在的目录 [Robofly@node1 datas]$ sh helloworld.sh # sh脚本的绝对路径 [Robofly@node1 ~]$ sh /home/Robofly/datas/helloworld.sh # bash脚本的相对路径,前提是进入到脚本所在的目录 [Robofly@node1 datas]$ bash helloworld.sh # bash脚本的绝对路径 [Robofly@node1 ~]$ bash /home/Robofly/datas/helloworld.sh采用脚本的相对或绝对路径执行,此方式必须具有可执行权限。# 先赋予脚本执行权限 [Robofly@node1 ~]$ chmod +x helloworld.sh # 相对路径执行脚本 [Robofly@node1 datas]$ ./helloworld.sh # 绝对路径执行脚本 [Robofly@node1 ~]$ /home/Robofly/datas/helloworld.sh

:第一种执行方法本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限,而第二种执行方法本质是脚本需要自己执行,所以需要执行权限。

变量和运算符系统变量# 常用的系统变量:$HOME $PWD $SHELL $USER等 [Robofly@node1 ~]$ echo $HOME # 查看系统变量的值 [Robofly@node1 ~]$ set # 显示当前Shell中所有的变量自定义变量[Robofly@node1 ~]$ A=5 # 定义变量A [Robofly@node1 ~]$ A=8 # 给变量A重新赋值 [Robofly@node1 ~]$ unset A # 撤销变量A [Robofly@node1 ~]$ readonly B=2 # 声明静态的变量B=2,不能unset # bash中变量默认为字符串类型无法直接进行数值运算 [Robofly@node1 ~]$ C=1+2 [Robofly@node1 ~]$ echo $C 1+2 # 变量的值如果有空格需要用双引号或单引号括起来 [Robofly@node1 ~]$ D="I love you" # export+变量名可将变量提升为全局环境变量供其他shell程序使用 [Robofly@node1 ~]$ export B特殊变量# $n($0表示该脚本名称,$1-$9表示第一到第九个参数,10以上的参数需要用大括号包含${10}) [Robofly@node1 ~]$ touch para.sh [Robofly@node1 ~]$ vim para.sh #!/bin/bash echo "$0 $1 $2" # 双引号表示取变量的值,单引号不取变量的值,反引号(``)执行引号中的命令 [Robofly@node1 ~]$ chmod +x para.sh [Robofly@node1 ~]$ ./para.sh cls xz ./para.sh cls xz # $#(获取所有输入参数个数,常用于循环) [Robofly@node1 ~]$ vim para2.sh #!/bin/bash echo "$0 $1 $2" echo $# # 加不加双引号一样可输出参数个数,但加单引号依旧是输出字符 [Robofly@node1 ~]$ chmod +x para2.sh [Robofly@node1 ~]$ ./para2.sh cls xz ./para2.sh cls xz 2 # $*(命令行中所有的参数,把所有的参数看成一个整体) # $@(也代表命令行中所有的参数,但是它把每个参数区分对待) [Robofly@node1 ~]$ vim para3.sh #!/bin/bash echo "$0 $1 $2" echo $# echo $* echo $@ [Robofly@node1 ~]$ bash para3.sh 1 2 3 ./para3.sh 1 2 3 1 2 3 1 2 3 # $?(最后一次执行的命令的返回状态,如果这个变量的值为0表示上次命令正确执行,非0则表示上次命令执行不正确) [Robofly@node1 datas]$ ./helloworld.sh hello world [Robofly@node1 datas]$ echo $? 0运算符# expr运算符间要有空格,没有空格作为字符串输出 [Robofly@node1 ~]$ expr 2 + 3 # expr +,-,\*,/,% 加减乘除取余 [Robofly@node1 ~]$ expr `expr 2 + 3` \* 4 # $((运算式))或$[运算式] [Robofly@node1 ~]$ s=$[(2+3)*4] [Robofly@node1 ~]$ echo $s条件判断基本语法

[ 条件 ]:条件前后必须有空格。条件非空即为true,否则返回false。

常用判断条件:

-z:判断变量的值是否为空,空则返回0为true,非空返回1为false。

-n:判断变量的值是否为空,空则返回1为false,非空返回0为true。

两个整数之间比较 -lt:小于(less than) -le:小于等于(less equal) -eq:等于(equal) -gt:大于(greater than) -ge:大于等于(greater equal) -ne:不等于(not equal)按照文件权限进行判断 -r:读权限(read) -w:写权限(write) -x:执行权限(execute) 按照文件类型进行判断 -f:文件存在且为常规文件(file) -e:文件存在(existence) -d:文件存在且为目录(directory) 举例# 23是否大于等于22 [Robofly@node1 ~]$ [ 23 -ge 22 ] [Robofly@node1 ~]$ echo $? 0 # helloworld.sh是否具有写权限 [Robofly@node1 ~]$ [ -w helloworld.sh ] [Robofly@node1 ~]$ echo $? 0 # 目录中的文件是否存在 [Robofly@node1 ~]$ [ -e /home/Robofly/cls.txt ] [Robofly@node1 ~]$ echo $? 1 # 多条件判断(&&表示前一条命令执行成功时才执行后一条命令,||表示前一条命令执行失败时才执行后一条命令) [Robofly@node1 ~]$ [ condition ] && echo ok || echo notok ok [Robofly@node1 ~]$ [ condition ] && [ ] || echo notok notok流程控制if判断基本语法# 语法1 if [ 条件判断 ];then 程序 fi # 语法2 if [ 条件判断 ] then 程序 fi

:中括号内的条件判断前后必须有空格,且if后必须要有空格。

举例[Robofly@node1 ~]$ touch if.sh [Robofly@node1 ~]$ vim if.sh #!/bin/bash if [ $1 -eq "1" ] then echo "第一个参数为1" elif [ $1 -eq "2" ] then echo "第一个参数为2" fi [Robofly@node1 ~]$ chmod +x if.sh [Robofly@node1 ~]$ ./if.sh 1case语句基本语法case $变量名 in "值1") ​ 程序1 ;; "值2") ​ 程序2 ;; *) ​ 都不是执行此程序 ;; esac

:case行尾必须为in,每一个模板必须以)结束,;;相当于break,*)相当于default。

举例[Robofly@node1 ~]$ vim case.sh #!/bin/bash case $1 in "1") echo "参数为1" ;; "2") echo "参数为2" ;; *) echo "参数即不为1也不为2" esac [Robofly@node1 ~]$ chmod +x case.sh [Robofly@node1 ~]$ ./case.sh 1for循环基本语法# 语法1 for((初始值;循环控制条件;变量变化)) ​do 程序 ​ done # 语法2 for 变量 in 值1 值2 值3 ... do 程序 done举例# 从1加到100 [Robofly@node1 ~]$ vim for1.sh #!/bin/bash s=0 for((i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有