当前位置: 首页 > news >正文

shell脚本(全)

shell脚本概述

第一个shell脚本

shell注释

shell变量

shell位置参数

shell字符串

shell内置命令

shell命令替换

输出

流程控制IF

export命令

退出脚本

运行Shell脚本

实例导航

shell脚本概述

在说什么是shell脚本之前,先说说什么是shell。

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。

Linux的Shell种类众多,常见的有:

1) Bourne Shell(/usr/bin/sh或/bin/sh)
2) Bourne Again Shell(/bin/bash)
3) C Shell(/usr/bin/csh)
4) K Shell(/usr/bin/ksh)
5) Shell for Root(/sbin/sh)

不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

那么什么是shell脚本呢?

shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh
#comments
Your commands go here

首行中的符号#!指定脚本解释器,这里是用/bin/sh做解释器的。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:chmod +x filename.sh
执行脚本的方法是:./filename.sh

shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。看个例子吧。

#!/bin/shcd ~mkdir shell_tutcd shell_tutfor ((i=0; i<10; i++)); dotouch test_$i.txtdone

示例解释

•第1行:指定脚本解释器,这里是用/bin/sh做解释器的

•第2行:切换到当前用户的home目录

•第3行:创建一个目录shell_tut

•第4行:切换到shell_tut目录

•第5行:循环条件,一共循环10次

•第6行:创建一个test_1…10.txt文件

•第7行:循环体结束

cd, mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。

第一个shell脚本

打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。

输入一些代码,第一行一般是这样:

#!/bin/bash
echo "Hello World !"

在这里插入图片描述
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。

运行 Shell 脚本有两种方法:

  1. 作为可执行程序

    将上面的代码保存为 test.sh,并 cd 到相应目录:

    chmod +x ./test.sh  #使脚本具有执行权限
    ./test.sh  #执行脚本
    

    [注] 一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

  2. 作为解释器参数

    这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

    /bin/sh test.sh
    /bin/php test.php
    

    这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

shell注释

# 开头的行就是注释,会被解释器忽略。通过每一行加一个 # 号设置多行注释,像这样:

# 这是一个注释
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束  #####

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

:<<'
注释内容...
注释内容...
注释内容...
':<<!
注释内容...
注释内容...
注释内容...
!

shell变量

定义变量

使用变量

特殊变量

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。

  1. 定义变量

    变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,shell 变量也遵循这个规则

    在 bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

    这意味着,bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。

    当然,如果有必要,你也可以使用 shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,shell 开发者在编写代码时自行注意值的类型即可

    shell 支持以下三种定义变量的方式:

    variable=value
    variable='value'
    variable="value"
    

    需要注意一下几点:

    • 变量名称和等号之间不能有空格
    • 变量名由数字、字母、下划线组成,且必须以字母或者下划线开头
    • 不能使用 shell 里的关键字

    除了显式地直接赋值,还可以用语句给变量赋值,如:

    for file in `ls /etc`
    #或
    for file in $(ls /etc)
    

    以上语句将 /etc 下目录的文件名循环出来。

  2. 使用变量

    使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    your_name="qinjx"
    echo $your_name
    echo ${your_name}
    

    变量名外面的花括号是可选的,推荐给所有变量加上花括号,加花括号是为了帮助解释器识别变量的边界

    已定义的变量,可以被重新定义,如:

    your_name="tom"
    echo $your_name
    your_name="alibaba"
    echo $your_name
    

    [注]这样写是合法的,但注意,第二次赋值的时候不能写$your_name=“alibaba”,使用变量的时候才加美元符($)。

  3. 特殊变量

    变量 含义
    $0 当前脚本的文件名(包含路径)
    $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2
    $# 传递给脚本或函数的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数以 “$1 $2 … $n” 的形式输出所有参数
    $@ 与 $* 相同,但是使用时加引号,并在引号中返回每个参数,以 “$1” “ 2 " … " 2" … " 2""n” 的形式输出所有参数
    $? 上个命令的退出状态,或函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果,退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,不过,也有一些命令返回其他值,表示不同类型的错误
    $$ 当前 shell 脚本的进程 ID
    $! 执行d 上一个后台指令的ID
    $- 显示 shell 使用的当前选项,与set命令功能相同
  4. 只读变量

    使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。下面的例子尝试更改只读变量,结果报错:

    #!/bin/bashmyUrl="https://www.google.com"
    readonly myUrl
    myUrl="https://www.runoob.com"
    

    [注]运行脚本,结果如下:
    /bin/sh: NAME: This variable is read only.

变量类型

运行shell时,会同时存在三种变量

1)局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2)环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3)shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

④创建只可函数体中使用的局部变量:

#使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用
local name=“test” 

关于变量,还需要知道几个与其相关的Linux命令

①env用于显示用户环境区中的变量及其取值;

②set用于显示本地数据区和用户环境区中的变量及其取值;

③unset用于删除指定变量当前的取值,该值将被指定为NULL;

④export命令用于将本地数据区中的变量转移到用户环境区;

#unset用于删除指定变量当前的取值,该值将被指定为NULL
unset name; 

(3)字符串变量

①单引号

#单引号变量,只能原样输出,变量 ${变量名称}无效
#单引号中不能出现一个单独的单引号,转义也不可以
var='test' 

②双引号

#双引号变量,变量 ${变量名称}有效
#可出现转义符
var="my name is ${name}"

③拼接字符串

#中间无任何+,之类的字符
name="this is"" my name"; 
#等效
name="this is my name";
#等效
name="this" is "my name"name='this is'' my nam';
#等效
name=‘this is my name';
#等效
name='this' is 'my name'

④获取字符串长度

#创建普通变量
name=“test”;
#在${}中使用“#”获取长度,此例输出为4
echo ${#name}; 

⑤提取子字符串

#创建普通变量
name=“this is my name”;#1:4 从第2个开始 往后截取4个字符
echo ${name:1:4} #输出 is i#::4 从第一个字符开始 往后截取4个字符
echo ${name::4} #输出 this

(3)长句换行

在shell中为避免一个语句过长,可以使用“\”进行换行,在脚本执行过程中还是当做一行一个语句执行。
注意:\ 前添加一个空格 。 \ 后无空格直接换行。

/mysql/bin/mysql \
-h test_host -P 000 \
-u test_user -ptest_password ;

shell位置参数

我们来说一下 shell 位置参数是怎么回事,运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 $n 的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推

同样,在调用函数时也可以传递参数。shell 函数参数的传递和其它编程语言不同,没有所谓的形参和实参,在定义函数时也不用指明参数的名字和数目。换句话说,定义 shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用 $n 的形式接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推

这种通过$n的形式来接收的参数,在 shell 中称为位置参数。

#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限($ chmod +x test.sh ),
并执行脚本($ ./test.sh 1 2 3),

输出结果如下所示:

Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

shell字符串

字符串拼接

  1. 字符串拼接

    在 shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接

    #!/bin/bashname="shell"
    url="http://www.baidu.com/"str1=$name$url  #中间不能有空格
    str2="$name $url"  #如果被双引号包围,那么中间可以有空格
    str3=$name": "$url  #中间可以出现别的字符串
    str4="$name: $url"  #这样写也可以
    str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号echo $str1
    echo $str2
    echo $str3
    echo $str4
    echo $str5
    

shell内置命令

bash shell 中直接可用的内建命令:

命令 作用
echo将指定字符串输出到 STDOUT
export 设置子 shell 进程可用的变量
read从 STDIN 读取一行数据并将其赋给一个变量
exit强制 shell 以指定的退出状态码退出

test 和 [] 内置命令

  1. test 和 [] 内置命令

    test 是 shell 内置命令,用来检测某个条件是否成立,test 命令也可以简写为 [] 两者是等价的,两者通常和 if 语句一起使用,它有很多选项,可以进行数值、字符串和文件三个方面的检测。两者命令的用法为:

    #用法1
    test expression#用法2
    [ expression ]
    

    需要注意 [] 和 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。[] 的写法更加简洁,比 test 使用频率高

shell命令替换

shell 命令替换是指将命令的输出结果赋值给某个变量。比如,在某个目录中输入 ls 命令可查看当前目录中所有的文件,但如何将输出内容存入某个变量中呢?这就需要使用命令替换了,这也是 shell 编程中使用非常频繁的功能

shell 中有两种方式可以完成命令替换,一种是反引号 ,一种是 $() 使用方法如下:

variable=`commands`
variable=$(commands)

variable 是变量名,commands 是要执行的命令,commands 可以只有一个命令,也可以有多个命令,多个命令之间以分号 ; 分隔

例如,date 命令用来获得当前的系统时间,使用命令替换可以将它的结果赋值给一个变量

#!/bin/bash
btime=`date`    #开始时间,使用``替换
sleep 10s       #休眠20秒
etime=$(date)   #结束时间,使用$()替换echo "begin time: $btime"
echo "end time: $etime"

原则上讲 `` 和 $() 这两种变量替换的形式是等价的,但也有各自的优缺点,如下:

• 反引号毕竟看起来像单引号,有时候会对查看代码造成困扰,而使用 $() 就相对清晰,能有效避免这种混乱

• $() 支持嵌套,反引号不支持

• $() 仅在 bash Shell 中有效,而反引号可在多种 shell 中使用,兼容性好

建议:如果我们的脚本不需要跨平台,想便于查看,或是有嵌套需求的可用 $();如果没有嵌套需求,希望脚本的平台兼容性强则可以用反引号

输出

(1)echo

描述:仅用于字符串的输出,没有使用printf作为输出的移植性好,建议使用printf

(2)printf

描述:printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。无大括号,直接以空格分隔

流程控制IF

  1. 单分支语法格式:

    #单分支语法格式
    if 条件
    thencommands
    fi
    

    也可以将 if 和 then 放同一行,注意 then 前必须加一个分号 ;

    if 条件; thencommands
    fi
    
  2. 双分支语法:

    if 条件; thencommands
    elsecommands
    fi
    
  3. 多分支语法:

    if 条件1; thencommands
    elif 条件2; thencommands
    elif 条件3; thencommands
    elsecommands
    fi
    

• 当 if 语句中使用 [ ] 条件修饰符时, $flag 变量必须加上引号
• 当 if 语句中使用 [[]] 条件修饰符时,$flag 变量的引号可有可无

export命令

什么是export命令?

用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行 shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一 个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来 说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。

在子 shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内 的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。

为什么要用export命令?

为了是是我们定义一个变量时可以在子shell中被调用,而不需要重复去定义。

怎么使用export命令?

解释:
♦Linux export命令用于设置或显示环境变量。
♦在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。

语法:export [-fnp][变量名称]=[变量设置值]

* -f  代表[变量名称]中为函数名称。

* -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

* -p  列出所有的shell赋予程序的环境变量。

列出当前所有的环境变量

[root@localhost ~]# export -p
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/home/zszc"
declare -x HOSTNAME="localhost"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x KDE_IS_PRELINKED="1"
declare -x KDE_NO_IPV6="1"
declare -x LANG="zh_CN.UTF-8"
declare -x LC_ALL="zh_CN.GBK"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD
declare -x PATH="/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/zszc/bin"
declare -x PWD="/home/zszc"
declare -x QTDIR="/usr/lib64/qt-3.3"
declare -x QTINC="/usr/lib64/qt-3.3/include"
declare -x QTLIB="/usr/lib64/qt-3.3/lib"

定义环境变量

[root@localhost ~]# export laolao#定义环境变量
[root@localhost ~]# export -p
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/home/zszc"
declare -x HOSTNAME="localhost"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x KDE_IS_PRELINKED="1"
declare -x KDE_NO_IPV6="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_CLIENT="192.168.113.206 17527 22"
declare -x SSH_CONNECTION="192.168.113.206 17527 192.168.44.33 22"
declare -x SSH_TTY="/dev/pts/1"
declare -x TERM="vt100"
declare -x USER="root"
declare -x a="echo hollo li"
declare -x b="echo hollo qiang"
declare -x c="echo huahua"
declare -x laolao
declare -x test="value1"

定义环境变量赋值

[root@localhost ~]# export laolao=2
[root@localhost ~]# export -p
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/home/zszc"
declare -x HOSTNAME="localhost"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x KDE_IS_PRELINKED="1"
declare -x KDE_NO_IPV6="1"
declare -x LANG="zh_CN.UTF-8"
declare -x LC_ALL="zh_CN.GBK"
declare -x TERM="vt100"
declare -x USER="root"
declare -x a="echo hollo li"
declare -x b="echo hollo qiang"
declare -x c="echo huahua"
declare -x laolao="2"
declare -x test="value1"
[root@localhost ~]# 

♦得出的结论是:

•1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;

•2、一个shell中的系统环境变量才会被复制到子 shell中(用export定义的变量);

•3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失 (并不能返回到父shell中)。

•4、不用export定义的变量只对该shell有效,对子shell也是无效的。

实例

实例1

[root@localhost ~]# vim liqiang.sh
export a='echo hollo li'
b='echo hollo qiang'
./liqiang-3.sh
[root@localhost ~]# vim liqiang-3.sh
echo 看看这里调用几次
echo 调用一次就对了
echo $a
echo $b
bash

输出结果:

[root@localhost ~]# ./liqiang.sh
看看这里调用几次
调用一次就对了
echo hollo li

实例2:在子shell中定义变量,在父shell中调用

[root@localhost ~]# vim liqiang-3.sh
echo 看看这里调用几次
echo 调用一次就对了
echo $a
echo $b
c='echo huahua'
bash
~
root@localhost ~]# vim liqiang.sh
export a='echo hollo li'
export b='echo hollo qiang'
./liqiang-3.sh
echo $c

运行结果:

[root@localhost ~]# ./liqiang.sh
看看这里调用几次
调用一次就对了
echo hollo li
echo hollo qiang
#c没有被调用
[root@localhost ~]# 

实例3:在子shell中用export导出依然不会被父shell调用c

[root@localhost ~]# vim liqiang-3.sh
echo 看看这里调用几次
echo 调用一次就对了
echo $a
echo $b
export c='echo huahua'
bash

运行结果:

[root@localhost ~]# ./liqiang.sh
看看这里调用几次
调用一次就对了
echo hollo li
echo hollo qiang
[root@localhost ~]# 

退出脚本

退出命令:exit

在退出脚本时使用不同的错误码,这样可以根据错误码来判断发生了什么错误。

在绝大多数 shell 脚本中,exit 0 表示执行成功,exit 1 表示发生错误。
对错误与错误码进行一对一的映射,这样有助于脚本调试。

if [ `whoami` != "weblogic" ];then
echo " Please use the weblogic user to start this shell"
exit 1
fi

(1)删除目录/文件

运行Shell脚本

  1. [bash执行] 方式

    语法: sh [相对路径或绝对路径]/***.sh

  2. [直接执行脚本文本] 方式

    步骤1:

    设置文件为可执行,+x 表示文件添加可执行权限

    chmod +x 01-hello.sh

    步骤2:

    运行文件,如果文件名在当前目录,前面需要加./ 。

    ./文件名

实例导航

流程控制IF语句

test 和 [] 内置命令

exit 内置命令

  1. 流程控制IF语句

    #判断文件是否存在,存在输出 ok,不存在输出 no
    #!/bin/bash
    if ls /etc/passwd; thenecho 'ok'
    elseecho 'no'
    fi
    
  2. test 和 [] 内置命令

    # test 和 [] 示例
    #!/bin/bash
    read age
    if test $age -le 2; thenecho "婴儿"
    elif test $age -ge 3 && test $age -le 8; thenecho "幼儿"
    elif [ $age -ge 9 ] && [ $age -le 17 ]; thenecho "少年"
    elif [ $age -ge 18 ] && [ $age -le 25 ]; thenecho "成年"
    elif test $age -ge 26 && test $age -le 40; thenecho "青年"
    elif test $age -ge 41 && [ $age -le 60 ]; thenecho "中年"
    elseecho "老年"
    fi
    
  3. exit 内置命令

    #!/bin/shif [ `whoami` != "app" ];then
    echo " Please use the app user to start this shell"
    exit 1
    fi
http://www.lryc.cn/news/509567.html

相关文章:

  • 华为手机建议使用adb卸载的app
  • 论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
  • Java基础(Json和Java对象)
  • Linux 中检查 Apache Web Server (httpd) 正常运行时间的 4 种方法
  • Linux驱动开发--字符设备驱动开发
  • MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)
  • 一文彻底拿捏DevEco Studio的使用小技巧
  • R9000P键盘失灵解决办法
  • 【Linux之Shell脚本实战】编写简单计算器shell脚本
  • 【0x001D】HCI_Read_Remote_Version_Information命令详解
  • 秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行
  • python中使用selenium执行组合快捷键ctrl+v不生效问题
  • 大语言模型中的Agent;常见的Agent开发工具或框架
  • VSCode 性能优化指南:提高编码效率,减少资源占用
  • 深入理解C++ 容器类
  • 优化 invite_codes 表的 SQL 创建语句
  • springboot容器无法获取@Autowired对象,报null对象空指针问题的解决方式
  • 服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例
  • 由于这些关键原因,我总是手边有一台虚拟机
  • word无法创建工作文件,检查临时环境变量。
  • 照亮技术传播之路:构建卓越的技术文档
  • 20241225在ubuntu20.04.5下监控SSD
  • Flink定时器
  • 《算力互联互通标准体系1.0》发布,为算力互联成网发展提供指导框架
  • 视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案
  • STM32串口第一次接收数据时第一个字节丢失的问题
  • Zookeeper基本命令解析
  • RustDesk远程及自建服务器搭建教程
  • 广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!
  • Python:模拟(包含例题)