转自: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

随机推荐

  1. A20地址线问题

    [0]README text description from Zhaojiong's perfect analysis of Linux kernel . [1]A20地址线问题(干货来了) 198 ...

  2. 8148之更换摄像头出现异常---REISZER OVERFLOW OCCURED: RESTARTING

    my iss config as: rsz_reg->SRC_VSZ  = 1079;//715;    rsz_reg->SRC_HSZ  = 1919;//1277; rszA_reg ...

  3. kfaka windows安装

    1 官网下载 解压到D:\developTools\kfaka\kafka_2.10-0.9.0.0 2 windows cmd启动 新开cmd命令:cd /d D:\developTools\kfa ...

  4. iOS项目 -- 模仿花椒直播做的第一层次界面

    公最近直播比较火爆,我也跟跟风,自己做一个直播app, 现在打算用金山云直播的,但是去注册的时候,联系那边的工作人员,他们讲使用金山云直播要有公司和他们线下签约才能授权开放直播平台. 怎么办呢?于是我 ...

  5. Continuously Integrate

     Continuously Integrate David Bartlett THE Build AS A "Big BAng" EvEnT in project develop ...

  6. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  7. 通用安防摄像机通过RTSP转RTMP推流进行H5(RTMP/HLS)直播的方案

    EasyNVR摄像机无插件直播方案 随着互联网的发展,尤其是移动互联网的普及,基于H5.微信的应用越来越多,企业也更多地想基于H5.微信公众号来快速开发和运营自己的视频及视频相关性产品,那么传统的安防 ...

  8. sqlite与sqlserver区别

    1.查询时把两个字段拼接在一起 --sqlserver-- select Filed1+'@'+Filed2 from table --sqlite-- select Filed1||'@'||Fil ...

  9. Grunt学习笔记【5】---- expand使用方法

    本文主要讲expand使用方法. 当你希望处理大量的单个文件时,这里有一些附加的属性可以用来动态的构建一个文件列表.这些属性都可以用于 Compact 和 Files Array 文件映射格式. ex ...

  10. BZOJ2328: [HNOI2011]赛车游戏

    BZOJ2328: [HNOI2011]赛车游戏 Description 题解Here! 一开始被题面那一长串的描述吓到了,一直没敢做... 然后尝试着硬着头皮读懂题面. 然后...这不是贪心么??? ...