web-dev-qa-db-ja.com

bash:悪い代用

#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}

このbashスクリプトは私に悪い置換 Ubuntuでエラーを出します。任意の助けは非常に高く評価されます。

102

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を指定して実行しても機能しません。

156
Vanni Totaro

私は同じ問題を抱えていました。あなたのスクリプトが持っていなかったことを確認してください

#!/bin/sh 

スクリプトの一番上にあります。代わりに、追加する必要があります

#!/bin/bash
49
Guest

あなたのスクリプトシンタックスは有効でbashで良いです。

失敗の考えられる原因:

  1. あなたのbashは、本当にbashではありませんが、ksh、またはbashのパラメータ置換を理解できない他のシェルです。あなたのスクリプトは見栄えがよく、bashで動作するからです。 ls -l /bin/bashを実行し、それが本当にbashであり、他のシェルにsymリンクされていないことを確認してください。

  2. あなたのシステムにbashがあるのなら、ksh script.shsh script.shのような間違った方法でスクリプトを実行しているかもしれません(そしてあなたのデフォルトのシェルはbashではありません)。あなたは適切なShebangを持っているので、bashを持っているなら./script.shまたはbash ./script.shは大丈夫なはずです。

18
P.P.

ここに到着した他の人たちにとって、この正確なメッセージは、正しい$(which sh)の代わりに${which sh}のように、コマンドにenv変数構文を使うときにも現れるでしょう。

17
Nacho Coloma

単に実行可能ファイルとして実行するのではなく、bashコマンドを使用してスクリプトを明示的に実行してみてください。

6
Pale Blue Dot

また、スクリプトの最初の行に空の文字列がないことを確認してください。

つまり、#!/ bin/bashがスクリプトの最初の行になるようにしてください。

1
wizurd

Bashまたはdashの両方で動作しますが、構文は次のようになります。

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
0
Hagen