2017-12-14 18 views
1

先頭のポンド記号(八重奏)がある場合とない場合があるbashスクリプトの引数を処理する必要があります。最も簡単な例は次のとおりです。それはコマンドとしてテキストを処理し、それがコメントであると仮定しているためそれはあるかもしれない何も先頭のポンド記号(八角形)でbash引数を取得する方法

を返さない

echo #1234 

$ @、$ *などは動作しません。 getoptsはこの種の問題に対処していないようです。

提案は、問題の「引数」はコメントとして解析され、はすべてでコマンドに渡されることはありませんので、これは、完全に不可能である

答えて

4

を歓迎します。

Cでプログラムが自分のmain機能のために、次の呼び出し規約を持っていることに留意してください:

int main(int argc, char *argv[]) 

これは、プログラムが個々の、個別の引数のリスト、ではないではない単一の文字列が渡されることを意味まだ解析されていません。 引数のベクトルが解析された元の文字列は、呼び出されたプログラムにまったく与えられません。しばしば、「元の文字列」は存在しません。したがって、呼び出されたプログラムには、 "ベルを解除し"、解析された文字列のリストから、生成された元の文字列に戻ることはできません。

したがって、スクリプトが外部コマンド(シェル関数とは対照的に)として呼び出された場合、オペレーティングシステムによって実行されるシェルの呼び出しは、the execve syscallを経由します。引数は(1)実行するファイル。 (2)それを渡す引数ベクトル(つまり、前述の個々のC文字列のリスト)。 (3)環境変数のリスト。未解析のシェルコマンドラインの引数はないので、そのようなコンテンツはサブプロセスで使用できません。


ユーザーに適切な引用を使用するように指示します。

yourscript '#1234' # single quotes prevent content from being parsed as shell syntax 
yourscript ''#1234 # "#" only begins a comment at the front of a string 
yourscript '#'1234 # note that shell quoting is character-by-character 
yourscript \#1234 # ...so either quoting or escaping only that single character suffices. 

は...上記のいずれかを含むargvを通過する(C構文で)char[][]{ "yourscript", "#1234", NULL }

+0

任意のアイデアをリードポンド_why_:以下の全てがyourscriptが関係している限り、完全に区別できない挙動を有するであろうこの(おそらく意図しない)副作用がありますか? –

+0

@RichardHaven、意図しない意味ですか?これはコメント構文です。 Cでコードとして解析されない '/ * something * /'や、Pythonでコードとして解析されない '#something'、C++での' something'、 '<! - 何か ' - > 'SGML-familyの言語など –

+0

これはコマンドラインを1行のスクリプトとして扱い、8行目はその行の中で褒め言葉として解釈されます。 今すぐ取得します。ありがとう –

関連する問題