2012-10-11 40 views
7

我正在嘗試編寫一個採用參數basename的腳本,然後檢查該參數是否有擴展名。如果有,它會打印擴展名。Bash basename語法

這裏是我的代碼:

​​

我呼應最後$基名$ 1檢查基本名稱的輸出是什麼。

一些測試表明:

testfile.sh one.two 
./testfile: line 2: one.two: command not found 
one.two 

testfile.sh ../tester 
./testfile: line 2: ../tester: No such file or directory 
../tester 

所以既不1 $ $基名正在努力。我知道這是一個語法錯誤,所以有人可以解釋我做錯了什麼?

編輯:

我現在已經解決了我的問題:

file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

從而降低了我的論點爲基本名,謝謝大家。

+0

正確的語法是file = $(basename $ 1)。我建議你使用file = $ {1 ## * /},它將刪除每個'* /'序列。它實際上比basename命令快得多,特別是在循環中處理文件時。 –

回答

12

首先,你的語法是錯誤的:

file=$(basename "$1") 

第二,這是正確的表達來獲取文件名的(最後)擴展:

ext=${file##*.} 
+0

感謝第一部分,我意識到現在文件等於基本名稱的輸出,所以這有助於。現在我的程序沒有按照預期工作,這意味着如果我的初始參數是tester.two,那麼它就是輸出tester.two而不是.two。在我添加基本名稱之前,我的腳本正在按照預期輸出,除了當我測試../tester時,它不會輸出任何內容。 – Unknown

8

如果你想分配給一個變量一個命令的輸出,您必須執行它,或者用後引號或使用特殊括號引用:

file=`basename "$1"` 
file=$(basename "$1") 

要刪除文件擴展名,你應該做的

ext=${file#*.} 

這將得到$file的值,然後刪除了一切的時期(這就是爲什麼它是必要的)。如果您的文件名包含句點,那麼您應該使用ext=${file##*.},其中##告訴bash刪除最長的字符串,而不是最短的字符串,所以它將刪除到最後一個時間段,而不是第一個。

Your echo $basename $1 is wierd。它告訴bash打印一個名爲$basename的變量的值和變量$1的值,這是腳本(或函數)的第一個參數。

如果你要打印你要執行的命令,這樣做:

echo basename $1 

如果你想打印命令的輸出,你可以做一個:

echo $(basename "$1") 
echo "$file" 
basename "$1" 

希望這有助於=)