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 脚本有两种方法:
-
作为可执行程序
将上面的代码保存为 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 告诉系统说,就在当前目录找。
-
作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh /bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
shell注释
以 #
开头的行就是注释,会被解释器忽略。通过每一行加一个 #
号设置多行注释,像这样:
# 这是一个注释
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束 #####
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#
符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
':<<!
注释内容...
注释内容...
注释内容...
!
shell变量
定义变量
使用变量
特殊变量
Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。
-
定义变量
变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,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 下目录的文件名循环出来。
-
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx" echo $your_name echo ${your_name}
变量名外面的花括号是可选的,推荐给所有变量加上花括号,加花括号是为了帮助解释器识别变量的边界
已定义的变量,可以被重新定义,如:
your_name="tom" echo $your_name your_name="alibaba" echo $your_name
[注]这样写是合法的,但注意,第二次赋值的时候不能写
$
your_name=“alibaba”,使用变量的时候才加美元符($
)。 -
特殊变量
变量 含义 $0 当前脚本的文件名(包含路径) $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2 $# 传递给脚本或函数的参数个数 $* 以一个单字符串显示所有向脚本传递的参数以 “$1 $2 … $n” 的形式输出所有参数 $@ 与 $* 相同,但是使用时加引号,并在引号中返回每个参数,以 “$1” “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数 $? 上个命令的退出状态,或函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果,退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,不过,也有一些命令返回其他值,表示不同类型的错误 $$ 当前 shell 脚本的进程 ID $! 执行d 上一个后台指令的ID $- 显示 shell 使用的当前选项,与set命令功能相同 -
只读变量
使用 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字符串
字符串拼接
-
字符串拼接
在 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 和 [] 内置命令
-
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
-
单分支语法格式:
#单分支语法格式 if 条件 thencommands fi
也可以将 if 和 then 放同一行,注意 then 前必须加一个分号 ;
if 条件; thencommands fi
-
双分支语法:
if 条件; thencommands elsecommands fi
-
多分支语法:
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脚本
-
[bash执行] 方式
语法: sh [相对路径或绝对路径]/***.sh
-
[直接执行脚本文本] 方式
步骤1:
设置文件为可执行,+x 表示文件添加可执行权限
chmod +x 01-hello.sh
步骤2:
运行文件,如果文件名在当前目录,前面需要加./ 。
./文件名
实例导航
流程控制IF语句
test 和 [] 内置命令
exit 内置命令
-
流程控制IF语句
#判断文件是否存在,存在输出 ok,不存在输出 no #!/bin/bash if ls /etc/passwd; thenecho 'ok' elseecho 'no' fi
-
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
-
exit 内置命令
#!/bin/shif [ `whoami` != "app" ];then echo " Please use the app user to start this shell" exit 1 fi
相关文章:

shell脚本(全)
shell脚本概述 第一个shell脚本 shell注释 shell变量 shell位置参数 shell字符串 shell内置命令 shell命令替换 输出 流程控制IF export命令 退出脚本 运行Shell脚本 实例导航 shell脚本概述 在说什么是shell脚本之前,先说说什么是shell。 从程序员的…...
华为手机建议使用adb卸载的app
按需求自行卸载 echo 卸载智慧搜索 adb shell pm uninstall -k --user 0 com.huawei.search echo 卸载智慧助手 adb shell pm uninstall -k --user 0 com.huawei.intelligent echo 卸载讯飞语音引擎 adb shell pm uninstall -k --user 0 com.iflytek.speechsuite echo 卸载快应…...

论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 王志豪,厦门大学博士生 刘诗雨,厦门大学硕士生 内容简介 新数据的不断涌现使版本更新成为大型语言模型(LLMsÿ…...

Java基础(Json和Java对象)
定义好实体类 package com.pyb.pojo; /*** version 1.0* Author 彭彦彬* Date 2024/12/24 20:47* 注释*/ public class Person {private String username;private String password; public Person() {} public Person(String username, String password) {this.username…...
Linux 中检查 Apache Web Server (httpd) 正常运行时间的 4 种方法
注:机翻,未校。 4 Ways To Check Uptime of Apache Web Server (httpd) on Linux November 28, 2019 by Magesh Maruthamuthu We all know about the purpose of uptime command in Linux. 我们都知道 Linux 中 uptime 命令的目的。 It is used to c…...

Linux驱动开发--字符设备驱动开发
一、概述 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI, LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。 Linux 应用程序对驱动程…...

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)
MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式) 本文目录: 零、时光宝盒🌻 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒🌻 &a…...

一文彻底拿捏DevEco Studio的使用小技巧
程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴!君志所向,一往无前! 0.安装DevEco Studio DevEco Studio面向HarmonyOS应用及元服务开发者提供的集成开…...

R9000P键盘失灵解决办法
问题描述 突然,就是很突然,我买的R9000P 2024不到三个月,键盘突然都不能用了,是所有键盘按键都无效的那种。(可以使用外接键盘) 解决办法 我本科室友说的好哈,全坏全没坏。 (该解…...

【Linux之Shell脚本实战】编写简单计算器shell脚本
【Linux之Shell脚本实战】编写简单计算器shell脚本 一、Shell脚本介绍1.1 Shell脚本简介1.2 Shell脚本特点二、脚本要求三、检查本地环境3.1 本地环境规划3.2 检查本地系统3.3 检查系统内核版本四、编写脚本4.1 脚本内容4.2 脚本分析整体逻辑各功能实现使用方法4.3 执行效果五、…...

【0x001D】HCI_Read_Remote_Version_Information命令详解
目录 一、命令概述 二、命令格式及参数说明 2.12. HCI_Read_Remote_Version_Information 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Remote_Version_Information_Complete 事件 四、命令执行流程 4.1. 命令发起阶段(…...

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行
别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! 下篇更新: 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。 默认的类型别名 MyBatis的增删改查 添加 <!--int insertUs…...

python中使用selenium执行组合快捷键ctrl+v不生效问题
在执行ctrlv进行粘贴时,绑定一个页面上的元素对象(无论元素对象是否是引用过期或者是粘贴的目标文本区,但前提需要粘贴的目标文本区获取焦点)执行ctrlv后可以生效。执行粘贴组合快捷键(ctrlv)的示例代码 se…...
大语言模型中的Agent;常见的Agent开发工具或框架
大语言模型中的Agent 大语言模型中的Agent是指以大语言模型为核心驱动,具有自主理解、感知、规划、记忆和使用工具等能力,能够自动化执行复杂任务的系统.以下是一些例子: AutoGPT:它相当于一个完整的工具包,可以为各种项目构建和运行自定义AI Agent。使用OpenAI的GPT-4和…...
VSCode 性能优化指南:提高编码效率,减少资源占用
Visual Studio Code(简称VSCode)是一款广受欢迎的代码编辑器,以其强大的功能和丰富的插件生态系统著称。然而,随着项目规模的扩大和插件数量的增加,VSCode 的性能可能会受到影响。本文将介绍一系列优化措施,…...
深入理解C++ 容器类
承接Qt/C软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系! 引言 C 标准库提供了丰富的容器(container)类型,用于存…...

优化 invite_codes 表的 SQL 创建语句
-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码,6位整数,确保在有效期内…...
springboot容器无法获取@Autowired对象,报null对象空指针问题的解决方式
示例错误代码: package com.uniin.ib.provider.iot.handle;Slf4j Component public class FireStringInboundHandler extends ChannelInboundHandlerAdapter {Autowiredprivate RsFireMonitoringMapper rsFireMonitoringMapper;Autowiredprivate RsFireAlertMapper…...

服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例
服务器数据恢复环境&故障: 5台节点服务器,每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘(其中1块硬盘设置为热备盘,其他5块硬盘为数据盘)。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致…...

由于这些关键原因,我总是手边有一台虚拟机
概括 虚拟机提供了一个安全的环境来测试有风险的设置或软件,而不会影响您的主系统。设置和保存虚拟机非常简单,无需更改主要设备即可方便地访问多个操作系统。运行虚拟机可能会占用大量资源,但现代 PC 可以很好地处理它,为实验和工作流程优化提供无限的可能性。如果您喜欢使…...

python打卡训练营打卡记录day41
知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch归一化层…...
Java 数据处理 - 数值转不同进制的字符串(数值转十进制字符串、数值转二进制字符串、数值转八进制字符串、数值转十六进制字符串)
一、数值转十进制字符串 调用 String.valueOf() int num 123;String decStr String.valueOf(num);System.out.println(decStr);# 输出结果123调用 Integer.toString(),指定进制 int num 123;String decStr Integer.toString(num);System.out.println(decStr)…...
PHP实战:安全实现文件上传功能教程
HTML部分: <form action"upload.php" method"post" enctype"multipart/form-data"> <input type"file" name"userfile"> <input type"submit" value"上传"> <…...
相机定屏问题分析四:【cameraserver 最大request buffer超标】后置视频模式预览定屏闪退至桌面
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机定屏问题分析三:【配流ConfigStream失败】外屏打开相机视频照片人像来回切换后,相机页面卡死,点击没反应9055522 这一篇我们开始讲: 相机定屏问题分析四:【cameraserver 最大request buffer超…...
LeetCode Hot100(矩阵)
73. 矩阵置零 这边提供nm的做法以及更少的思路,对于nm的做法,我们只需要开辟标记当前行是否存在0以及当前列是否存在0即可,做法如下 class Solution {public void setZeroes(int[][] matrix) {int arr[]new int[matrix.length];int brr[]ne…...

OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局
【AI安全警钟再响,这次主角竟是OpenAI?】 当全球AI圈还在为Claude 4的“乖巧”欢呼时,OpenAI最新模型o3却以一场惊心动魄的“叛逃”测试引爆舆论——在100次关机指令测试中,o3竟7次突破安全防护,甚至篡改底层代码阻止系…...
Vue 3.0 中的路由导航守卫详解
1. 路由导航守卫 1.1. 全局前置守卫 Vue-Router 提供的导航守卫主要用来守卫路由的跳转或取消。它们可以植入到全局、单个路由或组件级别。 全局前置守卫可以使用 router.beforeEach 注册: const router createRouter({... });router.beforeEach((to, from) &g…...

E. Melody 【CF1026 (Div. 2)】 (求欧拉路径之Hierholzer算法)
E. Melody 思路 将所有出现过的音量和音高看作一个点,一个声音看作一条边,连接起来。那么很容易知道要找的就是图上的一条欧拉路径(类似一笔画问题) 又已知存在欧拉路径的充要条件为:度数为奇数的点的个数为0或者2个…...
AI绘画提示词:从零开始掌握Prompt Engineering的艺术
文章目录 什么是AI绘画提示词?提示词的基本结构主体描述场景/背景风格指定技术参数负面提示人物肖像模板风景模板 高级技巧权重调整混合风格颜色控制情绪氛围 常见问题与解决方法手部变形问题构图不理想风格不够突出 提示词示例库科幻场景奇幻人物静物画 结语 在当今…...

STM32 -- USB虚拟串口通信
本篇操作: 通过CubeMX Keil,配置STM32作为USB设备端,与电脑上位机进行通信(CDC);通用带USB功能的 STM32 芯片 (如F1、F4等,系统时钟配置不同,代码通用)。 目录 一、 S…...