新聞中心

創(chuàng)新互聯(lián)建站主營(yíng)吳興網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開(kāi)發(fā),吳興h5重慶小程序開(kāi)發(fā)搭建,吳興網(wǎng)站營(yíng)銷(xiāo)推廣歡迎吳興等地區(qū)企業(yè)咨詢(xún)
Shell 中有兩種方式可以完成命令替換,一種是反引號(hào)
` `,一種是
$(),使用方法如下:
variable=`commands`
variable=$(commands)
其中,variable 是變量名,commands 是要執(zhí)行的命令。commands 可以只有一個(gè)命令,也可以有多個(gè)命令,多個(gè)命令之間以分號(hào)
;分隔。
例如,date 命令用來(lái)獲得當(dāng)前的系統(tǒng)時(shí)間,使用命令替換可以將它的結(jié)果賦值給一個(gè)變量。
#!/bin/bash begin_time=`date` #開(kāi)始時(shí)間,使用``替換 sleep 20s #休眠20秒 finish_time=$(date) #結(jié)束時(shí)間,使用$()替換 echo "Begin time: $begin_time" echo "Finish time: $finish_time"
運(yùn)行腳本,20 秒后可以看到輸出結(jié)果:
Begin time: 2019年 04月 19日 星期五 09:59:58 CST
Finish time: 2019年 04月 19日 星期五 10:00:18 CST
使用 data 命令的
%s格式控制符可以得到當(dāng)前的 UNIX 時(shí)間戳,這樣就可以直接計(jì)算腳本的運(yùn)行時(shí)間了。UNIX 時(shí)間戳是指從 1970 年 1 月 1 日 00:00:00 到目前為止的秒數(shù),不了解的讀者請(qǐng)猛擊這里。
#!/bin/bash
begin_time=`date +%s` #開(kāi)始時(shí)間,使用``替換
sleep 20s #休眠20秒
finish_time=$(date +%s) #結(jié)束時(shí)間,使用$()替換
run_time=$((finish_time - begin_time)) #時(shí)間差
echo "begin time: $begin_time"
echo "finish time: $finish_time"
echo "run time: ${run_time}s"
運(yùn)行腳本,20 秒后可以看到輸出結(jié)果:
begin time: 1555639864
finish time: 1555639884
run time: 20s
第 6 行代碼中的
(( ))是 Shell 數(shù)學(xué)計(jì)算命令。和 C++、C#、Java 等編程語(yǔ)言不同,在 Shell 中進(jìn)行數(shù)據(jù)計(jì)算不那么方便,必須使用專(zhuān)門(mén)的數(shù)學(xué)計(jì)算命令,
(( ))就是其中之一。更多細(xì)節(jié)我們將會(huì)在《Shell數(shù)學(xué)計(jì)算》一節(jié)中詳細(xì)講解。
注意,如果被替換的命令的輸出內(nèi)容包括多行(也即有換行符),或者含有多個(gè)連續(xù)的空白符,那么在輸出變量時(shí)應(yīng)該將變量用雙引號(hào)包圍,否則系統(tǒng)會(huì)使用默認(rèn)的空白符來(lái)填充,這會(huì)導(dǎo)致?lián)Q行無(wú)效,以及連續(xù)的空白符被壓縮成一個(gè)。請(qǐng)看下面的代碼:
#!/bin/bash LSL=`ls -l` echo $LSL #不使用雙引號(hào)包圍 echo "--------------------------" #輸出分隔符 echo "$LSL" #使用引號(hào)包圍
運(yùn)行結(jié)果:
total 8 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 35 10月 31 10:20 demo.sh~ -------------------------- total 8 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 35 10月 31 10:20 demo.sh~
所以,為了防止出現(xiàn)格式混亂的情況,我建議在輸出變量時(shí)加上雙引號(hào)。
再談反引號(hào)和 $()
原則上講,上面提到的兩種變量替換的形式是等價(jià)的,可以隨意使用;但是,反引號(hào)畢竟看起來(lái)像單引號(hào),有時(shí)候會(huì)對(duì)查看代碼造成困擾,而使用 $() 就相對(duì)清晰,能有效避免這種混亂。而且有些情況必須使用 $():$() 支持嵌套,反引號(hào)不行。
下面的例子演示了使用計(jì)算 ls 命令列出的第一個(gè)文件的行數(shù),這里使用了兩層嵌套。
[c.biancheng.net]$ Fir_File_Lines=$(wc -l $(ls | sed -n '1p'))
[c.biancheng.net]$ echo "$Fir_File_Lines"
36 anaconda-ks.cfg
要注意的是,$() 僅在 Bash Shell 中有效,而反引號(hào)可在多種 Shell 中使用。所以這兩種命令替換的方式各有特點(diǎn),究竟選用哪種方式全看個(gè)人需求。
當(dāng)前標(biāo)題:Shell命令替換:將命令的輸出結(jié)果賦值給變量
當(dāng)前地址:http://fisionsoft.com.cn/article/dpcodpe.html


咨詢(xún)
建站咨詢(xún)
