2013-03-24 91 views
1

在bash,我需要的整數變量,像這樣:擊:分配命令替換的輸出變量的整數

declare -i n_jobs 

要被分配爲一個值電流後臺作業的數量:

jobs | wc -l 

如果我將其指定爲這樣:

n_jobs=$(jobs | wc -l) 

是看起來像一個工作整數,例如:

echo $((++n_jobs)) 

但是...打印出來(不運行上面的增量)提醒我,它包含空格:

$ echo "$n_jobs" 
$ <space><space><space><space><space>4 

,所以我採取這種結構:

n_jobs=$(($(jobs | wc -l))) 

強制立即「鑄造」到int

是否有更好的方式來取得命令替換列表的輸出並將其作爲整數分配給變量?

+1

bash中的整數標誌幾乎從不使用。你爲什麼真的在乎它在這裏? – 2013-03-24 23:41:23

+0

試試'$ echo $ n_jobs'而不是'$ echo'$ n_jobs「' – 2013-03-24 23:42:42

+0

如果這個標誌存在,它會將一個變量標記爲_int_,我知道我只需要_int_,爲什麼我不會使用它呢?國旗,設計完全是爲了表達這種情況? – Robottinosino 2013-03-24 23:42:55

回答

2

不過bash特異性,但得到的自由空間整數的更清潔的方式可能是:符合POSIX標準的

job_pids=($(jobs -p)) 
n_jobs=${#job_pids[@]} 

一個版本:

n_jobs=$(jobs -p | awk '{print NR}') 

(該-p ISN沒有必要,但你真的不需要任何東西,每個作業都需要一條獨特的線路,以便喂到awk,所以不妨將線條儘可能簡短。)

+0

哇......我**喜歡**這個! – Robottinosino 2013-03-25 00:38:46

3

這是不是真的有必要,但你可以這樣做:

n_jobs=$(($n_jobs + 0)) 

或者

n_jobs=`expr $(jobs | wc -l)` 

我會建議你實際上避免declare ...它存在於只有一個外殼,它沒有被Posix指定。

shell部分是一個宏處理器,在其標準化形式中,所有變量都保持爲字符串。這對於適用於shell的作業來說並不是一個很大的障礙,並且增加了declare和整數變量使得bash只在顯微鏡下更適合於複雜的事情。

在Ruby,Python,Perl,Go或甚至類似node.js的東西中執行那些更復雜的事情。

順便說一下,我無法重現您的原始問題。當使用declare -i時,它確實似乎在算術上評估你的表達,而且它似乎並沒有結束任何前導空格。

declare -i qn_jobs 
qn_jobs=$(jobs | wc -l) 
echo "x$qn_jobs" 
# => x0 
+0

那麼,我是初學者,我忘了提及這一點。 – Robottinosino 2013-03-24 23:49:56

+0

當然,np。雖然我喜歡bash,因爲它有很好的互動功能,並且包含了csh!歷史機制,它太複雜了,不容易消化手冊頁並學習shell編程。在Linux上,您可能需要安裝破折號,除非獲得可讀的手冊頁。這是另一個很簡單的主要是純Posix功能:http://netbsd.gw.com/cgi-bin/man-cgi?sh+​​+NetBSD-current(這是殼破折號是基於。) – DigitalRoss 2013-03-24 23:58:28

+0

認真?我只聽說過很少的「短跑」......你是否推薦它比Bash,甚至? – Robottinosino 2013-03-24 23:59:48