2017-09-12 6 views
0

だから私はこの奇妙な動作を把握しようとしています。二重引用符でLinuxコマンドを実行する

$ hello hello   
-ksh: hello: not found [No such file or directory] 
$ "hello hello" 
-ksh: hello hello: not found [No such file or directory] 
$ echo hello hello 
hello hello 
$ `echo hello hello` 
-ksh: hello: not found [No such file or directory] 
$ echo \"hello hello\" 
"hello hello" 
$ `echo \"hello hello\"` 
-ksh: "hello: not found [No such file or directory] 

第2と第6のコマンドが私の質問に最も関連しています。その2番目のコマンド"hello hello"を実行すると、それは1つの大きな引数として評価されます。しかし、その最後のコマンドを実行しようとすると、

`echo \"hello hello\"` 

それは同じ動作をしていますか?しかしそれは"helloをそれ自身の独立した言葉として見ている。いくつかこれについて説明し、6番目のコマンドを2番目のコマンドと同じように動作させる方法がありますか? "hello hello"を1つのステートメントとして評価しますか?

(これはもっと実用的なアプリケーションですが、これは私が作成できる最小の例でした)。

ありがとうございます!

編集:私はダウンボトムがあるので、私はどの問題に取り組んでいるのかを具体的に説明します。

rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done 

rcli4redis-cli -pためだけの別名であることに注意してください。私は、引用符が間違って解析されているため、

(error) ERR wrong number of arguments for 'get' command 

が得られています。私は引用符を追加する、sed文を削除するなどのようなさまざまな組み合わせを試しましたが、私のオリジナルのこんにちはの問題を解決できれば、私の特定の問題を解決するための十分な洞察が得られます。

+0

'ksh'は' bash'ではありません。あなたのタグやシェルを修正する必要があるかもしれません。 –

+1

引用符付きの文字列の中に引用符はただ一つの文字です。特別な力はありません。 – John1024

+0

@EricRenoufおっと!ありがとうございました –

答えて

1

引用符付きの文字列の中で、引用符は単なる別の文字です。特別な力はありません。

編集に記載されているとおりに問題を正しく理解していれば、解決策は$lineの中にのdoループを挿入することです。このように、試してみてください。二重引用符なし

rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done 

をまわり$line、シェルはlineの内容に単語分割パス名展開を実行することになります。あなたはどちらもしたくない。二重引用符は、両方を抑制します。

さらに、-rオプションをreadに追加しました。これにより、readの内容がlineのバックスラッシュ処理を実行できなくなります。

最後に、データベース・キー・グロブAAA*を一重引用符で囲みます。引用符を付けないと、シェルはAAA*をファイルグロブとして解釈し、のパス名展開を実行します。現在のディレクトリにそのグロブに一致するファイルが存在すると、結果は予期しないものになり、望ましくなくなります。 bashオプションのnullglobが設定されている場合、結果は現在のディレクトリにあるファイルに関係なく望むものとはなりません。

関連する問題