basename コマンドには 2 つの異なる呼び出しがあります。一方では、パスだけを指定します。この場合、最後のコンポーネントが提供されますが、他方では、削除するサフィックスも指定します。したがって、basename の 2 番目の呼び出しを使用して、サンプル コードを単純化できます。また、正しく引用するように注意してください:
fbname=$(basename "$1" .txt) echo "$fbname"
ここにワンライナーがあります:
<オール>$(basename "${s%.*}")
$(basename "${s}" ".${s##*.}")
これが必要だったのは、bongbang と w4etwetewtwet が尋ねたのと同じです。
外部の 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
.tar.gz
のように末尾が 2 つの場合でも、basename と cut の組み合わせは問題なく機能します。 :
fbname=$(basename "$fullfile" | cut -d. -f1)
このソリューションが必要とする演算能力が Bash Parameter Expansion よりも少ない場合、興味深いでしょう。
i386 および x86-64 での UNIX および Linux システム コール (およびユーザー空間関数) の呼び出し規則は何ですか?
プレーンテキスト以外のパスワードを保存するにはどうすればよいですか?