版本说明
表 2 Shell 版本列表
Shell类别 易学性 可移植性 编辑性 快捷性
Boume Shell (sh) 容易 好 较差 较差
Korn Shell (ksh) 较难 较好 好 较好
Boume Again (Bash) 难 较好 好 好
POSIX Shell (psh) 较难 好 好 较好
C Shell (csh) 较难 差 较好 较好
TC Shell (tcsh) 难 差 好 好
Z Shell (zsh) 难 差 好 好
hello word
echo [选项] [输出内容]
- 选项:
-e:支持反斜线控制的字符转换(具体参见表 1)
-n:取消输出后行末的换行符号(内容输出后不换行)
[root@VM_0_7_centos demo]# echo hello wrod
hello wrod
[root@VM_0_7_centos demo]# echo -n hello
hello[root@VM_0_7_centos demo]#
-e 参数
控制字符 作 用
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e Esc键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\Onnn 按照八进制 [ASCII](/c/ascii/) 码表输出字符。其中 0 为数字 0,nnn 是三位八进制数
\xhh 按照十六进制 ASCH 码表输出字符。其中 hh 是两位十六进制数
sh 脚本结构
第一行"#!/bin/bash"
以"#"开头的一般都是注释,不过这句话是例外的。这句话的作用是标称我以下写的脚本使用的是 Bash 语法,只要写的是基于 Bash 的 Shell 脚本都应该这样开头。这就像在 HTML 语言中嵌入 PHP 程序时,PHP 程序必须用?>包含起来。
第二行:注释
在 Shell 脚本中,除"#!/bin/bash"这行外,其他行只要以"#"开头的都是注释。第二行就是我们这个脚本的注释,建议大家在写程序时加入清晰而详尽的注释,这些都是建立良好编程规范时应该注意的问题。
第三行:程序的主体
既然 echo 命令可以直接打印"c.biancheng.net",那么将这句话放入 Shell 脚本中也是可以正确执行的,因为 Linux 的命令是可以直接在脚本中执行的
运行方式
- 赋予执行权限,直接运行
chmod 755 hello.sh
/root/sh/hello.sh
相对路径
./hello.sh
- 通过Bash调用运行脚本
bash hello.sh
查看历史命令
history [选项] [历史命令保存文件]
-c:清空历史命令;
-w:把缓存中的历史命令写入历史命令保存文件中。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件 ~/.bash_history 中;
修改历史记录条数100
vim /etc/profile
…省略部分输出…
HISTSIZE=1000
…省略部分输出…
大家需要注意,每个用户的历史命令是单独保存的,所以每个用户的家目录中都有 .bash_history 这个历史命令文件
调用历史命令
1.上下方向按键触发
2.使用"!!"重复执行上一条命令。
3.使用"!n"重复执行第 n 条历史命令。
4.使用"!$"重复上一条命令的最后一个参数。
给命令设置别名
alias 别名='原命令'
命令执行时的顺序
第一顺位执行用绝对路径或相对路径执行的命令。
第二顺位执行别名。
第三顺位执行 Bash 的内部命令。
第四顺位执行按照 $PATH 环境变量定义的目录査找的第一条命令。
别名只是临时生效,一旦注销或重启系统,这个别名就马上消失了。为了让这个别名永久生效,可以把别名写入环境变量配置文件
vi /root/.bashrc
写在这里永久生效
快捷键
你还记得ctrl+s,我的shell动不了。其实你调用的是锁屏
Ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,则在想要把光标移动到命令行开头时使用
Ctrl+E 把光标移动到命令行结尾
Ctrl+C 强制中止当前的命令
Ctrl+L 淸屏,相当于 clear 命令
Ctrl+U 刪除或剪切光标之前的命令。假设输入了一行很长的命令,无须使用退格键一个一个字符地刪除, 使用这个快捷键会更加方便
Ctrl+K 删除或剪切光标之后的内容
Qrl+Y 粘贴 Ctrl+U 或 Ctrl+K 剪切的内容
Ctrl+R 在历史命令中搜索,按下 Ctrl+R 组合键之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
Ctrl+D 退出当前终端
Ctrl+Z 暂停,并放入后台。这个快捷键涉及工作管理的内容,我们会在后续中详细介绍
Ctrl+S 暂停屏幕输出
Ctrl+Q 恢复屏幕输出
Shell的输入重定向和输出重定向
0 标准输入
1 标准输出
2 标准错误输出
输出重定向
- 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备中
- 命令 >> 文件 以追加的方式,把命令的正确输- 出输出到指定的文件或设备中
标准错误输出重定向
- 错误命令2 > 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备中
- 错误命令2 >> 文件 以追加的方式,把命令的错误输出输出到指定的文件或设备中
正确输出和错误输出同时保存
- 命令 > 文件2>&1 以捜盖的方式,把正确输出和错误输出都保存到同一个文件中
- 命令 >> 文件2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件中
- 命令&>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
- 命令&>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件中
- 命令>>文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中
总结:
>
覆盖形式,
>>
追加,
&1
第一个参数,以此类推。
&
所有操作一起
输入重定向
wc [选项] [文件名]
选项:
-c:统计字节数;
-w:统计单词数;
-l:统计行数;
自定义重定向符合
wc << "a"
输入只会,最后输入a表示结束
多命令顺序执行
- ; 命令1 ; 命令2 多条命令顺序执行,命令之间没有任何逻辑关系
- && 命令1 && 命令2 如果命令1正确执行(?≠0),则命令2不会执行
- II 命令1 || 命令2 如果命令1执行不正确(?=0),则命令2不会执行
"&&"逻辑与,";"多命令顺序执行,"||"逻辑或
grep [选项] "搜索内容" 文件名
-A 数字:列出符合条件的行,并列出后续的 n 行;
-B 数字:列出符合条件的行,并列出前面的 n 行;
-c:统计找到的符合条件的字符串的次数;
-i:忽略大小写;
-n:输出行号;
-v:反向査找;
--color=auto:搜索出的关键字用颜色显示;
管道符使用"丨"代表。
用管道符连接的命令,命令 1 的正确输出作为命令 2 的操作对象
。这里需要注意,命令 1 必须有正确输出,而命令 2 必须可以处理命令 1 的输出结果
;而且命令 2 只能处理命令 1 的正确输出,而不能处理错误输出
[root@localhost ~]# netstat -an | grep "ESTABLISHED"
#查询一下本地所有网络连接,提取包含 ESTABLISHED(已建立连接)的行
#就可以知道我们的服务器上有多少已经成功连接的网络连接
[root@localhost ~]# netstat -an | grep "ESTABLISHED" | wc-l
#如果想知道具体的网络连接数量,就可以再使用wc命令统计行数
Shell通配符用
? 匹配一个任意字符
* 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如,[abc] 代表一定匹配一个字符,或者是 a,或者是 b,或 者是 c
[-] 匹配中括号中任意一个字符,- 代表一个范围。例如,[a-z] 代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9] 代表匹配一个不是数字的字符
单引号、双引号和反引号
被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义
而被双引号括起来的字符中,"$"、"\"和反引号 是拥有特殊含义的,"$"代表引用变量的值
反引号代表引用命令
小括号和大括号
小括号和大括号主要区别在于:
() 执行一串命令时,需要重新开启一个子 Shell 来执行。
{} 执行一串命令时,在当前 Shell 中执行。
() 和 {} 都是把一串命令放田括号里面,并且命令之间用";"隔开。
() 最后一条命令可以不用分号。
{} 最后一条命令要用分号。
{} 的第一条命令和左括号之间必须有一个空格。
() 里的各命令不必和括号有空格。
() 和 {} 中括号里面的某条命令的重定向只影响该命令,但括号外的重定向则会影响到括号里的所有命令。
root@localhost ~]# name=sc #在父 Shell 中定义 name 的值是 sc
[root@localhost ~]# (name=liming;echo $name)
liming
#如果用()括起来一串命令,那么这些命令都可以执行
#给name变量重新赋值,但是这个值只在子Shell中
[root@localhost ~]# echo $name
sc
#父Shell中name的值还是sc,而不是liming
[root@localhost ~]#{ name=liming;echo $name;} liming
#但是用大括号来进行一串命令的执行时,name变量的修改是直接在父Shell中进行的
#注意大括号的格式
[root@localhost ~]# echo $name
liming
#name变量的值已经被修改了
变量
变量名可以由字母、数字和下画线组成,但是不能以数字开头。如果变量名是"2name",则是错误的。
在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
变量用等号"="连接值,"="左右两侧不能有空格。这是 Shell 语言特有的格式要求。在绝大多数的其他语言中,"="左右两侧是可以加入空格的。但是在 Shell 中命令的执行格式是"命令 [选项] [参数]",如果在"="左右两侧加入空格,那么 Linux 会误以为这是系统命令,是会报错的。
变量值中如果有空格,则需要使用单引号或双引号包含,如 test="hello world!"。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。
在变量值中,可以使用转义符""。
如果需要増加变量值,那么可以进行变量叠加。 例如:
变量叠加可以使用两种格式:"{变量名}。
[root@localhost ~]#test=123
[root@localhost ~]#test="$test"
456
[root@localhost ~]# echo $test
123456
#叠加变量test,变量值变成了123456
[root@localhost ~]#test=${test}789
[root@localhost ~]# echo $test
123456789
#再叠加变量test,变量值变成了123456789
- 如果要把命令的执行结果作为变量值赋予变量,则需要使用反引号或 $() 包含命令
[root@localhost ~]# test=$(date)
[root@localhost ~]# echo Stest
2013年10月21日 星期一20:27:50 CST
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
- 环境变量名建议大写,便于区分。
变量查看
set [选项]
-u:如果设定此选项,则在调用未声明的变量时会报错(默认无任何提示);
-x:如果设定此选项,则在命令执行之前会先把命令输出一次;
变量删除
unset 变量名
Shell环境变量,环境变量是全局变量,而用户自定义变量是局部变量
而环境变量会在当前 Shell 和这个 Shell 的所有子 Shell 中生效
。如果把环境变量写入相应的配置文件
,那么这个环境变量就会在所有的 Shell 中生效。
- 环境变量设置, export age="18"
- set 既可以查询所有的变量,也可以查询环境变量
- unset 删除命令
PATH变量
程序脚本要想在Linux 中运行,需要使用绝对路径或相对路径指定这个脚本所在的位置。但是为什么系统命令都没有指定路径而是直接执行的?比如,ls 命令并没有输入"/bin/ls"来执行,而是直接执行"ls"命令。这就是 PATH 环境变量的功能了。
- 查看环境变量,类似window 的环境变量
echo $PATH
PATH 变量的值是用":"分隔的路径,这些路径就是系统查找命令的路径。
+自己写的脚本复制到 PATH 变量定义的路径中也可以 - 我们只要把程序脚本复制到 PATH 变量定义的任意路径中,比如 /bin/ 目录下,以后这个脚本就可以直接执行了,不用再指定绝对路径或相对路径。那么有时会搞不清系统命令和自己写的程序(其实笔者很反对改变系统目录的结构的)
通过变量的叠加就可以实现了
`
PATH="$PATH":/root/sh
在变量PATH的后面,加入/root/sh目录
`
永久生效
查看PATH:echo $PATH
以添加mongodb server为列
修改方法一:
export PATH=/usr/local/mongodb/bin:$PATH
//配置完后可以通过echo $PATH查看配置结果。
生效方法:立即生效
有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置
用户局限:仅对当前用户
修改方法二:
通过修改.bashrc文件:
vim ~/.bashrc
//在最后一行添上:
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:(有以下两种)
1、关闭当前终端窗口,重新打开一个新终端窗口就能生效
2、输入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用户局限:仅对当前用户
修改方法三:
通过修改profile文件:
vim /etc/profile
/export PATH //找到设置PATH的行,添加
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户
修改方法四:
通过修改environment文件:
vim /etc/environment
在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/usr/local/mongodb/bin”
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户
位置参数变量
1 代表第 1 个参数,$2 代表第 2 个参数,依次类推
$n n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
$* 这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数
[root@localhost ~]# cd sh/
[raot@localhost sh]# [vi](http://c.biancheng.net/vi/) count.sh
#!/bin/bash
num1=$1
#给num1变量赋值是第一个参数
num2=$2
#给num2变量赋值是第二个参数
sum=$(($num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值
chmod 777 count.sh
sh count.sh 10 20
30
预定义变量
! 后台运行的最后一个进程的进程号(PID)
[root@localhost sh]# [vi](http://c.biancheng.net/vi/) variable.sh
#!/bin/bash
echo "The current process is $$"
#输出当前进程的PID
#这个PID就是variable.sh脚本执行时生成的进程的PID
find /root -name hello.sh &
#使用find命令在/root目录下査找hello.sh文件
#符号"&"的意思是把命令放入后台执行
echo "The last one Daemon process is $!"
#输出这个后台执行命令的进程的PID,也就是输出find命令的PID
read命令详解:接收键盘或其它文件描述符的输入
read [选项] [变量名]
-p "提示信息":在等待read输入时,输出提示信息;
-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间;
-n 字符数:read命令只接收指定的字符数就会执行;
-s: 隐藏输入的数据,适用于机密信息的输入;
变量名:
变量名可以自定义。如果不指定变量名,则会把输入保存到默认变量REPLY中;
如果只提供了一个变量名,则将整个输入行赋予该变量;
如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字;
#!/bin/bash
read -t 30 -p "请输入你的名:" name
echo "你的名是$name"
read -s -t 30 -p "请输入密码:" password
echo -e "n"
echo "你的密码:$password"
read -n 1 -t 30 -p "你的性别是[男/女]:" sex
echo -e "\n"
echo "Sex is $sex"
使用declare声明变量类型
declare [+/-] [选项] 变量名
-:给变量设定类型属性;
+:取消变量的类型属性;
-a:将变量声明为数组型;
-i:将变量声明为整数型(integer);
-r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性;
-x:将变量声明为环境变量;
-p:显示指定变量的被声明的类型;
其实也可以使用 declare 命令把变量声明为环境变量,它和 export 命令的作用是一样的。
只读属性
一旦给变量设定了只读属性,那么这个变量既不能修改变量的值,也不能删除变量,甚至不能使用"+r"选项取消只读属性
使用expr或let数值运算工具
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意"+"号左右两侧必须有空格
[root@localhost ~]# echo $dd
使用"[运算式]"方式运算
优先级 运算符 说 明
13 -,+ 单目负、单目正
12 !,~ 逻辑非、按位取反或补码
11 *, /, % 乘、除、取模
10 +, - 加、减
9 <<, >> 按位左移、按位右移
8 <=, >=, <, > 小于或等于、大于或等于、小于、大于
7 == ,!= 等于、不等于
6 & 按位与
S ^ 按位异或
4 | 按位或
3 && 逻辑与
2 II 逻辑或
1 =,+=,•=,*=,/=,%=,&=, |=, <<=, >>= 赋值、运算且赋值
source命令:使环境变量配置文件强制生效
source 配置文件
source -/.bashrc
Shell环境变量配置文件及其分类
在 Linux 系统登录时主要生效的环境变量配置文件有以下 5 个:
/etc/profile。
/etc/profile.d/*.sh。
~/.bash_profile。
-/.bashrc。
/etc/bashrc。
sed
sed [选项] '[动作]' 文件名
sed 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,则连文件都没有),而是把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。
-n:一般 sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过 sed 命令处理的行输出到屏幕上;
-e: 允许对输入数据应用多条 sed 命令编辑;
-f 脚本文件名:从 sed 脚本中读入 sed 操作。和 awk 命令的 -f 选项非常类似;
-r:在 sed 中支持扩展正则表达式;
-i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作;
a \:追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;
c \:行替换,用c后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结;
i \:插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;
d:删除,删除指定的行;
P:打印,输出指定的行;
s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和Vim中的替换格式类似);
字符串替换
"c"动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用"s"动作了。"s"动作的格式如下:
sed's/旧字符串/新字符串/g' 文件名
test命令:条件判断,检查某条件是否成立
-b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录文件为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,井且是否为普通文件(是普通文件为真)
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真〉
-p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件 判断该文件是否存在,并且是否为非空(非空为真)
-S 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真〉
按照文件权限进行判断
-r 文件 判断该文件是否存在,并且是否拥有读权限(有读权限为真)
-w 文件 判断该文件是否存在,并且是否拥有写权限(有写权限为真)
-x 文件 判断该文件是否存在,并且是否拥有执行权限(有执行权限为真)
-u 文件 判断该文件是否存在,并且是否拥有SUID权限(有SUID权限为真)
-g 文件 判断该文件是否存在,并且是否拥有SG1D权限(有SGID权限为真)
-k 文件 判断该文件是否存在,并且是否拥有SBIT权限(有SBIT权限为真)
两个文件之间进行比较
文件 1 -nt文件 2 判断文件1的修改时间是否比文件2的新(如果新则为真)
文件 1 *ot文件 2 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件 1 -ef 文件 2 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个 判断用于判断硬链接是很好的方法
两个整数之间进行比较
整数1 -eq 整数 2 判断整数 1 是否和整数 2 相等(相等为真)
整数1 -ne 整数 2 判断整数 1 是否和整数 2 不相等(不相等为真)
整数1 -gt 整数 2 判断整数 1 是否大于整数 2 (大于为真)
整数1 -lt 整数 2 判断整数 1 是否小于整数 2(小于为真)
整数1 -ge 整数 2 判断整数 1 是否大于等于整数 2 (大于等于为真)
整数1 -le 整数 2 判断整数 1 是否小于等于整数 2(小于等于为真
字符串判断
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断宇符串是否为非空(非空返回真)
字串 1 = 字串 2 判断字符串 1 是否和字符串 2 相等(相等返回真)
字串 1 != 字串 2 判断字符串 1 是否和字符串 2 不相等(不相等返回真
多重条件判断
判断 1 -a 判断 2 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真
判断 1 -o 判断 2 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真
! 判断 逻辑非,使原始的判断式取反
[-n "$aa" -a "$aa" -gt 23] && echo "yes" || echo "no"
意,"!"和"-n"之间必须加入空格,否则会报错。
条件
if [条件判断式];then
程序
fi
例如
#!/bin/bash
#统计根分区的使用率
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d"%"-f1)
#把根分区使用率作为变量值赋予变量rate
if [$rate -ge 80]
#判断rate的值,如果大于等于80,则执行then程序
then
echo 'Warning! /dev/sda3 is full!!"
#打印警告信息。在实际工作中,也可以向管理员发送邮件
fi
多个条件
if [条件判断式]
then
当条件判断式成立时,执行的程序
else
当条件判断式不成立时,执行的另一个程序
fi
多分支
if[ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [条件判断式2]
then
当条件判断式2成立时,执行程序2
…省略更多条件...
else
当所有条件都不成立时,最后执行此程序、
fi
算术比较运算符
num1-eq num2 等于 [ 3 -eq mynum ]
num1-lt num2 小于 [ 3 -lt mynum ]
num1-gt num2 大于 [ 3 -gt mynum ]
demo例子,删除指定文件夹下的文件
#!/bin/bash
list=$(ls /root/demo/a2)
for i in $list;do
filea=/root/demo/a1/${i}
if [ -f $filea ];then
#echo $filea'文件存在,可删除'
rm -rf $filea
if [ $? -eq 0 ]; then
echo "$filea 删除成功"
echo "删除文件${filea}" >> /root/demo/del.log
fi
fi
don
#! /bin/bash
#清理今天所产生的导出文件
time1=$(date "+%Y-%m-%d");
exportpath="/data/wwwroot/$time1/";
echo $exportpath;
if [ -d $exportpath ];then
rm -rf $exportpath;
if [ $? -eq 0 ];then
echo "删除文件夹$exportpath" >> /var/demo/rm_export_dir_success.log;
fi
else
echo "文件夹不存在" >> /var/demo/rm_export_dir_error.log;
fi
Shell case语句
case $变量名 in
"值 1")
;;
如果变量的值等于值1,则执行程序1,值
2")
如果变量的值等于值2,则执行程序2
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#!/bin/bash
#判断用户输入
read -p "Please choose yes/no: " -t 30 cho
#在屏幕上输出"请选择yes/no",然后把用户选择赋予变量cho
case $cho in
#判断变量cho的值
"yes")
#如果是yes
echo "Your choose is yes!"
#则执行程序1
;;
"no")
#如果是no
echo "Your choose is no!"
#则执行程序2
;;
*)
#如果既不是yes,也不是no
echo "Your choose is error!"
#则执行此程序
;;
esac
Shell for循环及用法
for 变量 in 值1 值2 值3…
do
程序
done
for ((初始值;循环控制条件;变量变化))
do
程序
done
while循环及其用法
while [条件判断式]
do
程序
done
#!/bin/bash
#从1加到100
i=1
s=0
#给变量i和s赋值
while [$i -le 100]
#如果变量的值小于等于100
,则执行循环
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is: $s"
ntil循环及其用法
再来看看 unti 循环,和 while 循环相反,只要条件判断式不成立,则进行循环,并执行循环程序;一旦条件判断式成立,则中止循环。语法如下:
until [条件判断式]
do
程序
done
#!/bin/bash
#从1加到100
i=1
s=0
#给变量i和s赋值
until [$i-gt 100]
#循环,直到变量i的值大于100,就停止循环
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is: $s"
exit流程控制语句及用法
exit [返回值]
如果在 exit 之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询 $? 这个变量来査看返回值。
如果 exit 之后没有定义返回值,则脚本执行之后的返回值是执行 exit 语句之前最后执行的一条命令的返回值。写一个 exit 语句的例子: