問題は $1
で
MYBASENAME="`basename $1`"
は引用されていません。代わりにこれを使用してください:
MYBASENAME="$(basename "$1")"
1 組の引用符がありません!
MYBASENAME="`basename \"$1\"`"
これで問題は解決します。
割り当てが単一のコマンド置換である場合、コマンド置換を引用符で囲む必要はありません。シェルは、変数の割り当てに対して単語分割を実行しません。
MYBASENAME=$(basename "$1")
それだけです。 $()
を使う習慣を身につけてください。 $()
のため、バッククォートの代わりに より簡単にネストできます (これは POSIX であり、最新のすべてのシェルがサポートしています)。
PS:しないようにしてください。 bash を書く スクリプト。 シェル を書いてみてください スクリプト。違いは、バシズムやズシズムなどがないことです。C の場合と同様に、移植性はスクリプトの望ましい機能であり、特に簡単に実現できる場合はそうです。あなたのスクリプトはバシズムを使用していないので、 #!/bin/sh
と書きます 代わりは。ニットピッカー向け:はい、知っています。古い SunOS と Solaris /bin/sh
$()
がわかりません しかし /usr/xpg4/bin/sh
POSIX シェルです。