2017-06-16 11 views
0

-eをコマンドbashファイルのフラグとして使用することは認識されません。シェルスクリプト-eコマンドライン引数が認識されない

server.sh

ここ
echo "[email protected]" 

がこれまでときserver.sh結果である:我々は唯一のすべての渡された引数をエコーserver.shという名前のbashのファイルを、持っているとしましょうその他の引数は、引数の股関節以外の有効な

./server.sh -e hello ## output: hello 
./server.sh -eeeee world ## output: world 
./server.sh -eeeeeeeeeeeee what ## output: what 

は、最初の引数として-eで実行されますtは-eで始まります。誰が私にこのことが起こっている理由を教えてもらえますか?そして、-e引数をserver.shに認識させる方法がありますか?ここで

+2

。 – Cyrus

+4

'-e'はエコーするフラグで、printfを使うべき理由の1つです。いくつかの 'エコー'は '--'できますが、それは文書化されていないので信頼できません。 – 123

+0

これは便利です。https://stackoverflow.com/questions/16483119/example-of-how-to-use-getopts-in-bash – dkb

答えて

1

はあなたの問題を再現する簡単な方法です:オプションとして、あなたの意図した出力を解析

$ echo "-e" "foo" 
foo    # What happened to "-e"? 

echoはPOSIXはポータブルスクリプトでこのコマンドに対して警告している理由の一つです。

ロギングおよびデバッグのためのパラメータをダンプしようとしている場合は、bashののprintf %qを使用することができます。

#!/bin/bash 
# (does not work with sh) 
printf '%q ' "$0" "[email protected]" 
printf '\n' 

これは出力にコピー&ペーストすることができ、それをバックに、このような方法で引数をエスケープしますシェルは、(変更を引用しますが、引数が同じになります)、それを後で再生する:あなたが実際にあいまいな形でスペースで区切られた引数を書きたいならば

$ ./myscript -e -avx --arg "my long arg" '(!#%^)(!*' 
./myscript -e -avx --arg my\ long\ arg \(\!#%\^\)\(\!\* 

は、あなたが使用することができます。

#!/bin/sh 
# works with bash and POSIX sh 
printf '%s\n' "$*" 

これは、その結果:私は `ヘルプecho`を見てみることをお勧めし

$ ./myscript -e -avx --arg "my long arg" '(!#%^)(!*' 
-e -avx --arg my long arg (!#%^)(!* 
+0

ありがとう、私はすでにecho -eを知っていました。レンダリングする-eの式として評価されるとは思っていませんでした。 '' $ @ "'という引数は二重引用符で囲まれているためです。 – ryeballar

+1

@ryeballarコマンド( '[]]'のような特殊な構文を除いて、 'echo'のような組み込みコマンドを含む)は、どの引数が引用され、どの引数が引用されていないかを知る方法がありません。呼び出されるまでには、C文字列の配列が得られます。その配列がどのように形成されたかを知ることはできません。 –

+0

@CharlesDuffyありがとう、私はそれを覚えています。 – ryeballar

関連する問題