bash スクリプトで基本的な文字列置換を試してみます。
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
私の Mac では問題なく動作しますが、サーバーでは動作しません。さまざまなサイトのさまざまな例を試しましたが、常にエラーが発生します。
Bad substitution
私のbashバージョン:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
何が間違っているのでしょうか?
答え1
echo "${x/Linux/Unix}"
1996 年にリリースされたバージョン 2.0 以降の bash では正しい構文です。
Bash は正確なエラー メッセージを出力しませんBad substitution
。パラメータ置換とほぼ似ているが、完全には一致しないものに遭遇した場合のメッセージは若干異なります。
$ bash -c '${}'
bash: ${}: bad substitution
一方、/bin/sh
多くの Linux システムで実装されている dash は、まさに次のようなメッセージを出力します。
$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
このエラーは、クサラナンダが気づいたように、実際にはこのスクリプトをプログラムとして実行しているわけではありません。 または などの何らかのプログラムを実行していてsh
、/bin/sh
そのプログラムにこのスクリプトを実行するように指示しているだけです。 このスクリプトは正しい bash プログラムですが、正しい sh プログラムではないため、sh が bash と同じ機能セットを持たない別の方言であるシステムでは動作しません。
スクリプトはスタンドアロンプログラムです。シバンスクリプトの先頭の 行は、どのインタープリタを使用するかをシステムに指示します。スクリプトを実行するには、そのパス、またはコマンド検索パス ( $PATH
) 上にある場合はファイル名を入力します。他の実行可能プログラムと同様に、スクリプト (シェバン行がある) であるかどうか (カーネルが独自に実行するバイナリ1 ) に関係なく、実行権限 ( ) が必要ですchmod +x path/to/script
。何らかの理由でスタンドアロン プログラムではないスクリプトがあり、それを bash で実行したい場合は、bash path/to/script
ではなく を実行しますsh path/to/script
。
1 または、Linux の binfmt_misc メカニズムなど、ファイルの実行方法を伝達する他の手段を使用します。