web-dev-qa-db-ja.com

このスクリプトがターミナルでは機能するがファイルでは機能しないのはなぜですか?

このシェルスクリプトをファイルに保存しました。基本的な文字列の置換を行います。

#!/bin/sh
html_file=$1
echo "html_file = $html_file"
substr=.pdf
pdf_file="${html_file/.html/.pdf}"
echo "pdf_file = $pdf_file"

コマンドラインに貼り付けると、正常に動作します。

$ html_file="/home/max/for_pauld/test_no_base64.html"
  echo "html_file = $html_file"
  substr=.pdf
  pdf_file="${html_file/.html/.pdf}"
  echo "pdf_file = $pdf_file"

与える

html_file = /home/max/for_pauld/test_no_base64.html
pdf_file = /home/max/for_pauld/test_no_base64.pdf

上記のエコーからの出力です-意図したとおりに機能しています。

しかし、スクリプトを呼び出すと、

$ saucer "/home/max/for_pauld/test_no_base64.html"

私はこの出力を取得します:

html_file = /home/max/for_pauld/test_no_base64.html
/home/max/bin/saucer: 5: /home/max/bin/saucer: Bad substitution

スクリプトは別のバージョンのbashか何かを使用していますか?シバンラインを変更する必要がありますか?

19
Max Williams

@ Hunter.S.Thompsonからの優れた回答に加えて、スクリプトの移植できない部分は

pdf_file="${html_file/.html/.pdf}"

${variable/search/replace}はGNU拡張機能です。ただし、純粋なPOSIXを使用すると簡単に回避できます。

pdf_file="${html_file%.html}".pdf

ハンターに続いて、これはシバンを#! /bin/bashに変更するよりも良い修正です。

23
Philippos