2010-12-18 35 views
0

我有一個腳本編寫了unix shell語言(不是在bash或任何其他shell中,在sh中),它打印給定usb的掛載點(例如,它需要usb的路徑作爲/ dev/sdb1)作爲參數)。那就是:在shell中打印字符串的問題

#!/bin/sh 
# usage: get_mount [path] 
# returns: mount pount of given usb path 

pth=$1 
echo $pth 
mountPoint="`df -h | grep $pth | tr -s \" \"| cut \"-d \" -f6`" 
echo $mountPoint 

的問題是,當我運行它,它只是輸出一個空字符串,我知道命令的工作,因爲我在也沒有問題的終端嘗試過:它只是給它分配到一個變量是什麼不工作。有人有主意嗎? Thx提前!

+0

此腳本與我係統的'df -h'(/ dev/fd)中列出的唯一設備一起工作。你可以發佈你的'df -h'輸出的相關部分嗎? – DVK 2010-12-18 23:09:19

+0

你能給我們一個樣本輸入和期望的輸出嗎?我相當肯定sh會有一定數量的參數擴展技術來完全消除對tr和/或切割的需求 – SiegeX 2010-12-18 23:09:38

回答

2

你會通過有效使用單引號和雙引號簡化你的生活:

mountPoint="`df -h | grep $pth | tr -s ' ' | cut -d' ' -f6`" 

調試這個第一步是去除cut命令,看看它生產:

mountPoint="`df -h | grep $pth | tr -s ' '`" 
echo $mountPoint 

它還能打印6個(或更多)列嗎?

請注意,如果拼寫錯誤,那麼grep將不會傳遞給cut

在我的機器(在Mac),我得到的輸出df -h

Filesystem  Size Used Avail Capacity Mounted on 
/dev/disk0s2 465Gi 189Gi 277Gi 41% /
devfs   111Ki 111Ki 0Bi 100% /dev 
map -hosts  0Bi 0Bi 0Bi 100% /net 
map auto_home 0Bi 0Bi 0Bi 100% /home 
/dev/disk1s1 1.8Gi 8.8Mi 1.8Gi  1% /Volumes/BLACKBERRY 

注意一些文件系統名稱已經在他們的空間。這不太可能成爲你的問題的一個因素,但它可能會拋出一些東西(安裝點然後是字段7)。

+0

在Solaris上,df -h爲每個掛載點提供2行輸出 – DVK 2010-12-18 23:25:32

+0

謝謝!我記得也嘗試使用單引號,它不工作,但由於某種原因,現在它......謝謝! – 2010-12-18 23:28:40

+0

@DVK:每個FS的兩行輸出也會搞砸 - 但OP說它可以從命令行工作... – 2010-12-18 23:30:40

0

移動在切-d前的\」到-d後

mountPoint="`df -h | grep $pth | tr -s \" \"| cut -d \" \" -f6`" 
+1

這不是它;該報價有助於指定字段分隔符爲空。 – 2010-12-18 23:08:44

+0

我修正了@Jonathan。 – 2010-12-18 23:20:48

+0

是的......但是'-d'的參數可以附加到它,並且問題中的原始符號通過使用'「-d」'將空白作爲參數傳遞給'-d'來實現。我想''-d''「',但原文沒問題,儘管我的腳本中沒有這樣的表單。 – 2010-12-18 23:25:38