Bashスクリプトでデフォルトの文字列を置き換えようとします。
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
私のMacではうまくいきますが、私のサーバーではうまくいきません。複数のWebサイトでさまざまな例を試しましたが、常にエラーが発生します。
Bad substitution
私のバッシュバージョン: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 -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
このエラーは、以下を暗示するのに十分です。クサロナンダが述べたようにsh
、実際にこのスクリプトをプログラムとして実行するものではありません。いくつかのプログラム(または)を実行し、/bin/sh
このスクリプトを実行するように指示します。スクリプトは正しいbashプログラムですが、正しいshプログラムではないため、shが異なる方言で、bashと同じ機能セットを持たないシステムではスクリプトは実行されません。
あなたのスクリプトはスタンドアロンプログラムです。これシェルボーンスクリプトの一番上の行は、使用するインタプリタをシステムに通知します。スクリプトを実行するには、そのパスまたはファイル名を入力するだけです(コマンド検索パス()にある場合$PATH
)。他のランチャーと同様に、スクリプト(shebang行を含む)であるか、非スクリプト(カーネル自体で実行されるバイナリ1 )であろうと、実行権限(chmod +x path/to/script
)が必要です。何らかの理由でスタンドアロンプログラムではなくスクリプトがあり、それをbashとして実行したい場合は、代わりにbash path/to/script
そのスクリプトを実行してくださいsh path/to/script
。
1 またはLinuxのbinfmt_miscメカニズムなど、ファイルの実行方法を渡す別の方法を使用します。