#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
このbashスクリプトは私に悪い置換 Ubuntuでエラーを出します。任意の助けは非常に高く評価されます。
Ubuntuの下のデフォルトのシェル(/bin/sh
)は、dash
ではなくbash
を指しています。
me@pc:~$ readlink -f $(which sh)
/bin/dash
したがって、chmod +x your_script_file.sh
を使用して./your_script_file.sh
を使用して実行した場合、またはbash your_script_file.sh
を使用して実行した場合は、正常に動作するはずです。
Hashbang行は無視され、スクリプトはその文字列置換構文をサポートしていないdash
によって解釈されるため、sh your_script_file.sh
を指定して実行しても機能しません。
私は同じ問題を抱えていました。あなたのスクリプトが持っていなかったことを確認してください
#!/bin/sh
スクリプトの一番上にあります。代わりに、追加する必要があります
#!/bin/bash
あなたのスクリプトシンタックスは有効でbashで良いです。
失敗の考えられる原因:
あなたのbash
は、本当にbashではありませんが、ksh
、またはbashのパラメータ置換を理解できない他のシェルです。あなたのスクリプトは見栄えがよく、bashで動作するからです。 ls -l /bin/bash
を実行し、それが本当にbashであり、他のシェルにsymリンクされていないことを確認してください。
あなたのシステムにbashがあるのなら、ksh script.sh
やsh script.sh
のような間違った方法でスクリプトを実行しているかもしれません(そしてあなたのデフォルトのシェルはbashではありません)。あなたは適切なShebangを持っているので、bashを持っているなら./script.sh
またはbash ./script.sh
は大丈夫なはずです。
ここに到着した他の人たちにとって、この正確なメッセージは、正しい$(which sh)
の代わりに${which sh}
のように、コマンドにenv変数構文を使うときにも現れるでしょう。
単に実行可能ファイルとして実行するのではなく、bashコマンドを使用してスクリプトを明示的に実行してみてください。
また、スクリプトの最初の行に空の文字列がないことを確認してください。
つまり、#!/ bin/bashがスクリプトの最初の行になるようにしてください。
Bashまたはdashの両方で動作しますが、構文は次のようになります。
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new