设计网站属于什么专业,临淄百度信息港网,游戏开发公司排行榜前十名,网站规划与制作shell脚本概述
第一个shell脚本
shell注释
shell变量
shell位置参数
shell字符串
shell内置命令
shell命令替换
输出
流程控制IF
export命令
退出脚本
运行Shell脚本
实例导航 shell脚本概述 在说什么是shell脚本之前#xff0c;先说说什么是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 ((i0; i10; 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扩展名为 shsh代表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.shlinux 系统会去 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
注释内容...
注释内容...
注释内容...
EOFEOF 也可以使用其他符号:
:
注释内容...
注释内容...
注释内容...
:!
注释内容...
注释内容...
注释内容...
!shell变量 定义变量
使用变量
特殊变量
Shell Script是一种弱类型语言使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储这个变量归当前的Shell所有任何子进程都不能访问本地变量。这些变量与环境变量不同环境变量被存储在另一内存区叫做用户环境区这块内存中的变量可以被子进程访问。 定义变量 变量是任何一种编程语言都必不可少的组成部分变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型直接赋值就可以shell 变量也遵循这个规则 在 bash shell 中每一个变量的值都是字符串无论你给变量赋值时有没有使用引号值都会以字符串的形式存储。 这意味着bash shell 在默认情况下不会区分变量类型即使你将整数和小数赋值给变量它们也会被视为字符串这一点和大部分的编程语言不同。 当然如果有必要你也可以使用 shell declare 关键字显式定义变量的类型但在一般情况下没有这个需求shell 开发者在编写代码时自行注意值的类型即可 shell 支持以下三种定义变量的方式 variablevalue
variablevalue
variablevalue需要注意一下几点 • 变量名称和等号之间不能有空格 • 变量名由数字、字母、下划线组成且必须以字母或者下划线开头 • 不能使用 shell 里的关键字 除了显式地直接赋值还可以用语句给变量赋值如 for file in ls /etc
#或
for file in $(ls /etc)以上语句将 /etc 下目录的文件名循环出来。 使用变量 使用一个定义过的变量只要在变量名前面加美元符号即可如 your_nameqinjx
echo $your_name
echo ${your_name}变量名外面的花括号是可选的推荐给所有变量加上花括号加花括号是为了帮助解释器识别变量的边界 已定义的变量可以被重新定义如 your_nametom
echo $your_name
your_namealibaba
echo $your_name[注]这样写是合法的但注意第二次赋值的时候不能写$your_name“alibaba”使用变量的时候才加美元符$。 特殊变量 变量 含义 $0 当前脚本的文件名包含路径 $nn≥1 传递给脚本或函数的参数。n 是一个数字表示第几个参数。例如第一个参数是 $1第二个参数是 $2 $# 传递给脚本或函数的参数个数 $* 以一个单字符串显示所有向脚本传递的参数以 “$1 $2 … $n” 的形式输出所有参数 $ 与 $* 相同但是使用时加引号并在引号中返回每个参数以 “$1” “ 2 … 2 … 2…n” 的形式输出所有参数 $? 上个命令的退出状态或函数的返回值。所谓退出状态就是上一个命令执行后的返回结果退出状态是一个数字一般情况下大部分命令执行成功会返回 0失败返回 1不过也有一些命令返回其他值表示不同类型的错误 $$ 当前 shell 脚本的进程 ID $! 执行d 上一个后台指令的ID $- 显示 shell 使用的当前选项与set命令功能相同 只读变量 使用 readonly 命令可以将变量定义为只读变量只读变量的值不能被改变。下面的例子尝试更改只读变量结果报错 #!/bin/bashmyUrlhttps://www.google.com
readonly myUrl
myUrlhttps://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字符串变量
①单引号
#单引号变量只能原样输出变量 ${变量名称}无效
#单引号中不能出现一个单独的单引号转义也不可以
vartest ②双引号
#双引号变量变量 ${变量名称}有效
#可出现转义符
varmy name is ${name}③拼接字符串
#中间无任何之类的字符
namethis is my name;
#等效
namethis is my name;
#等效
namethis is my namenamethis is my nam;
#等效
name‘this is my name;
#等效
namethis 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} #输出 this3长句换行
在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/bashnameshell
urlhttp://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 $str5shell内置命令 bash shell 中直接可用的内建命令 命令 作用echo将指定字符串输出到 STDOUTexport 设置子 shell 进程可用的变量read从 STDIN 读取一行数据并将其赋给一个变量exit强制 shell 以指定的退出状态码退出
test 和 [] 内置命令 test 和 [] 内置命令 test 是 shell 内置命令用来检测某个条件是否成立test 命令也可以简写为 [] 两者是等价的两者通常和 if 语句一起使用它有很多选项可以进行数值、字符串和文件三个方面的检测。两者命令的用法为 #用法1
test expression#用法2
[ expression ]需要注意 [] 和 expression 之间的空格这两个空格是必须的否则会导致语法错误。[] 的写法更加简洁比 test 使用频率高 shell命令替换 shell 命令替换是指将命令的输出结果赋值给某个变量。比如在某个目录中输入 ls 命令可查看当前目录中所有的文件但如何将输出内容存入某个变量中呢这就需要使用命令替换了这也是 shell 编程中使用非常频繁的功能
shell 中有两种方式可以完成命令替换一种是反引号 一种是 $() 使用方法如下
variablecommands
variable$(commands)variable 是变量名commands 是要执行的命令commands 可以只有一个命令也可以有多个命令多个命令之间以分号 ; 分隔
例如date 命令用来获得当前的系统时间使用命令替换可以将它的结果赋值给一个变量
#!/bin/bash
btimedate #开始时间使用替换
sleep 10s #休眠20秒
etime$(date) #结束时间使用$()替换echo begin time: $btime
echo end time: $etime原则上讲 和 $() 这两种变量替换的形式是等价的但也有各自的优缺点如下
• 反引号毕竟看起来像单引号有时候会对查看代码造成困扰而使用 $() 就相对清晰能有效避免这种混乱
• $() 支持嵌套反引号不支持
• $() 仅在 bash Shell 中有效而反引号可在多种 shell 中使用兼容性好
建议如果我们的脚本不需要跨平台想便于查看或是有嵌套需求的可用 $()如果没有嵌套需求希望脚本的平台兼容性强则可以用反引号 输出 1echo
描述仅用于字符串的输出没有使用printf作为输出的移植性好建议使用printf
2printf
描述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赋予程序的环境变量。
列出当前所有的环境变量
[rootlocalhost ~]# export -p
declare -x CVS_RSHssh
declare -x G_BROKEN_FILENAMES1
declare -x HISTSIZE1000
declare -x HOME/home/zszc
declare -x HOSTNAMElocalhost
declare -x INPUTRC/etc/inputrc
declare -x KDEDIR/usr
declare -x KDE_IS_PRELINKED1
declare -x KDE_NO_IPV61
declare -x LANGzh_CN.UTF-8
declare -x LC_ALLzh_CN.GBK
declare -x LESSOPEN|/usr/bin/lesspipe.sh %s
declare -x LOGNAMEroot
declare -x LS_COLORSno00:fi00:di01;34:ln01;36:pi40;33:so01;35:bd40;33;01:cd40;33;01:or01;05;37;41:mi01;05;37;41:ex01;32:*.cmd01;32:*.exe01;32:*.com01;32:*.btm01;32:*.bat01;32:*.sh01;32:*.csh01;32:*.tar01;31:*.tgz01;31:*.arj01;31:*.taz01;31:*.lzh01;31:*.zip01;31:*.z01;31:*.Z01;31:*.gz01;31:*.bz201;31:*.bz01;31:*.tz01;31:*.rpm01;31:*.cpio01;31:*.jpg01;35:*.gif01;35:*.bmp01;35:*.xbm01;35:*.xpm01;35:*.png01;35:*.tif01;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定义环境变量
[rootlocalhost ~]# export laolao#定义环境变量
[rootlocalhost ~]# export -p
declare -x CVS_RSHssh
declare -x G_BROKEN_FILENAMES1
declare -x HISTSIZE1000
declare -x HOME/home/zszc
declare -x HOSTNAMElocalhost
declare -x INPUTRC/etc/inputrc
declare -x KDEDIR/usr
declare -x KDE_IS_PRELINKED1
declare -x KDE_NO_IPV61
declare -x SSH_ASKPASS/usr/libexec/openssh/gnome-ssh-askpass
declare -x SSH_CLIENT192.168.113.206 17527 22
declare -x SSH_CONNECTION192.168.113.206 17527 192.168.44.33 22
declare -x SSH_TTY/dev/pts/1
declare -x TERMvt100
declare -x USERroot
declare -x aecho hollo li
declare -x becho hollo qiang
declare -x cecho huahua
declare -x laolao
declare -x testvalue1定义环境变量赋值
[rootlocalhost ~]# export laolao2
[rootlocalhost ~]# export -p
declare -x CVS_RSHssh
declare -x G_BROKEN_FILENAMES1
declare -x HISTSIZE1000
declare -x HOME/home/zszc
declare -x HOSTNAMElocalhost
declare -x INPUTRC/etc/inputrc
declare -x KDEDIR/usr
declare -x KDE_IS_PRELINKED1
declare -x KDE_NO_IPV61
declare -x LANGzh_CN.UTF-8
declare -x LC_ALLzh_CN.GBK
declare -x TERMvt100
declare -x USERroot
declare -x aecho hollo li
declare -x becho hollo qiang
declare -x cecho huahua
declare -x laolao2
declare -x testvalue1
[rootlocalhost ~]# ♦得出的结论是
•1、执行脚本时是在一个子shell环境运行的脚本执行完后该子shell自动退出
•2、一个shell中的系统环境变量才会被复制到子 shell中用export定义的变量
•3、一个shell中的系统环境变量只对该shell或者它的子shell有效该shell结束时变量消失 并不能返回到父shell中。
•4、不用export定义的变量只对该shell有效对子shell也是无效的。
实例
实例1
[rootlocalhost ~]# vim liqiang.sh
export aecho hollo li
becho hollo qiang
./liqiang-3.sh
[rootlocalhost ~]# vim liqiang-3.sh
echo 看看这里调用几次
echo 调用一次就对了
echo $a
echo $b
bash输出结果:
[rootlocalhost ~]# ./liqiang.sh
看看这里调用几次
调用一次就对了
echo hollo li实例2在子shell中定义变量在父shell中调用
[rootlocalhost ~]# vim liqiang-3.sh
echo 看看这里调用几次
echo 调用一次就对了
echo $a
echo $b
cecho huahua
bash
~
rootlocalhost ~]# vim liqiang.sh
export aecho hollo li
export becho hollo qiang
./liqiang-3.sh
echo $c运行结果
[rootlocalhost ~]# ./liqiang.sh
看看这里调用几次
调用一次就对了
echo hollo li
echo hollo qiang
#c没有被调用
[rootlocalhost ~]# 实例3在子shell中用export导出依然不会被父shell调用c
[rootlocalhost ~]# vim liqiang-3.sh
echo 看看这里调用几次
echo 调用一次就对了
echo $a
echo $b
export cecho huahua
bash运行结果
[rootlocalhost ~]# ./liqiang.sh
看看这里调用几次
调用一次就对了
echo hollo li
echo hollo qiang
[rootlocalhost ~]# 退出脚本 退出命令exit
在退出脚本时使用不同的错误码这样可以根据错误码来判断发生了什么错误。
在绝大多数 shell 脚本中exit 0 表示执行成功exit 1 表示发生错误。 对错误与错误码进行一对一的映射这样有助于脚本调试。
if [ whoami ! weblogic ];then
echo Please use the weblogic user to start this shell
exit 1
fi1删除目录/文件 运行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
fitest 和 [] 内置命令 # 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 老年
fiexit 内置命令 #!/bin/shif [ whoami ! app ];then
echo Please use the app user to start this shell
exit 1
fi