所有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 | grepsyslog` |
[mac@machome ~]$ sh test.sh root 1363 1 0 12:15 ? 00:00:00 syslogd -m 0 mac 15032 15030 0 18:13pts/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 macgmacg 0 Jun 8 17:53 100 -rw-rw-r-- 1 macg macg 16 Jun 9 19:00111.txt -rw-rw-r-- 1 macg macg 15 Jun 9 19:00 22.txt -rw-rw-r-- 1macg macg 15 Jun 9 19:00 33.txt -rw-rw-r-- 1 macg macg 23 Jun 1219: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 notfound 加法完成后结果赋值出错 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 ;thenexpr 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 |