我正在編寫一個shell腳本來輸入多個文件夾。 我目前在shell變量中存儲文件夾的名稱,如path="October\ @012/"
。 如果我做cd $path
我收到錯誤慶典:CD:十月\:沒有這樣的文件或目錄Shell腳本輸入目錄(文件夾名稱包含空格)
我在做什麼錯?
我正在編寫一個shell腳本來輸入多個文件夾。 我目前在shell變量中存儲文件夾的名稱,如path="October\ @012/"
。 如果我做cd $path
我收到錯誤慶典:CD:十月\:沒有這樣的文件或目錄Shell腳本輸入目錄(文件夾名稱包含空格)
我在做什麼錯?
這是雙引號的(主要)函數,它在csh和* sh shell中是真的。
cd "$TARGET"
應該這樣做。
Shell變量在"..."
內擴展(與'...'
不同),但當shell解析命令行以構造傳遞給程序的字符串時,引用的文本被視爲單個參數。
例如:
% ls -F
October @012/
% TARGET="October @012"
% cd $TARGET
bash: cd: October: No such file or directory
% cd "$TARGET"
% pwd
/tmp/t/October @012
%
簡單!
你在做什麼錯在你最初的例子是逃避空間裏面的報價。該空間不必轉義兩次,並且由於這個冗餘\
出現在引號內部,所以它只在TARGET變量中插入一個反斜槓。例如:
% TARGET="October\ @012" # wrong!
% ls
October @012/
% cd $TARGET
bash: cd: October\: No such file or directory
% cd "$TARGET"
bash: cd: October\ @012: No such file or directory
%
如果目錄被命名爲October\ @012
的TARGET
此設置只會工作,在這一個反斜槓(不推薦!):
% mkdir October\\\ @012
% ls -F
October\ @012/
% cd "$TARGET"
% pwd
/tmp/t/October\ @012
%
(EDITED添加例子)
編輯:我最初寫了推薦使用大括號。當我半夜醒來並修改我的答案時,我寫了這個。
首先它實際上取決於其殼您在編寫腳本如果是bash的,那麼你可以嘗試使用在你的變量名引號:
TARGET="October @012"
cd "$TARGET"
這在其他貝殼工作以及。我建議你嘗試一下。
編輯:
在重新審視這個看起來你是在逃避你的表達錯誤部分。試試這個:
path="October \@012"
cd "$path"
謝謝您的回覆,它將10月和@ 012作爲兩個不同的文件夾。 但文件夾名稱是「October @ 012」(空格分隔),我也試過ur方法,但得到這個錯誤 bash:cd:October:沒有這樣的文件或目錄 – anand2308
不,這不是'$ {的功能。語法。在這裏,'$ {TARGET}'將被擴展爲'cd October @ 012',然後像空前一樣將空格分割成單詞。 '$ {...}'用於擴展可能會被混淆的情況(例如'$ TARGETX' vs'$ {TARGET} X',或者你想做其他處理的地方(比較'echo $ foo',其中$ foo未定義, vs'echo $ {foo:-bar}') –
這就是我在半夜醒來時似乎無法入睡時回答問題所得到的結果當我以前使用過這個功能時,我一直在解決問題你諾曼處理,一起包裹在引號「」,以解決OP問題。 – zzzirk
謝謝你指出我的愚蠢在睡眠不足時在深夜回答問題。您當然是對的,我在看到您正確回答問題之前編輯了我的答案。 – zzzirk
請幫我這個:我正在寫一個shell腳本來輸入多個文件夾。我目前將文件夾的名稱存儲在shell變量中,如path =「October \ @ 012 /」。如果我做CD $路徑,我收到錯誤bash:cd:October \:沒有這樣的文件或目錄 我在做什麼錯? – anand2308
謝謝你諾曼,這工作 也感謝您的解釋,它幫助了很多 – anand2308