以下のようなファイル名の場合
/the/path/foo.txt
bar.txt
となることを期待しています。
foo
bar
なぜこれが動作しないのか?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
正しい方法は何ですか?
外部の 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
href="http://opengroup.org/onlinepubs/007908799/xcu/basename.html">basenameコマンドには2つの異なる呼び出し方があります。1つはパスだけを指定した場合で、その場合は最後のコンポーネントが得られますが、もう1つは削除されるサフィックスも指定します。つまり、basenameの2番目の呼び出しを使うことで、サンプルコードを簡単にすることができます。また、正しく引用することにも注意してください。
fbname=$(basename "$1" .txt) echo "$fbname"