bashでパスと拡張子なしでファイルのベース名を抽出する [重複] 質問する

bashでパスと拡張子なしでファイルのベース名を抽出する [重複] 質問する

次のようなファイル名が与えられます:

/the/path/foo.txt
bar.txt

私が期待しているのは:

foo
bar

なぜこれが機能しないのでしょうか?

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname

正しいやり方は何でしょうか?

ベストアンサー1

外部コマンドを呼び出す必要はありませんbasename。代わりに、次のコマンドを使用できます。

$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo

このソリューションは、すべての最近の ( 2004 年以降) POSIX準拠シェル (例bash: dash、、kshなど) で動作するはずです。

ソース:シェルコマンド言語 2.6.2 パラメータ拡張

bash 文字列操作の詳細:http://tldp.org/LDP/LG/issue18/bash.html

おすすめ記事