2011-09-16 39 views
0

我很難得到這個bash腳本來執行格式化的輸入。 它非常直接,但是當它執行以'newstring ='開頭的行時,它不執行sed操作,它只打印我的輸入(直到第一個空格),然後直接打印我的sed命令後。我究竟做錯了什麼?簡單的bash腳本給我的問題

#! /bin/bash 

##format paths/strings with spaces to escape the spaces with a forward-slash'\' 
##then use 'open' to open finder at current-set directory (based on path) 

oldstring="$1" 
newstring="$oldstring | sed 's/ /\\ /g')" 
cd $newstring 
open . 

回答

4

嘗試把命令在反引號像

newstring=`echo "$oldstring" | sed 's/ /\\ /g')` 
+2

但是,使用'newstring = $(echo「$ oldstring」| sed's// \\/g')'好多了。 –

+1

另外,在'bash'(但不是其他的shell AFAIK)中,你可以使用:'newstring = $(sed's// \\/g'<<<「$ oldstring」)''。 '$ oldstring'周圍的雙引號可能不是必需的,但是不會造成任何傷害。 –

+0

並且,在陳述結尾處刪除懸掛''' –

5

你應該簡單地做:

cd "$1" 
open . 

這避免了跑分過程並處理各種問題的sed腳本沒有按」 t(例如包含$符號的名稱或其他shell元字符)。通常,如果一個變量(或位置參數,如$1)是一個可能包含空格的文件名,則每次都用雙引號括起來。

+0

哇。謝謝。簡單的解決方案永遠是最好的。 – i4n

+2

+1,但通常您應該引用所有變量擴展。 – Sorpigal

1

@Jonathan Leffler's是正確的解決方案,因爲添加轉義實際上並沒有做你想做的事情,而是雙引號。不過,我會藉此機會指出,有一個更好的方式來增加使用bash內置的替代能力,而不是sed逃逸:

newstring="${oldstring/ /\\ }" 

所以如果你擁有它,更好的方式來實現錯解。就我個人而言,我投贊成喬納森的。