2012-08-28 176 views
69

下面的代碼有什麼問題?如何在shell腳本中刪除文件名的擴展名?

​​3210

就這樣,我得到了字符串'$ filename | cut -f1 -d'。'但如果我刪除引號,我什麼都沒有得到。同時打字

"test.exe" | cut -f1 -d'.' 

在一個shell給我輸出我想要的「測試」。我已經知道$ filename已被分配正確的值。我想要做的是將一個變量分配給沒有擴展名的文件名。

+5

'基本名$文件名.exe'會做同樣的事情。假設你總是知道你想要刪除的擴展名。 – mpe

+3

@mpe,你的意思是'basename「$ filename」.exe'。否則帶空格的文件名將是個壞消息。 –

回答

49

當您想在腳本/命令中執行命令時,您應該使用$(command)。

所以,你的行會

name=$(echo $filename | cut -f 1 -d '.') 

代碼解釋:

  1. echo得到變量$filename的值,並將其發送到標準輸出
  2. 然後我們搶輸出和管道它cut指令
  3. cut將使用。作爲分隔符(也稱爲分離器),用於切割串入段,並通過-f我們選擇我們想在輸出
  4. 然後$()包裝將得到的輸出並返回該細分市場的價值
  5. 的返回值將是分配給名爲變量name
+0

謝謝。我也注意到我需要使用echo命令。 name ='echo $ filename | cut -f1 -d'。'' – mimicocotopus

+0

@mimicocotopus哦,是的,我忽略了那部分,謝謝。 – Rohan

+11

反引號被POSIX棄用,'$()'是首選。 – jordanm

111

您還可以使用參數擴展:

$ filename=foo.txt 
$ echo "${filename%.*}" 
foo 
+3

所述,這裏是命令的解釋:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html –

+1

在這裏我即將使用'echo -n「This.File.Has.Periods.In.It.txt」| awk -F。 「{$ NF = 「」;打印$ 0}'| tr'''。' | rev | cut -c 2- | rev'。謝謝。 – user208145

63

如果您知道分機,你可以使用basename

$ basename /home/jsmith/base.wiki .wiki 
base 
12

如果你的文件名包含一個點(比擴展的另外一個),然後使用這樣的:無論你想

echo $filename | rev | cut -f 2- -d '.' | rev 
+0

我忘了中間的轉速,但是一旦我看到它,這太棒了! –

11
file1=/tmp/main.one.two.sh 
t=`basename $file1`       # output is main.one.two.sh 
name=`echo $file1 | sed -e 's/\.[^.]*$//'` # output is /tmp/main.one.two 
name=`echo $t | sed -e 's/\.[^.]*$//'`  # output is main.one.two 

使用。在這裏,我假定最後一個(點)後跟文本是擴展名。

0

兩個問題與您的代碼:

  1. 您使用了「(打勾)而不是'(反勾)包圍產生要在變量存儲字符串命令。
  2. 您沒有將管道中的變量「$ filename」「回顯」到「cut」命令中。

我會將您的代碼更改爲「name =`echo $ filename | cut -f 1 -d'。' `」,如下圖所示(再次,注意反引號周圍名稱變量定義):

$> filename=foo.txt 
$> echo $filename 
foo.txt 
$> name=`echo $filename | cut -f1 -d'.'` 
$> echo $name 
foo 
$> 
相關問題