您的位置:首页 > 运维架构 > Shell

几个shell小技巧

2010-11-29 16:27 232 查看
1. expr 命令

由于bash 是功能有限的解释器,所以自身并没有支持太多的算术运算,一切都是字符串。所以如果涉及到算术运算,需要借助其他的工具,比如bc(功能比较强大的小工具),expr 和$(())算术扩展.

expr 支持几个常见的算术运算+ ,--, * , /, %(取模),
.

wolf@debian:~$ sum=1
wolf@debian:~$ sum=`expr $sum + 11`
wolf@debian:~$ echo $sum
12
wolf@debian:~$ expr $sum / 2
6
wolf@debian:~$ expr $sum * 2  #错误,下面给出答案
expr: 语法错误
wolf@debian:~$ expr $sum - 2
10
wolf@debian:~$ expr $sum ** 2 #不支持指数运算
expr: 语法错误
wolf@debian:~$ expr $sum % 5
2
wolf@debian:~$ expr $sum
12
wolf@debian:~$ expr $sum /* 2  #这里是关键,*需要转义
24
wolf@debian:~$ expr $sum /** 2  #因为不支持指数运算,转义了也没用,下同.
expr: 语法错误
wolf@debian:~$ expr $sum /*/* 2
expr: 语法错误


expr还支持常见的关系运算,比如 = ,!= , >, >= , <, <=:

wolf@debian:~$ expr 1 = 2
0
wolf@debian:~$ expr 1 != 2
1
wolf@debian:~$ expr 1 > 2
wolf@debian:~$ echo $?
0
wolf@debian:~$ expr 1 >= 2  #为什么呢?
expr: 语法错误
wolf@debian:~$ expr 1 />= 2
0
wolf@debian:~$ expr 1 /> 2
0
wolf@debian:~$ expr 1 /< 2
1
wolf@debian:~$ expr 1 /<= 2
1


题外话:如果要想计算指数,如何做呢?给出两种方案:

wolf@debian:~$ let a="3**3"  #使用let关键字,注意let是必须的
wolf@debian:~$ echo $a
27
wolf@debian:~$ b="3**3"  #如果没有let关键字,则只是普通扩展
wolf@debian:~$ echo $b
3**3
wolf@debian:~$ a=$(( 3**3 ))  #这里使用了$(())扩展
wolf@debian:~$ echo $a
27


2. $() 扩展和``扩展

这两个扩展,按照我的经验,没有什么本质的区别,都是迫使命令执行,

wolf@debian:~$ a=`expr 1+2`  #一定要注意,expr命令后的参数一定要分开
wolf@debian:~$ echo $a
1+2
wolf@debian:~$ a=`expr 1 + 2`  #这里就是分开的参数
wolf@debian:~$ echo $a
3
wolf@debian:~$ a=$( expr 1 + 2 )
wolf@debian:~$ echo $a
3


3. 在平时工作中,会遇到要向一些只有root才能有权限进入的目录里放入一些文件,比如/var/www目录里放一些音乐,但又不想破坏文件原有的属性。这时可以使用sudo(我讨厌sudo),或者cp的一个选项 -p

root@debian:/home/wolf# cp big.c /tmp
root@debian:/home/wolf# ls -l /tmp/big.c
-rw-r--r-- 1 root root 1907 11月 29 16:37 /tmp/big.c
root@debian:/home/wolf# cp -p big.c /tmp
root@debian:/home/wolf# ls -l /tmp/big.c
-rw-r--r-- 1 wolf wolf 1907 10月 31 10:44 /tmp/big.c


4.xargs

手册页中,对于xargs是这样描述的:

xargs 从 标准 输入 读入 参数. 参数 用 空格(可以 用 双引号 单引号 或

反斜杠 转意) 或者 回车 隔开. 然后 一次 或者 多次 执行 命令 command (默认 是 /bin/echo), 其 参数 是

initial-arguments 后面 再 加上 从 标准 输入 读入 的 参数. 标准 输入中 的 空格 被 忽略.


再来看看xargs的参数,

xargs [-0prtx] [-e[eof-str]] [-i[replace-str]] [-l[max-lines]] [-n max-

args] [-s max-chars] [-P max-procs] [--null] [--eof[=eof-str]]

[--replace[=replace-str]] [--max-lines[=max-lines]] [--interactive]

[--max-chars=max-chars] [--verbose] [--exit] [--max-procs=max-procs]

[--max-args=max-args] [--no-run-if-empty] [--version] [--help] [command

[initial-arguments]]


简单的说,xargs 从标准输入得到参数,然后执行command (由于command是可选的,所以如果不提供的话,默认是执行/bin/echo命令)

command参数一方面是标准输入,另一方面是command位置提供.

wolf@debian:~$ find ./os -type f | xargs grep mandriva
匹配到二进制文件 ./os/mandriva-linux-one-2010-spring-GNOME-africa-asia-cdrom-i586.iso
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: