脚本执行一般需要chmod进行加权限
约定使用哪一种shell
3.1注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
3.2使用一个定义过的变量,只要在变量名前面加美元符号即可,eg
your_name=”qinjx”
echo yournameecho y o u r n a m e e c h o {your_name}
推荐加上{} 便于区分边界
3.3只读变量 readonly
3.4unset删除变量
3.5变量类型
运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
3.5.1String类型 可以使用 “” 或者”
3.5.1.1单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
3.5.1.2获取字符串长度
str=’abcd’
echo {#str}
3.5.1.3获取指定字符串
str=”abcd”
echo {#str} 3.5.1.3获取指定字符串 str=”abcd” echo {str:1:2}
3.5.1.4查找
str=”abcd”
echo ${str:1:2}
string=”runoob is a great company”
echo expr index "$string" is
# 输出 8
echo expr index "$str" b
注意最外层不是引号 是 tab上的“
3.5.2数组
只支持以为数组,不支持多维数组,并且不限制数组大小,下角标从0开始 用空格进行隔开
array={
1
2
3
4
}或者 array[0]=value[0]
eg:
array1=(1111 2 3 4 5 6)
array2[0]=1
array2[1]=2
array2[2]=3
echo ${#array1[0]} array1 角标为0的长度
4.注释
只支持#的单行注释
5.shell传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
eg
echo “Shell 传递参数实例!”;
echo “第一个参数为:$1”;
echo “参数个数为:#”;
echo “传递的参数作为一个字符串显示: #”; echo “传递的参数作为一个字符串显示: *”;
chmod+xtest.sh c h m o d + x t e s t . s h ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
# 传递到脚本的参数个数 # 传递到脚本的参数个数 * 以一个单字符串显示所有向脚本传递的参数。如" ∗”用「”」括起来的情况、以” ∗ ” 用 「 ” 」 括 起 来 的 情 况 、 以 ” 1 2… 2 … n”的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
6.1算术运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
val=expr 3 + 5
echo “输出 val”注意expr使用的是反括号且+之间不能挨着乘号(∗)前边必须加反斜杠()才能实现乘法运算;if…then…fi是条件语句,后续将会讲解。在MAC中shell的expr语法是: v a l ” 注 意 e x p r 使 用 的 是 反 括 号 且 + 之 间 不 能 挨 着 乘 号 ( ∗ ) 前 边 必 须 加 反 斜 杠 ( ) 才 能 实 现 乘 法 运 算 ; i f … t h e n … f i 是 条 件 语 句 , 后 续 将 会 讲 解 。 在 M A C 中 s h e l l 的 e x p r 语 法 是 : ((表达式)),此处表达式中的 “*” 不需要转义符号 “\” 。
6.2关系运算符
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ a−eq a − e q b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ a−ne a − n e b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ a−gt a − g t b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ a−lt a − l t b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ a−ge a − g e b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ a−le a − l e b ] 返回 true。
6.3布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ a−lt20−o a − l t 20 − o b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ a−lt20−a a − l t 20 − a b -gt 100 ] 返回 false。
6.4逻辑运算符
运算符 说明 举例
&& 逻辑的 AND [[ a -lt 100 && a -lt 100 && b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ a−lt100|| a − l t 100 | | b -gt 100 ]] 返回 true
6.5字符串运算符
= 检测两个字符串是否相等,相等返回 true。 [ a= a = b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ a!= a ! = b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z a]返回false。−n检测字符串长度是否为0,不为0返回true。[−n“ a ] 返 回 f a l s e 。 − n 检 测 字 符 串 长 度 是 否 为 0 , 不 为 0 返 回 t r u e 。 [ − n “ a” ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ a]返回true。6.6文件测试运算符−bfile检测文件是否是块设备文件,如果是,则返回true。[−b a ] 返 回 t r u e 。 6.6 文 件 测 试 运 算 符 − b f i l e 检 测 文 件 是 否 是 块 设 备 文 件 , 如 果 是 , 则 返 回 t r u e 。 [ − b file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c file]返回false。−dfile检测文件是否是目录,如果是,则返回true。[−d f i l e ] 返 回 f a l s e 。 − d f i l e 检 测 文 件 是 否 是 目 录 , 如 果 是 , 则 返 回 t r u e 。 [ − d file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f file]返回true。−gfile检测文件是否设置了SGID位,如果是,则返回true。[−g f i l e ] 返 回 t r u e 。 − g f i l e 检 测 文 件 是 否 设 置 了 S G I D 位 , 如 果 是 , 则 返 回 t r u e 。 [ − g file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k file]返回false。−pfile检测文件是否是有名管道,如果是,则返回true。[−p f i l e ] 返 回 f a l s e 。 − p f i l e 检 测 文 件 是 否 是 有 名 管 道 , 如 果 是 , 则 返 回 t r u e 。 [ − p file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u file]返回false。−rfile检测文件是否可读,如果是,则返回true。[−r f i l e ] 返 回 f a l s e 。 − r f i l e 检 测 文 件 是 否 可 读 , 如 果 是 , 则 返 回 t r u e 。 [ − r file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w file]返回true。−xfile检测文件是否可执行,如果是,则返回true。[−x f i l e ] 返 回 t r u e 。 − x f i l e 检 测 文 件 是 否 可 执 行 , 如 果 是 , 则 返 回 t r u e 。 [ − x file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s file]返回true。−efile检测文件(包括目录)是否存在,如果是,则返回true。[−e f i l e ] 返 回 t r u e 。 − e f i l e 检 测 文 件 ( 包 括 目 录 ) 是 否 存 在 , 如 果 是 , 则 返 回 t r u e 。 [ − e file ] 返回 true。
printf 命令模仿 C 程序库(library)里的 printf() 程序。
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
9.1数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
num1=100
num2=150
if test num1−eq n u m 1 − e q num2
then
echo “num1 与num2 相等”
else
echo “num1 与num2 不相等”
fi
9.2字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
9.3文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
每个流程中不可出现为空的情况,当为空时可以省略else
10.1for循环
与其他编程语言类似,Shell支持for循环。
for循环一般格式为:
for var in item1 item2 … itemN
do
command1
command2
…
commandN
done
var是每个循环的当前的对象
10.2while
while condition
do
command
done
eg
num=1
while (( num<=5))doecho n u m <= 5 ) ) d o e c h o num
let “num++”
done
10.3util
until condition
do
command
done
10.4case
case 值 in
模式1)
command1
command2
…
commandN
;;
模式2)
command1
command2
…
commandN
;;
esac
eg
echo “输入1-3”
read num
case $num in
1)
echo “1”
;;
2)
echo “2”
;;
3)
echo “3”
;;
esac
跳出循环的方式 break continue
funWithReturn(){
echo “这个函数会对输入的两个数字进行相加运算…”
echo “输入第一个数字: ”
read aNum
echo “输入第二个数字: ”
read anotherNum
echo “两个数字分别为 aNum和 a N u m 和 anotherNum !”
return (( ( ( aNum+anotherNum))
}
funWithReturn
echo “输入的两个数字之和为 anotherNum)) } funWithReturn echo “输入的两个数字之和为 ? !”
函数返回值在调用该函数后通过 ?来获得。注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。参数处理说明 ? 来 获 得 。 注 意 : 所 有 函 数 在 使 用 前 必 须 定 义 。 这 意 味 着 必 须 将 函 数 放 在 脚 本 开 始 部 分 , 直 至 s h e l l 解 释 器 首 次 发 现 它 时 , 才 可 以 使 用 。 调 用 函 数 仅 使 用 其 函 数 名 即 可 。 参 数 处 理 说 明 # 传递到脚本的参数个数
∗以一个单字符串显示所有向脚本传递的参数 ∗ 以 一 个 单 字 符 串 显 示 所 有 向 脚 本 传 递 的 参 数 脚本运行的当前进程ID号 脚 本 运 行 的 当 前 进 程 I D 号 ! 后台运行的最后一个进程的ID号
@与 @ 与 *相同,但是使用时加引号,并在引号中返回每个参数。
−显示Shell使用的当前选项,与set命令功能相同。 − 显 示 S h e l l 使 用 的 当 前 选 项 , 与 s e t 命 令 功 能 相 同 。 ? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
function fun(){
echo 1echo 1 e c h o 2
echo $3
}
fun a b c
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表如下
命令 说明
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)。
. 或者 source