下面的代碼有什麼問題?如何在shell腳本中刪除文件名的擴展名?
3210就這樣,我得到了字符串'$ filename | cut -f1 -d'。'但如果我刪除引號,我什麼都沒有得到。同時打字
"test.exe" | cut -f1 -d'.'
在一個shell給我輸出我想要的「測試」。我已經知道$ filename已被分配正確的值。我想要做的是將一個變量分配給沒有擴展名的文件名。
下面的代碼有什麼問題?如何在shell腳本中刪除文件名的擴展名?
3210就這樣,我得到了字符串'$ filename | cut -f1 -d'。'但如果我刪除引號,我什麼都沒有得到。同時打字
"test.exe" | cut -f1 -d'.'
在一個shell給我輸出我想要的「測試」。我已經知道$ filename已被分配正確的值。我想要做的是將一個變量分配給沒有擴展名的文件名。
當您想在腳本/命令中執行命令時,您應該使用$(command)。
所以,你的行會
name=$(echo $filename | cut -f 1 -d '.')
代碼解釋:
echo
得到變量$filename
的值,並將其發送到標準輸出cut
指令cut
將使用。作爲分隔符(也稱爲分離器),用於切割串入段,並通過-f
我們選擇我們想在輸出$()
包裝將得到的輸出並返回該細分市場的價值name
謝謝。我也注意到我需要使用echo命令。 name ='echo $ filename | cut -f1 -d'。'' – mimicocotopus
@mimicocotopus哦,是的,我忽略了那部分,謝謝。 – Rohan
反引號被POSIX棄用,'$()'是首選。 – jordanm
您還可以使用參數擴展:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
所述,這裏是命令的解釋:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html –
在這裏我即將使用'echo -n「This.File.Has.Periods.In.It.txt」| awk -F。 「{$ NF = 「」;打印$ 0}'| tr'''。' | rev | cut -c 2- | rev'。謝謝。 – user208145
如果您知道分機,你可以使用basename
$ basename /home/jsmith/base.wiki .wiki
base
如果你的文件名包含一個點(比擴展的另外一個),然後使用這樣的:無論你想
echo $filename | rev | cut -f 2- -d '.' | rev
我忘了中間的轉速,但是一旦我看到它,這太棒了! –
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
使用。在這裏,我假定最後一個(點)後跟文本是擴展名。
兩個問題與您的代碼:
我會將您的代碼更改爲「name =`echo $ filename | cut -f 1 -d'。' `」,如下圖所示(再次,注意反引號周圍名稱變量定義):
$> filename=foo.txt
$> echo $filename
foo.txt
$> name=`echo $filename | cut -f1 -d'.'`
$> echo $name
foo
$>
'基本名$文件名.exe'會做同樣的事情。假設你總是知道你想要刪除的擴展名。 – mpe
@mpe,你的意思是'basename「$ filename」.exe'。否則帶空格的文件名將是個壞消息。 –