9

引数のベース名を取得し、その引数に拡張子があるかどうかを確認するスクリプトを作成しようとしています。存在する場合は、拡張子を出力します。

これが私のコードです:

file=basename $1
ext=${file%*}
echo ${file#"$stub"}
echo $basename $1

basename の出力を確認するために、最後の $basename $1 をエコーし​​ます。

いくつかのテストで次のことがわかります。

testfile.sh one.two
./testfile: line 2: one.two: command not found
one.two

testfile.sh ../tester
./testfile: line 2: ../tester: No such file or directory
../tester

したがって、どちらの $basename $1 も機能していません。私はそれが構文エラーであることを知っているので、誰かが私が間違っていることを説明できますか?

編集:

私は今私の問題を解決しました:

file=$(basename "$1" )
stub=${file%.*}
echo ${file#"$stub"}

これにより、私の議論はベース名に還元されます。ありがとうございました。

4

2 に答える 2

15

まず、構文が間違っています:

file=$( basename "$1" )

次に、これはファイル名の (最後の) 拡張子を取得する正しい式です。

ext=${file##*.}
于 2012-10-11T16:57:17.670 に答える
9

コマンドの出力を変数に割り当てたい場合は、逆引用符を使用するか、特殊な括弧を使用して実行する必要があります。

file=`basename "$1"`
file=$(basename "$1")

ファイル名の拡張子を削除するには、次のようにする必要があります

ext=${file#*.}

これは の値を取得$fileし、ピリオドまでのすべてを削除します (これが必要な理由です)。ファイル名にピリオドが含まれている場合は、を使用する必要がありますext=${file##*.}##これは、一致する最長の文字列を削除するように bash に指示するため、最初のピリオドではなく最後のピリオドまで削除されます。

あなたecho $basename $1は変です。$basename呼び出された変数の値と$1、スクリプト(または関数)の最初の引数である変数の値を出力するようにbashに指示しています。

実行しようとしているコマンドを出力したい場合は、次のようにします。

echo basename $1

コマンドの出力を印刷しようとしている場合は、次のいずれかを実行できます。

echo $(basename "$1")
echo "$file"
basename "$1"

これが役立つことを願っています=)

于 2012-10-11T17:08:26.473 に答える