shell里的` ` $( ) ${ } expr $(( ))
转自:http://blog.sina.com.cn/s/blog_6151984a0100ekz2.html
所有UNIX命令,要取结果或输出,都要用$( )或反引号` `
|
tt=` file test.sh ` echo $tt |
|
#sh test.sh test.sh: ASCII text |
| tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print` |
| 将过去24小时(-mtime –2则表示过去48小时)内修改过的文件tar在一起 |
反引号` `和$(
)缺陷也相同,没回车换行,容易把多行合并
|
[mac@machome ~]$ vi test.sh echo `ps -ef | grep syslog` |
|
[mac@machome ~]$ sh test.sh root 1363 1 0 12:15 ? 00:00:00 syslogd -m 0 mac 15032 15030 0 18:13 pts/2 00:00:00 grep syslog |
|
[macg@machome ~]$ vi test.sh var=$(ls -l) echo $var |
|
[macg@machome ~]$ sh test.sh total 44 -rw-rw-r-- 1 macg macg 126 Jun 8 23:40 1 -rw-rw-r-- 1 macg macg 0 Jun 8 17:53 100 -rw-rw-r-- 1 macg macg 16 Jun 9 19:00 111.txt -rw-rw-r-- 1 macg macg 15 Jun 9 19:00 22.txt -rw-rw-r-- 1 macg macg 15 Jun 9 19:00 33.txt -rw-rw-r-- 1 macg macg 23 Jun 12 19:20 test.sh |
wc-l常与$(
)合用取其输出,计算行数,进而确定循环次数
|
count=$(more iftmp|wc -l) while [ $i -le $count ] |
echo
+$( ) ――echo内也可执行命令,并通过$( )取该命令的输出再显示
常见使用:echo内,用$( )取awk和sed对某些命令修饰后的效果
|
[macg@machome ~]$ vi test #choose a iinterface to config /sbin/ifconfig -a | awk '$2=="Link" {print($1,$3)}' >iftmp echo "choose one of interface to config" i=1 count=$(more iftmp|wc -l) while [ $i -le $count ] do echo "$i)-------- $(sed -n "${i}p" iftmp)" 用sed 修饰输出 ii=$(($i+1)) done |
|
[macg@machome ~]$ sh test choose one of interface to config 1)-------- eth0 encap:Ethernet 2)-------- lo encap:Local 3)-------- sit0 encap:IPv6-in-IPv4 give the interface a host name[such as:xxx-hme0]: |
${
}和$( )的区别:${ } 是做什么用的? --------避免在echo中变量被连读
${i}是区分其后紧接的字符串,避免“连读”
|
$ vi ttt.sh GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|" GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|" echo $GONE |
|
$ sh ttt.sh (ServerType|BindAddress|Port|AddModule|ClearModuleList|AgentLog|RefererLog|RefererIgnore|FancyIndexing |
${i}可以在任何场合替代普通变量$i
|
ttt=${REMOTEHOST} echo ${ttt} |
ttt=$REMOTEHOST echo $ttt |
|
[macg@localhost ~]$ sh ttt.sh 192.168.1.11 |
[macg@localhost ~]$ sh ttt.sh 192.168.1.11 |
expr 数学表达式
shell语言里没有运算公式,必须借助expr语句实现:
| expr 变量 ‘+-x /’ 变量 | expr $a '+' $b |
| expr 常数 ‘+-x /’ 常数 |
[mac@machome ~]$ expr 3 '+' 2 5 |
运算符号都要加引号,单引号双引号均可
输出是结果
为什么if
expr 3 '+' 2 得5,但if仍走then ? 非0应该走else啊
因为expr表达式返回的是"返回值",不是"结果"
|
[mac@machome ~]$ vi test.sh expr 3 '+' 2 echo $? |
|
[mac@machome ~]$ sh test.sh 5 输出5 0 返回0 只要加法成功,返回值就是0,0为真 |
expr
表达式计算完后如何获得结果?——用 $(expr … ) 或反引号` expr …`
其实就是取其输出,expr的输出就是结果
|
var = expr $a '+' $b echo "final is $var" |
var=$(expr $a '+' $b) echo "final is $var" |
|
test.sh: line 7: var: command not found 加法完成后结果赋值出错 final is |
final is 7 |
expr在if语句里,不能用
[ ],因为这里把它当作command
|
[mac@machome ~]$ vi test.sh if [ expr 3 '+' 2 ] ; then echo no5 else echo is5 fi |
|
[mac@machome ~]$ sh test.sh test.sh: line 1: [: too many arguments is5 |
改成
|
[mac@machome ~]$ vi test.sh if expr 3 '+' 2 ; then expr 3 '+' 2相当于command echo no5 else echo is5 fi |
|
[mac@machome ~]$ sh test.sh 5 no5 |
不过如果要进行结果判定,加$(),就必须用[ ]了,因为把它当作表达式了
|
[macg@machome ~]$ vi test.sh if [ $(expr 3 '+' 2) != 5 ];then 而且[和$中间必须有空格 echo no5 else echo is5 fi |
|
[macg@machome ~]$ sh test.sh is5 |
另一种运算格式i++如何实现?------
i=$(($i+1))
|
while [ $i -le $count ] do command i=$(($i+1)) done |
((
))与[ ]作用完全相同
|
echo input: read i i=$(($i+1)) echo $i |
echo input: read i i=$[$i+1] echo $i |
|
[macg@localhost ~]$ sh ttt.sh input: 6 7 |
[macg@localhost ~]$ sh ttt.sh input: 6 7 |
反面证明((
))与[ ]完全相同--------if (( ))
|
if (( $# != 3 )); then echo "usage: $0 host user passwd" fi |
if [ $# != 3 ]; then echo "usage: $0 host user passwd" fi |
|
[macg@localhost ~]$ sh ttt.sh 1 2 usage: ttt.sh host user passwd |
[macg@localhost ~]$ sh ttt.sh 1 2 usage: ttt.sh host user passwd |
随机推荐
- Hive总结(四)hive安装记录
本篇为安装篇较简单: 前提: 1: 安装了hadoop-1.0.4(1.0.3也能够)正常执行 2:安装了hbase-0.94.3, 正常执行 接下来,安装Hive,基于已经安装好的hadoop.过程 ...
- 《Java设计模式》之构建者模式
概述: 构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来.使得相同的构建过程能够创建不同的表示,又称为生成器模式. Bu ...
- EasyPlayerPro Windows流媒体播放器(RTSP/RTMP/HTTP/HLS/File/TCP/RTP/UDP都能播)发布啦
EasyPlayerPro简介 EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP.RTMP.HTTP.HLS.UDP.RTP.File等多种流媒体协议播放.支持本地文件播放,支持本地 ...
- Ioc容器Autofac系列
1.http://blog.csdn.net/xingxing513234072/article/details/9211969 2.asp.net mvc中整合autofachttp://blog. ...
- Eclipse打jar包的方法
1.准备主清单文件 “MANIFEST.MF” Manifest-Version: 1.0 Class-Path: lib/commons-codec.jar lib/commons-httpclie ...
- 九度OJ 1062:分段函数 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3306 解决:1952 题目描述: 编写程序,计算下列分段函数y=f(x)的值. y=-x+2.5; 0<=x<2 y=2-1. ...
- mysql系列之8.mysql高可用 (mha4mysql)
环境: 三台机器 主服务器: 192.168.1.130 主备机器: 192.168.1.131 监控机器: 192.168.1.132 130和131, 是mysql双主架构 1.在三台机器上安装m ...
- Grunt学习笔记【7】---- grunt-contrib-less插件详解
本文主要讲如何使用Grunt实现less文件压缩. 一 说明 less是非常常用的样式框架之一,Grunt也提供了可以编译和打包less样式文件的插件:grunt-contrib-less. 实现原理 ...
- hadoop2.3安装过程及问题解决
三台serveryiprod01,02,03,当中01为namenode,02为secondarynamenode.3个均为datanode 3台server的这里提到的配置均需一样. 0.安装前提条 ...
- GCC的-wl,-rpath=参数
使用GCC编译动态链接库的项目时,在其他目录下执行很可以出现找不到动态链接库的问题. 这种情况多发生在动态链接库是自己开发的情况下,原因就是程序运行时找不到去何处加载动态链接库. 可能会说在编译时指定 ...