shell基础学习笔记
2022-06-17 10:54:34 1 举报
AI智能生成
shell基础学习笔记
作者其他创作
大纲/内容
Bourne Shell(/usr/bin/sh或/bin/sh)Bourne Again Shell(/bin/bash)C Shell(/usr/bin/csh)K Shell(/usr/bin/ksh)Shell for Root(/sbin/sh) 等
类型种类
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell如: #!/bin/sh #!/bin/bash
类型格式
类型
./test.sh(注意文件的执行权限)
直接运行,脚本中首行需写解释器信息
/bin/sh test.sh
直接运行解释器,其参数就是 shell 脚本的文件名这种方式脚本中不需要在第一行指定解释器信息,写了也没用
运行 Shell 脚本方法
概述
会被解释器忽略的语句
以#号开头
单行注释
每行加#号
:<<EOF注释内容...注释内容...注释内容...EOF
:<<'注释内容...注释内容...注释内容...'
:<<!注释内容...注释内容...注释内容...!
多行注释
注释
首字母不能以数字开头的英文字母,数字和下划线
中间不能有空格,可以使用下划线 _
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
命名规则
局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量类型
如 a=\"yohu!\"
直接赋值注意:变量名和等号中间不能有空格
for file in `ls /etc`或for file in $(ls /etc)
如:将 /etc 下目录的文件名循环出来。
语句赋值、
变量赋值
如 a=\"yohu!\"echo $aecho ${a}
使用一个定义过的变量,需要在变量名前面加美元符号花括号加不加都行
使用变量
运行结果script.sh: line 9: a: readonly variableExited with error status 1
如:a=\"qwer\"readonly aa=\"qw\"
使用 readonly 命令可以将变量定义为只读变量
只读变量
如:a=\"qw\"unset aecho ${a}结果无输出
使用 unset 命令可以删除变量
删除变量
shell变量
字符串可以用单引号,也可以用双引号,也可以不用引号
第一个字符的索引值为0
索引
如a='qwer qwer'
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
单引号字符串的限制
单引号
如a=\"qw\"str=\"***\\\"${a}\\\"***\"echo ${str}结果***\"qw\"***
双引号里可以有变量
双引号里可以出现转义字符
优点
双引号
如:a='qwer'b='asdf'${a}''echo ${b}结果:asdfqwer
单引号拼接
如:a=\"qwer\"b=\"asdf\"${a}\"\"echo ${b}结果asdfqwer
双引号拼接
拼接字符串
结果输出8
如a='qwer'b='asdf'${a}''echo ${#b}
在${#变量名}中
获取字符串长度
结果输出:wert
如:c=\"qwertyuiop\"echo ${c:1:4}
${变量名:索引位置:提取字符数}
提取字符串
结果输出:6
如:c=\"qwertyuiop\"echo `expr index ${c} y`
`expr index 字符串 所查字符`
查找字符的位置
字符串
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0
a=(1 2 3)
b=(1234)
c[0]=0c[1]=5c[2]=3
数组名=(值1 值2 ... 值n)单独定义数组的各个分量可以不使用连续的下标且下标的范围没有限制,如c
用括号来表示数组,数组元素用\"空格\"符号分割开
定义
echo ${a[2]}
使用 @ 符号可以获取数组中的所有元素echo ${a[@]}
${数组名[下标]}
格式
读取数组
l1=${#b[@]}
l=${#b[*]}
获取数组元素的个数
ln=${#b[n]}
获取数组单个元素的长度
获取数组的长度
数组
数据类型
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
#!/bin/bashecho \"Shell 传递参数实例!\";echo \"执行的文件名:$0\";echo \"第一个参数为:$1\";echo \"第二个参数为:$2\";echo \"第三个参数为:$3\";
1、编辑shell文件1.sh
chmod +x 1.sh
2、赋予可执行权限
./1.sh 1 2 3
3、执行
Shell 传递参数实例!执行的文件名:./1.sh第一个参数为:1第二个参数为:2第三个参数为:3
结果
将参数传递给文件
实例
传递到脚本的参数个数
$#
以一个单字符串显示所有向脚本传递的参数。如\"$*\"用「\"」括起来的情况、以\"$1 $2 … $n\"的形式输出所有参数。
$*
脚本运行的当前进程ID号
$$
后台运行的最后一个进程的ID号
$!
与$*相同,但是使用时加引号,并在引号中返回每个参数。如\"$@\"用「\"」括起来的情况、以\"$1\" \"$2\" … \"$n\" 的形式输出所有参数。
$@
显示Shell使用的当前选项,与set命令功能相同。
$-
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
$?
参数处理说明
都是引用所有参数。
相同点
只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 \" * \" 等价于 \"1 2 3\"(传递了一个参数),而 \"@\" 等价于 \"1\" \"2\" \"3\"(传递了三个参数)。
不同点
#!/bin/bashecho \"-- \\$* 演示 ---\"for i in \"$*\"; do echo $idoneecho \"-- \\$@ 演示 ---\"for i in \"$@\"; do echo $idone
shell内容
执行脚本
-- $* 演示 ---1 2 3-- $@ 演示 ---123
结果输出
$* 与 $@ 区别
#!/bin/bashecho \"Shell 传递参数实例!\";echo \"第一个参数为:$1\";echo \"参数个数为:$#\";echo \"传递的参数作为一个字符串显示:$*\";
执行
Shell 传递参数实例!第一个参数为:1参数个数为:3传递的参数作为一个字符串显示:1 2 3
其他参数处理
参数传递
val=`expr 2 + 2`echo \"两数之和为 : $val\"运行结果:两数之和为 : 4
如,两个数相加
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
注意
expr 是一款表达式计算工具,使用它能完成表达式的求值操作
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,如 awk 和 expr,expr 最常用
+ 加法
- 减法
* 乘法
/ 除法
% 取余
= 赋值
== 等于(用于比较两个数字,相同则返回true)
!= 不等于(用于比较两个数字,不相同则返回true)
常用算术运算符
运行结果a + b : 10a - b : -4a * b : 21b / a : 2b % a : 1a 不等于 b
例如#!/bin/basha=3b=7val=`expr $a + $b`echo \"a + b : $val\"val=`expr $a - $b`echo \"a - b : $val\"val=`expr $a \\* $b`echo \"a * b : $val\"val=`expr $b / $a`echo \"b / a : $val\"val=`expr $b % $a`echo \"b % a : $val\"if [ $a == $b ]then echo \"a 等于 b\"fiif [ $a != $b ]then echo \"a 不等于 b\"fi
乘号(*)前边必须加反斜杠(\\)才能实现乘法运算;
注意及实例
算术运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
-ep 检测两个数是否相等,相等返回true
-ne 两个数是否不相等,不相等返回true
-gt 左边的数是否大于右边的,是返回true
-lt 左边的数是否小于右边的,是返回true
-ge 左边的数是否大于等于右边的数,是返回true
-le 左边的数是有小于等于右边的数,是返回true
常用关系运算符
运行结果:3 -eq 7: a 不等于 b3 -ne 7: a 不等于 b3 -gt 7: a 不大于 b3 -lt 7: a 小于 b3 -ge 7: a 小于 b3 -le 7: a 小于或等于 b
#!/bin/basha=3b=7if [ $a -eq $b ]then echo \"$a -eq $b : a 等于 b\"else echo \"$a -eq $b: a 不等于 b\"fiif [ $a -ne $b ]then echo \"$a -ne $b: a 不等于 b\"else echo \"$a -ne $b : a 等于 b\"fiif [ $a -gt $b ]then echo \"$a -gt $b: a 大于 b\"else echo \"$a -gt $b: a 不大于 b\"fiif [ $a -lt $b ]then echo \"$a -lt $b: a 小于 b\"else echo \"$a -lt $b: a 不小于 b\"fiif [ $a -ge $b ]then echo \"$a -ge $b: a 大于或等于 b\"else echo \"$a -ge $b: a 小于 b\"fiif [ $a -le $b ]then echo \"$a -le $b: a 小于或等于 b\"else echo \"$a -le $b: a 大于 b\"fi
关系运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
运行结果:3 != 7 : a 不等于 b3 小于 100 且 7 大于 15 : 返回 false3 小于 100 或 7 大于 100 : 返回 true3 小于 5 或 7 大于 100 : 返回 true
#!/bin/basha=3b=7if [ $a != $b ]then echo \"$a != $b : a 不等于 b\"else echo \"$a == $b: a 等于 b\"fiif [ $a -lt 100 -a $b -gt 15 ]then echo \"$a 小于 100 且 $b 大于 15 : 返回 true\"else echo \"$a 小于 100 且 $b 大于 15 : 返回 false\"fiif [ $a -lt 100 -o $b -gt 100 ]then echo \"$a 小于 100 或 $b 大于 100 : 返回 true\"else echo \"$a 小于 100 或 $b 大于 100 : 返回 false\"fiif [ $a -lt 5 -o $b -gt 100 ]then echo \"$a 小于 5 或 $b 大于 100 : 返回 true\"else echo \"$a 小于 5 或 $b 大于 100 : 返回 false\"fi
布尔运算符
&& 逻辑的 AND
|| 逻辑的 OR
运行结果:返回 false返回 true
#!/bin/basha=3b=7if [[ $a -lt 100 && $b -gt 100 ]]then echo \"返回 true\"else echo \"返回 false\"fiif [[ $a -lt 100 || $b -gt 100 ]]then echo \"返回 true\"else echo \"返回 false\"fi
逻辑运算符
= 两个字符串是否相等,相等返回 true。
!= 两个字符串是否不相等,不相等返回 true。
-z 检测字符串长度是否为0,为0返回 true。
-n 检测字符串长度是否不为 0,不为 0 返回 true。
$ 检测字符串是否为空,不为空返回 true。
常用运算符
运行结果:abcdefg = hijklmn: a 不等于 babcdefg != hijklmn : a 不等于 b-z abcdefg : 字符串长度不为 0-n abcdefg : 字符串长度不为 0abcdefg : 字符串不为空
#!/bin/basha=3b=7a=\"abcdefg\"b=\"hijklmn\"if [ $a = $b ]then echo \"$a = $b : a 等于 b\"else echo \"$a = $b: a 不等于 b\"fiif [ $a != $b ]then echo \"$a != $b : a 不等于 b\"else echo \"$a != $b: a 等于 b\"fiif [ -z $a ]then echo \"-z $a : 字符串长度为 0\"else echo \"-z $a : 字符串长度不为 0\"fiif [ -n \"$a\" ]then echo \"-n $a : 字符串长度不为 0\"else echo \"-n $a : 字符串长度为 0\"fiif [ $a ]then echo \"$a : 字符串不为空\"else echo \"$a : 字符串为空\"fi
字符串运算符
文件测试运算符用于检测 Unix 文件的各种属性
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
常用操作符
-S: 判断某文件是否 socket。
-L: 检测文件是否存在并且是一个符号链接。
其他检测符
运行结果:文件可读文件可写文件可执行文件为普通文件文件不是个目录文件不为空文件存在
#!/bin/bashfile=\"/home/tmp/test/1.sh\"if [ -r $file ]then echo \"文件可读\"else echo \"文件不可读\"fiif [ -w $file ]then echo \"文件可写\"else#!/bin/bashfile=\"/home/tmp/test/1.sh\"if [ -r $file ]then echo \"文件可读\"else echo \"文件不可读\"fiif [ -w $file ]then echo \"文件可写\"else echo \"文件不可写\"fiif [ -x $file ]then echo \"文件可执行\"else echo \"文件不可执行\"fiif [ -f $file ]then echo \"文件为普通文件\"else echo \"文件为特殊文件\"fiif [ -d $file ]then echo \"文件是个目录\"else echo \"文件不是个目录\"fiif [ -s $file ]then echo \"文件不为空\"else echo \"文件为空\"fiif [ -e $file ]then echo \"文件存在\"else echo \"文件不存在\"fi
文件测试运算符
基本运算符
命令格式echo string
用于字符串输出
abcdefgabcdefg
echo \"abcdefg\"echo abcdefg
显示普通字符串
\"abcdefg\"\"abcdefg\"
echo \"\\\"abcdefg\\\"\"echo \\\"abcdefg\\\"
转义字符
#!/bin/bashecho \"输入名字\"read nameecho \"$name It is a test\"
执行结果:输入名字eeeeee It is a test
read 命令从标准输入中读取一行并把输入行的每个字段的值指定给 shell 变量
read命令
显示变量
运行结果abcdefghoho
-e 开始转义#!/bin/bashecho -e \"abcdefg\\"echo \"hoho\"
显示换行
-c 不换行#!/bin/bashecho -e \"abcdefg\\c\"echo \"hoho\"
显示不换行
echo \"QWERTY\" > 1.txt
结果定向至文件
运行结果$a\\\"
#!/bin/basha=\"sfe\"echo '$a\\\"'
输出原字符串用单引号
运行结果Tue 15 Feb 2022 02:55:06 AM UTC
使用单引号``#!/bin/bashecho `date`
显示命令执行结果
echo命令
printf 格式控制字符串 [参数]
语法
执行结果姓名 性别 体重kg赵 男 70.35钱 女 40.63孙 女 45.00
#!/bin/bashprintf \"%-10s %-8s %-4s\\" 姓名 性别 体重kg printf \"%-10s %-8s %-4.2f\\" 赵 男 70.3475printf \"%-10s %-8s %-4.2f\\" 钱 女 40.6323printf \"%-10s %-8s %-4.2f\\" 孙 女 45.0043
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
解析
1 abc1 abcabcdefabcdefabcdefa b cd e fg h ij and 0
# format-string为双引号printf \"%d %s\\" 1 \"abc\"# 单引号与双引号效果一样printf '%d %s\' 1 \"abc\"# 没有引号也可以输出printf %s abcdef# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用printf %s abc defprintf \"%s\\" abc defprintf \"%s %s %s\\" a b c d e f g h i j# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替printf \"%s and %d \\"
\\a 警告字符,通常为ASCII的BEL字符
\\b 后退
\\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\\f 换页(formfeed)
\ 换行
\ 回车(Carriage return)
\\t 水平制表符
\\v 垂直制表符
\\\\ 一个字面上的反斜杠字符
\\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\\0ddd 表示1到3位的八进制值字符
常用
运行结果:script.sh: line 2: $: command not foundscript.sh: line 3: $: command not foundscript.sh: line 4: $: command not found
#!/bin/bash$ printf \
转义序列
printf命令
用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
常用参数
运行结果:两个数不相等!
#!/bin/bashnum1=37num2=75if test $[num1] -eq $[num2]then echo '两个数相等!'else echo '两个数不相等!'fi
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
参数说明
运行结果两个字符串不相等!
#!/bin/bashnum1=\"gaegaa\"num2=\"dddsss\"if test $num1 = $num2then echo '两个字符串相等!'else echo '两个字符串不相等!'fi
子主题
字符串测试
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
执行结果:文件已存在!文件存在且可读!文件存在且可写!文件存在且可执行!文件存在且至少有一个字符!文件不存在或不为目录!文件存在且为普通文件!文件不存在或不为字符型特殊文件!文件不存在或不为块特殊文件!
#!/bin/bashif test -e ./1.shthen echo '文件已存在!'else echo '文件不存在!'fiif test -r ./1.shthen echo '文件存在且可读!'else echo '文件不存在或不可读!'fiif test -w ./1.shthen echo '文件存在且可写!'else echo '文件不存在或不可写!'fiif test -x ./1.shthen echo '文件存在且可执行!'else echo '文件不存在或不可执行!'fiif test -s ./1.shthen echo '文件存在且至少有一个字符!'else echo '文件不存在或没有字符!'fiif test -d ./1.shthen echo '文件存在且为目录!'else echo '文件不存在或不为目录!'fiif test -f ./1.shthen echo '文件存在且为普通文件!'else echo '文件不存在或非普通文件!'fiif test -c ./1.shthen echo '文件存在且为字符型特殊文件!'else echo '文件不存在或不为字符型特殊文件!'fiif test -b ./1.shthen echo '文件存在且为块特殊文件!'else echo '文件不存在或不为块特殊文件!'fi
文件测试
test命令
sh 的流程控制不可为空,如果 else 分支没有语句执行,就不要写这个 else
if conditionthen command1 command2 ... commandN fi
写成一行,适用于终端命令提示符if [ $(ps -ef | grep -c \"ssh\") -gt 1 ]; then echo \"true\"; fi
语法格式
fi
if conditionthen command1 command2 ... commandNelse commandfi
运行结果:两个数字不相等!
#!/bin/bashnum1=$[7*3]num2=$[7+5]if test $[num1] -eq $[num2]then echo '两个数字相等!'else echo '两个数字不相等!'fi
if else
if condition1then command1elif condition2 then command2else commandNfi
运行结果:a 小于 b
#!/bin/basha=37b=75if [ $a == $b ]then echo \"a 等于 b\"elif [ $a -gt $b ]then echo \"a 大于 b\"elif [ $a -lt $b ]then echo \"a 小于 b\"else echo \"没有符合的条件\"fi
if else-if else
if else
for var in item1 item2 ... itemNdo command1 command2 ... commandNdone
运行结果:The value is: dThe value is: d2The value is: 3dThe value is: 4eThe value is: 5eThe value is: 6uThe value is: 7b
#!/bin/bashfor aa in d d2 3d 4e 5e 6u 7bdo echo \"The value is: $aa\"done
一般格式
for var in item1 item2 ... itemN; do command1; command2… ;done;
运行结果:The value is: dThe value is: d2The value is: 3dThe value is: 4eThe value is: 5eThe value is: 6u
for aa in d d2 3d 4e 5e 6u; do echo \"The value is: $aa\" ;done;
一行
for循环
while conditiondo commanddone
运行结果:12345
#!/bin/bashint=1while(( $int<=5 ))do echo $int let \"int++\"done
用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来
let arg [arg ...]arg:要执行的表达式
自加操作:let no++自减操作:let no--简写形式 let no+=10,let no-=20,分别等同于 let no=no+10,let no=no-20。
运行结果10 2
#!/bin/bashlet a=7+3let b=7-5 echo $a $b
命令说明let
实例输出1-5
执行效果:按下 <CTRL-D> 退出请输入: qq您输入的是:qq !11您输入的是:11 !qwer1234您输入的是:qwer1234 !
#!/bin/bashecho '按下 <CTRL-D> 退出'echo -n '请输入: 'while read FILMdo echo \"您输入的是:$FILM !\"done
while :do commanddone
while truedo commanddone
for (( ; ; ))
无限循环
while循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反
until conditiondo commanddone
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
运行结果0123456789
a=0until [ ! $a -lt 10 ]do echo $a a=`expr $a + 1`done
实例输出 0 ~ 9 的数字
until循环
case ... esac 为多选择语句每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
case 值 in模式1) command1 command2 ... commandN ;;模式2) command1 command2 ... commandN ;;esac
执行效果:输入 1 到 4 之间的数字:你输入的数字为:5你没有输入 1 到 4 之间的数字输入 1 到 4 之间的数字:你输入的数字为:1你选择了 1
#!/bin/bashecho '输入 1 到 4 之间的数字:'echo '你输入的数字为:'read aNumcase $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;;esac
case ... esac
break命令允许跳出所有循环
执行效果输入 1 到 5 之间的数字:3你输入的数字为 3!输入 1 到 5 之间的数字:2你输入的数字为 2!输入 1 到 5 之间的数字:4你输入的数字为 4!输入 1 到 5 之间的数字:7你输入的数字不是 1 到 5 之间的! 游戏结束
#!/bin/bashwhile :do echo -n \"输入 1 到 5 之间的数字:\" read aNum case $aNum in 1|2|3|4|5) echo \"你输入的数字为 $aNum!\" ;; *) echo \"你输入的数字不是 1 到 5 之间的! 游戏结束\" break ;; esacdone
break
跳出当前循环
#!/bin/bashwhile :do echo -n \"输入 1 到 5 之间的数字: \" read aNum case $aNum in 1|2|3|4|5) echo \"你输入的数字为 $aNum!\" ;; *) echo \"你输入的数字不是 1 到 5 之间的!\" continue echo \"游戏结束\" ;; esacdone
实例该循环中,echo \"游戏结束\"永远不会被执行
continue
跳出循环
流程控制
[ function ] funname [()]{ action; [return int;]}
定义格式
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
说明
执行结果-----函数开始执行-----这是我的第一个 shell 函数!-----函数执行完毕-----
#!/bin/bashdemoFun(){ echo \"这是我的第一个 shell 函数!\"}echo \"-----函数开始执行-----\"demoFunecho \"-----函数执行完毕-----\"
调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数
执行结果:第一个参数为 1 !第二个参数为 2 !第十个参数为 10 !第十个参数为 34 !第十一个参数为 73 !参数总数有 11 个!作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
#!/bin/bashfunWithParam(){ echo \"第一个参数为 $1 !\" echo \"第二个参数为 $2 !\" echo \"第十个参数为 $10 !\" echo \"第十个参数为 ${10} !\" echo \"第十一个参数为 ${11} !\" echo \"参数总数有 $# 个!\" echo \"作为一个字符串输出所有参数 $* !\"}funWithParam 1 2 3 4 5 6 7 8 9 34 73
函数调用
定义说明
函数
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file
n > file 将文件描述符为 n 的文件重定向到 file
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file
n >& m 将输出文件 m 和 n 合并
n <& m 将输入文件 m 和 n 合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入
重定向命令
0 通常是标准输入(STDIN)
1 是标准输出(STDOUT)
2 是标准错误输出(STDERR)
文件描述符
command1 > file1
执行command1然后将输出的内容存入file1
语法说明
defdef
echo \"def\" >aaecho \"def\" >>aa
输出重定向
command1 < file1
以从文件获取输入
2
wc -l < aa
输入重定向
command > file 2>&1
command >> file 2>&1
将 stdout 和 stderr 合并后重定向到 file
command < file1 >file2
对 stdin 和 stdout 都重定向command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2
标准错误文件(stderr)
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
command << delimiter documentdelimiter
基本形式
将两个 delimiter 之间的内容(document) 作为输入传递给 command
作用
结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
开始的delimiter前后的空格会被忽略掉
注意事项
运行结果:3
#!/bin/bashwc -l << EOF aaa bbb ccccccccccccEOF
aaa bbb cccccccccccc
#!/bin/bashcat << EOF aaa bbb ccccccccccccEOF
Here Document
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃
command > /dev/null
command > /dev/null 2>&1
0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出
* */2 * * * /usr/sbin/logrotate /etc/logrotate.d/tomcat >/dev/null 2>&1
屏蔽 stdout 和 stderr
/dev/null 文件
输入/输出重定向
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件
. filename # 注意点号(.)和文件名中间有一空格
source filename
格式
执行结果 aaa bbb cccccccccccc
7.sh 内容#!/bin/bashcat << EOF aaa bbb ccccccccccccEOF8.sh 内容#!/bin/bash. ./7.sh执行8.sh
注意,7.sh不需要可执行权限
文件包含
shell
0 条评论
回复 删除
下一页