Shell脚本 学习

来源:互联网 发布:itunes mac 下载路径 编辑:程序博客网 时间:2024/05/30 13:41
shell中四则运算
Description:
 

在 shell 中的四则运算必须使用 expr 这个指令来辅助。因为这是一个指令,所以如果要将结果指定给变量,必须使用 ` 包起来。请注意,在 + - * / 的二边都有空白,如果没有空白将产生错误

$ expr 5 -23$ sum=`expr 5 + 10`$ echo $sum15$ sum=`expr $sum / 3`$ echo $sum5

还有一个要特别注意的是乘号 * 在用 expr 运算时,不可只写 *。因为 * 有其它意义,所以要使用 /* 来代表。另外,也可以用 % 来求余数。

$ count=`expr 5 /* 3`$ echo $count$ echo `expr $count % 3`5

我们再列出更多使用 expr 指令的方式,下列表中为可以放在指令 expr 之后的表达式。有的符号有特殊意义,必须以 / 将它的特殊意义去除,例如 /*,否则必须用单引号将它括起来,如 '*':

类别 语法 说明 条件判断 expr1 /| expr2 如果 expr1 不是零或 null 则传回 expr1,否则传回 expr2。 expr1 /& expr2 如果 expr1 及 expr2 都不为零或 null,则传回 expr1,否则传回 0。 四则运算 expr1 + expr2 传回 expr1 加 expr2 后的值。 expr1 - expr2 传回 expr1 减 expr2 后的值。 expr1/* expr2 传回 expr1 乘 expr2 后的值。 expr1 / expr2 传回 expr1 除 expr2 后的值。 expr1 % expr2 传回 expr1 除 expr2 的余数。 大小判断 expr1 /> expr2 如果 expr1 大于 expr2 则传回 1,否则传回 0。如果 expr1 及 expr2 都是数字,则是以数字大小判断,否则是以文字判断。以下皆同。 expr1 /< expr2 如果 expr1 小于 expr2 则传回 1,否则传回 0。 expr1 = expr2 如果 expr1 等于 expr2 则传回 1,否则传回 0。 expr1 != expr2 如果 expr1 不等于 expr2 则传回 1,否则传回 0。 expr1 />= expr2 如果 expr1 大于或等于 expr2 则传回 1,否则传回 0。 expr1 /<= expr2 如果 expr1 小于或等于 expr2 则传回 1,否则传回 0。 文字处理 expr1 : expr2 比较一固定字符串,即 regular expression。可以使用下列字符来辅助:

. 匹配一个字符。

$ 找字符串的结尾。

[list] 找符合 list 中的任何字符串。

* 找寻 0 个或一个以上在 * 之前的字。

/( /) 传回括号中所匹配的字符串。

我们针对比较复杂的文字处理部份再加以举例:

$ ttyttyp0$ expr `tty` : ".*/(../)/___FCKpd___2quot;p0$ expr `tty` : '.*/(../)

上面执行 tty 的结果是 ttyp0,而在 expr 中,在 : 右侧的表达式中,先找 .* 表示0个或一个以上任何字符,传回之后在结尾 ($) 时的二个字符 /(../)。在第一个 expr 的式子中,因为使用双引号,所以在 $ 之前要用一个 / 来去除 $ 的特殊意义,而第二个 expr 是使用单引号,在单引号内的字都失去了特殊意义,所以在 $ 之前不必加 /。

除了使用 expr 外,我们还可以使用下列这种特殊语法:

$ a=10$ b=5$ c=$((${a}+${b}))$ echo $c15$ c=$((${a}*${b}))$ echo $c50

我们可以使用 $(()) 将表达式放在括号中,即可达到运算的功能。

特定的脚本概念的备忘录
Link - Thu, 20 Mar 2008 16:50:05 +0800
Description:

表格 B-1. 特殊的shell变量

变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置参数的个数 "$*" 所有的位置参数(作为单个字符串) * "$@" 所有的位置参数(每个都作为独立的字符串) ${#*} 传递到脚本中的命令行参数的个数 ${#@} 传递到脚本中的命令行参数的个数 $? 返回值 $$ 脚本的进程ID(PID) $- 传递到脚本中的标志(使用set) $_ 之前命令的最后一个参数 $! 运行在后台的最后一个作业的进程ID(PID)

* 必须被引用起来, 否则默认为"$@".


表格 B-2. 测试操作: 二元比较

操作 描述 ----- 操作 描述           算术比较     字符串比较   -eq 等于   = 等于       == 等于 -ne 不等于   != 不等于 -lt 小于   /< 小于 (ASCII) * -le 小于等于       -gt 大于   /> 大于 (ASCII) * -ge 大于等于             -z 字符串为空       -n 字符串不为空           算术比较 双括号(( ... ))结构       > 大于       >= 大于等于       < 小于       <= 小于等于      

* 如果在双中括号 [[ ... ]] 测试结构中使用的话, 那么就不需要使用转义符/了.


表格 B-3. 文件类型的测试操作

操作 测试条件 ----- 操作 测试条件 -e 文件是否存在   -s 文件大小不为0 -f 是一个标准文件       -d 是一个目录   -r 文件具有权限 -h 文件是一个符号链接   -w 文件具有权限 -L 文件是一个符号链接   -x 文件具有执行权限 -b 文件是一个块设备       -c 文件是一个字符设备   -g 设置了sgid标记 -p 文件是一个管道   -u 设置了suid标记 -S 文件是一个socket   -k 设置了"粘贴位" -t 文件与一个终端相关联                 -N 从这个文件最后一次被读取之后, 它被修改过   F1 -nt F2 文件F1比文件F2 * -O 这个文件的宿主是你   F1 -ot F2 文件F1比文件F2 * -G 文件的组id与你所属的组相同   F1 -ef F2 文件F1和文件F2都是同一个文件的硬链接 *           ! "非" (反转上边的测试结果)      

* 二元操作符(需要两个操作数).


表格 B-4. 参数替换和扩展

表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *     ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *     ${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串 ${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串     ${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG * ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *     ${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量 ${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

* 当然, 如果变量var已经被设置的话, 那么其值就是$var.


表格 B-5. 字符串操作

表达式 含义 ${#string} $string的长度     ${string:position}$string中, 从位置$position开始提取子串 ${string:position:length}$string中, 从位置$position开始提取长度为$length的子串     ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串 ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串 ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串 ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串     ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring ${string/#substring/replacement} 如果$string前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ${string/%substring/replacement} 如果$string后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring         expr match "$string" '$substring' 匹配$string开头的$substring*的长度 expr "$string" : '$substring' 匹配$string开头的$substring*的长度 expr index "$string" $substring$string中匹配到的$substring的第一个字符出现的位置 expr substr $string $position $length$string中从位置$position开始提取长度为$length的子串 expr match "$string" '/($substring/)'$string的开头位置提取$substring* expr "$string" : '/($substring/)'$string的开头位置提取$substring* expr match "$string" '.*/($substring/)'$string的结尾提取$substring* expr "$string" : '.*/($substring/)'$string的结尾提取$substring*

* $substring是一个正则表达式.


表格 B-6. 一些结构的汇总

表达式 解释     中括号   if [ CONDITION ] 测试结构 if [[ CONDITION ]] 扩展的测试结构 Array[1]=element1 数组初始化 [a-z] 正则表达式的字符范围     大括号   ${variable} 参数替换 ${!variable} 间接变量引用 { command1; command2; . . . commandN; } 代码块 {string1,string2,string3,...} 大括号扩展         圆括号   ( command1; command2 ) 子shell中执行的命令组 Array=(element1 element2 element3) 数组初始化 result=$(COMMAND) 在子shell中执行命令, 并将结果赋值给变量 >(COMMAND) 进程替换 <(COMMAND) 进程替换     双圆括号   (( var = 78 )) 整型运算 var=$(( 20 + 5 )) 整型运算, 并将结果赋值给变量     引号   "$variable" "弱"引用 'string' "强"引用     后置引用   result=`COMMAND` 在子shell中运行命令, 并将结果赋值给变量
p0

上面执行 tty 的结果是 ttyp0,而在 expr 中,在 : 右侧的表达式中,先找 .* 表示0个或一个以上任何字符,传回之后在结尾 ($) 时的二个字符 /(../)。在第一个 expr 的式子中,因为使用双引号,所以在 $ 之前要用一个 / 来去除 $ 的特殊意义,而第二个 expr 是使用单引号,在单引号内的字都失去了特殊意义,所以在 $ 之前不必加 /。

除了使用 expr 外,我们还可以使用下列这种特殊语法:

___FCKpd___3

我们可以使用 $(()) 将表达式放在括号中,即可达到运算的功能。

特定的脚本概念的备忘录
Link - Thu, 20 Mar 2008 16:50:05 +0800
Description:

表格 B-1. 特殊的shell变量

变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置参数的个数 "$*" 所有的位置参数(作为单个字符串) * "$@" 所有的位置参数(每个都作为独立的字符串) ${#*} 传递到脚本中的命令行参数的个数 ${#@} 传递到脚本中的命令行参数的个数 $? 返回值 $$ 脚本的进程ID(PID) $- 传递到脚本中的标志(使用set) $_ 之前命令的最后一个参数 $! 运行在后台的最后一个作业的进程ID(PID)

* 必须被引用起来, 否则默认为"$@".


表格 B-2. 测试操作: 二元比较

操作 描述 ----- 操作 描述           算术比较     字符串比较   -eq 等于   = 等于       == 等于 -ne 不等于   != 不等于 -lt 小于   /< 小于 (ASCII) * -le 小于等于       -gt 大于   /> 大于 (ASCII) * -ge 大于等于             -z 字符串为空       -n 字符串不为空           算术比较 双括号(( ... ))结构       > 大于       >= 大于等于       < 小于       <= 小于等于      

* 如果在双中括号 [[ ... ]] 测试结构中使用的话, 那么就不需要使用转义符/了.


表格 B-3. 文件类型的测试操作

操作 测试条件 ----- 操作 测试条件 -e 文件是否存在   -s 文件大小不为0 -f 是一个标准文件       -d 是一个目录   -r 文件具有权限 -h 文件是一个符号链接   -w 文件具有权限 -L 文件是一个符号链接   -x 文件具有执行权限 -b 文件是一个块设备       -c 文件是一个字符设备   -g 设置了sgid标记 -p 文件是一个管道   -u 设置了suid标记 -S 文件是一个socket   -k 设置了"粘贴位" -t 文件与一个终端相关联                 -N 从这个文件最后一次被读取之后, 它被修改过   F1 -nt F2 文件F1比文件F2 * -O 这个文件的宿主是你   F1 -ot F2 文件F1比文件F2 * -G 文件的组id与你所属的组相同   F1 -ef F2 文件F1和文件F2都是同一个文件的硬链接 *           ! "非" (反转上边的测试结果)      

* 二元操作符(需要两个操作数).


表格 B-4. 参数替换和扩展

表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *     ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *     ${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串 ${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串     ${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG * ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *     ${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量 ${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

* 当然, 如果变量var已经被设置的话, 那么其值就是$var.


表格 B-5. 字符串操作

表达式 含义 ${#string} $string的长度     ${string:position}$string中, 从位置$position开始提取子串 ${string:position:length}$string中, 从位置$position开始提取长度为$length的子串     ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串 ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串 ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串 ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串     ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring ${string/#substring/replacement} 如果$string前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ${string/%substring/replacement} 如果$string后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring         expr match "$string" '$substring' 匹配$string开头的$substring*的长度 expr "$string" : '$substring' 匹配$string开头的$substring*的长度 expr index "$string" $substring$string中匹配到的$substring的第一个字符出现的位置 expr substr $string $position $length$string中从位置$position开始提取长度为$length的子串 expr match "$string" '/($substring/)'$string的开头位置提取$substring* expr "$string" : '/($substring/)'$string的开头位置提取$substring* expr match "$string" '.*/($substring/)'$string的结尾提取$substring* expr "$string" : '.*/($substring/)'$string的结尾提取$substring*

* $substring是一个正则表达式.


表格 B-6. 一些结构的汇总

表达式 解释     中括号   if [ CONDITION ] 测试结构 if [[ CONDITION ]] 扩展的测试结构 Array[1]=element1 数组初始化 [a-z] 正则表达式的字符范围     大括号   ${variable} 参数替换 ${!variable} 间接变量引用 { command1; command2; . . . commandN; } 代码块 {string1,string2,string3,...} 大括号扩展         圆括号   ( command1; command2 ) 子shell中执行的命令组 Array=(element1 element2 element3) 数组初始化 result=$(COMMAND) 在子shell中执行命令, 并将结果赋值给变量 >(COMMAND) 进程替换 <(COMMAND) 进程替换     双圆括号   (( var = 78 )) 整型运算 var=$(( 20 + 5 )) 整型运算, 并将结果赋值给变量     引号   "$variable" "弱"引用 'string' "强"引用     后置引用   result=`COMMAND` 在子shell中运行命令, 并将结果赋值给变量
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 别舍不得 实在舍不得 女朋友太漂亮舍不得日 男朋友床上很厉害舍不得分手 消化不良 不良帅 消化不良症状 良莠不齐 指甲营养不良 不良宠婚 不良之谁与争锋 不良之年少轻狂 甲营养不良 不良谁与争锋 宝宝消化不良 不良年少轻狂 蜜爱100分不良鲜妻有点甜 营养不良 不良尤物 不良帅死 不良少年授精母中文字幕 不良鲜妻有点甜 不良帅图片 营养不良症状 消化不良大便图 大唐不良皇婿 良莠不齐意思 不良少年 婴儿消化不良 不良王妃 消化不良吃什么药 不良笑花 新生儿消化不良 孟晓艺不良图片 不良道 不良 宝宝消化不良怎么办 性肌肉营养不良 婴儿消化不良怎么办 不良帅袁天罡结局 不良少女