a=3 echo "b=$a+2" # 显示 b=3+2 echo 'b=$a+2' # 显示 b=$a+2
在 bash 中,
单引号 可以保证引用区域内的文字不被转换,起到保护作用,一般可以用在显示 code 之类;
双引号 可以包含文字或者函数段。其中,反引号中的函数,$ 开头的变量和 \ 开头反转换的字符外,其他都是直接输出。
之所以用双引号,是因为在bash中的变量替换发生在双引号内,如果不用引号,bash会把它们解释为命令。
a=3 echo "b=$a+2" # 显示 b=3+2 echo 'b=$a+2' # 显示 b=$a+2
在 bash 中,
单引号 可以保证引用区域内的文字不被转换,起到保护作用,一般可以用在显示 code 之类;
双引号 可以包含文字或者函数段。其中,反引号中的函数,$ 开头的变量和 \ 开头反转换的字符外,其他都是直接输出。
之所以用双引号,是因为在bash中的变量替换发生在双引号内,如果不用引号,bash会把它们解释为命令。
以下摘自 www.tnc.edu.tw,by 臥龍小三。原文
Bash shell 的算術運算有四種方式。
第一種:使用 expr 這個外部程式
加法 r=`expr 4 + 5`
echo $r
注意! '4' '+' '5' 這三者之間要有空白
注意! 以下是錯誤的寫法:
r=`expr 4 * 5`
原因:* 對 bash 而言有特殊意義(萬用字元),所以要改用以下寫法:
乘法 r=`expr 4 \* 5`
也就是說用 \ 取消 * 的特殊意義。
第二種:使用 $(( ))
上述計算,可用以下方式來做:
r=$(( 4 + 5 ))
echo $r
第三種:使用 $[ ]
上述計算,可用以下方式來做:
r=$[ 4 + 5 ]
echo $r
乘法
r=`expr 4 \* 5`
r=$(( 4 * 5 ))
r=$[ 4 * 5 ]
echo $r
除法
r=`expr 40 / 5`
r=$(( 40 / 5 ))
r=$[ 40 / 5 ]
echo $r
減法
r=`expr 40 – 5`
r=$(( 40 – 5 ))
r=$[ 40 – 5 ]
echo $r
求餘數
r=$[ 100 % 43 ]
echo $r
乘冪 (如 2 的 3 次方)
r=$(( 2 ** 3 ))
r=$[ 2 ** 3 ]
echo $r
註:expr 沒有乘冪
Bash 的第四種算術運算方法,它使用 let 這個命令,如下所示:
加法: n=10 let n=n+1 echo $n 結果為 11 乘法: let m=n*10 echo $m 結果為 110 除法: let r=m/10 echo $r 求餘數: let r=m%7 echo $r 乘冪: let r=m**2 echo $r |
雖然 Bash shell 有數種算術運算方法,但並不是每一種方法都可以跨平台,若您的 script 檔要在其它平台上使用,建議最好用 expr 這種方式,或許可攜性會好一點。
另外,我們在 script 中經常需要把某一變數做加一運算,以下四法皆可:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1))
let m=m+1
这个问题可以通过一行命令完成(当然是通过管道 “|” 所包含多条命令啦)。首先需要拆分这个问题。
[edwin@edwinW /]# ls Dropbox bin boot data dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var wwwroot [edwin@edwinW /]# ls -l | grep ^d drwxrwxrwx 6 nobody nobody 4096 Jul 19 05:00 Dropbox drwxr-xr-x 2 root root 4096 May 11 19:58 bin drwxr-xr-x 2 root root 4096 May 11 19:58 boot drwxr-xr-x 3 mysql mysql 4096 Apr 12 19:35 data drwxr-xr-x 12 root root 13420 Jul 5 21:45 dev drwxr-xr-x 53 root root 4096 Jul 12 20:38 etc drwxr-xr-x 6 root root 4096 May 11 19:58 home drwxr-xr-x 9 root root 4096 Jul 1 00:02 lib drwxr-xr-x 7 root root 4096 Jul 1 00:01 lib64 drwx------ 2 root root 16384 May 18 2010 lost+found drwxr-xr-x 2 root root 4096 May 11 19:58 media drwxr-xr-x 3 root root 4096 Jun 12 21:32 mnt drwxr-xr-x 2 root root 4096 May 11 19:58 opt dr-xr-xr-x 96 root root 0 Jul 5 21:45 proc drwxr-x--- 8 root root 4096 Jul 12 20:07 root drwxr-xr-x 2 root root 4096 Jul 1 00:02 sbin drwxr-xr-x 2 root root 4096 May 11 19:58 selinux drwxr-xr-x 2 root root 4096 May 11 19:58 srv drwxr-xr-x 13 root root 0 Jul 5 21:45 sys drwxrwxrwt 6 root root 94208 Jul 19 23:39 tmp drwxr-xr-x 15 root root 4096 Jun 12 21:24 usr drwxr-xr-x 18 root root 4096 Jun 12 21:24 var
[edwin@edwinW /]# ls -l | grep ^d | awk '{print $9}' Dropbox bin boot data dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
[edwin@edwinW /]# ls -l | grep ^d | awk '{print $9}' | xargs -i tar jcvf {}.tbz {}
其实 Linux 下很多问题都可以这样一步一步分解成不同部分,用不同命令组合来完成,这就是 bash 脚本的精髓。
参考:
awk:http://linux.die.net/man/1/awk;http://www.gnu.org/software/gawk/manual/gawk.html
xargs:http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs;http://en.wikipedia.org/wiki/Xargs