これが他のものと異なる点は次のとおりです。
- 私はshebangでbashを呼び出します(shではありません)。
#! /bin/bash
- 私はそれを実行しています
./
- ファイル権限が正しいです。
755
問題のある行は次のとおりです。
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds`
内容$domPATH/duration.seconds
は37603
コマンドラインから実行できます。
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' duration.seconds`
Duration: 10h 26m
私の結果を得るとecho $formattedTIME
ただし、スクリプトで実行すると、次のような結果が発生します。
./time.sh: line 42: syntax error near unexpected token `('
./time.sh: line 42: ` formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds`'
追加情報:これはJessieを実行しているRaspberry Pi 2にあります。
アップデート:オンラインエラー8:
echo 'Cc: [email protected],[email protected],[email protected],[email protected]'' >> $domPATH/arrive.email
ベストアンサー1
コマンドはスクリプトでは正しく解析されませんが、個別に実行すると正常に動作する理由のいくつかの一般的な傾向は次のとおりです。
エラーの原因は別の場所にあります。
シェルは、予期しない最初の項目についてエラーを報告します。ここでは1つは必要ありませんが、(
引用符付き文字列の中にあるようです。 1つの可能な説明は、最初の文字列が'
実際に新しい引用符を開くのではなく、閉じられていない古い引用符を閉じるため、引用符付き文字列にはないことです。'...'
echo It's a bug
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds
実際には次のようになります。
echo It'quoted-string'{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}'...
上記で引用されていない内容は、(
シェルで予期しないものです。
正しく閉じられていない、または型が正しくない構造では、同様の問題が発生しfi
ますthen
。
バックティック
バックティックを使用しないでください。$(...)
使用すべき
バックティック内では\
異なって扱われます。
echo "`
echo It\\\'s OK
`"
いいえ。それ自体は大丈夫ですが、内部のecho It\\\'s OK
バックティックによって最初の2つのバックスラッシュが1つになるので結局echo It\\'OK
。
現代の形には$(...)
このような問題はありません。
ニックネーム
エイリアスはマクロと少し似ており、拡張はコードによって再解釈されます。
図:
alias foo="echo '"
...
foo bar
echo 'baz('
foo
エイリアス定義で問題を隠すことができます。
次のようなもう少し微妙なものもあります。
alias foo='a;b'
cmd | foo
これにより構文エラーは発生しませんが、予期しない方法で解析が完了します。
エイリアスよりも関数が適していることがよくあります。
ローカライズ
特定のバイトシーケンスは、ロケールによって異なるように解釈できます。
たとえば、0xa0 バイトは ISO-8859-1 文字セットで改行しない空白です。 Solarisでは、この文字はスペースであり、bash
すべてのスペースは区切り文字として扱われます(現在はシングルバイト文字のみ)。
0xa0バイトは、たとえば複数のUTF-8文字の一部でもありますà
。たとえば、スクリプトには次のものが含まれます。
var=àdo
(à
UTF-8で書かれています)は、ISO-8859-1ロケールを使用してSolarisで実行すると動作が停止します。なぜなら、文字の最初のバイトがあるvar=X do
からです。X
à
または、以下を見つけることもできます。
echo ε
ロケールの外側にある場合、ε
BIG5-HKSCS文字セットで作成された文字は実際には0xa3 0x60にエンコードされているため、動作は停止します。zh_HK.big5hkscs
ここで、ε
ASCII の 0x60 およびすべてのシングルバイト文字セットはバックティック文字です。