二进制输出不支持,需要自己做转换
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
shell printf
mac=`echo 0x$mac`
#将十六进制转化为十进制
mac=`printf "%d" $mac`
let "mac = $mac + 1"
#将十进制转化为十六进制
mac=`printf "%x" $mac`
awk '{for(i=1;i<=NF;i++) $i=strtonum("0x"$i);print}'
shell中字符串测试
(请务必注意 [ ] 之间的空格键﹗) 用哪一种格式没所谓,都是一样的效果。(我个人比较喜欢后者...)
其次,bash 的 test 目前支持的测试对像只有三种:
* string:字符串,也就是纯文字。
* integer:整数( 0 或正整数,不含负数或小数点)。
* file:文件。
请初学者一定要搞清楚这三者的差异,因为 test 所用的 expression 是不一样的。
以 A=123 这个变量为例:
* [ "$A" = 123 ]:是字符串的测试,以测试 $A 是否为 1、2、3 这三个连续的"文字"。
* [ "$A" -eq 123 ]:是整数的测试,以测试 $A 是否等于"一百二十三"。
* [ -e "$A" ]:是关于文件的测试,以测试 123 这份"文件"是否存在。
第三,当 expression 测试为"真"时,test 就送回 0 (true) 的 return value ,否则送出非 0 (false)。
若在 expression 之前加上一个 " ! "(感叹号),则是当 expression 为"假时" 才送出 0 ,否则送出非 0 。
同时,test 也允许多重的覆合测试:
* expression1 -a expression2 :当两个 exrepssion 都为 true ,才送出 0 ,否则送出非 0 。
* expression1 -o expression2 :只需其中一个 exrepssion 为 true ,就送出 0 ,只有两者都为 false 才送出非 0 。
例如:
代码:
[ -d "$file" -a -x "$file" ]
是表示当 $file 是一个目录、且同时具有 x 权限时,test 才会为 true 。
第四,在 command line 中使用 test 时,请别忘记命令行的"重组"特性,
也就是在碰到 meta 时会先处理 meta 再重新组建命令行。(这个特性我在第二及第四章都曾反复强调过) 比方说,若 test 碰到变量或命令替换时,若不能满足 expression 格式时,将会得到语法错误的结果。
举例来说好了:
关于 [ string1 = string2 ] 这个 test 格式, 在 = 号两边必须要有字符串,其中包括空(null)字符串(可用 soft quote 或 hard quote 取得)。 假如 $A 目前没有定义,或被定议为空字符串的话,那如下的写法将会失败:
代码:
$ unset A
$ [ $A = abc ]
[: =: unary operator expected
这是因为命令行碰到 $ 这个 meta 时,会替换 $A 的值,然后再重组命令行,那就变成了: [ = abc ]
如此一来 = 号左边就没有字符串存在了,因此造成 test 的语法错误﹗ 但是,下面这个写法则是成立的:
代码:
$ [ "$A" = abc ]
$ echo $?
1
这是因为在命令行重组后的结果为: [ "" = abc ] 由于 = 左边我们用 soft quote 得到一个空字符串,而让 test 语法得以通过... 读者诸君请务必留意这些细节哦,因为稍一不慎,将会导至 test 的结果变了个样﹗
若您对 test 还不是很有经验的话,那在使用 test 时不妨先采用如下这一个"法则":
* 假如在 test 中碰到变量替换,用 soft quote 是最保险的﹗
若你对 quoting 不熟的话,请重新温习第四章的内容吧... ^_^
okay,关于更多的 test 用法,老话一句:请看 man page 吧﹗ ^_^
阅读(1435) | 评论(0) | 转发(0) |