タグ付けされた質問 「quoting」

文字列は通常、引用符で区切られているため、引用符を含む文字列を処理する際に問題が発生します。

2
'bash -c'に引数を追加します
次のようにBashを介してコマンドを実行するとします。 /bin/bash -c "ls -l" Bashのマニュアルページによると、次のように実行することもできます。 # don't process arguments after this one # | pass all unprocessed arguments to command # | | # V V /bin/bash -c ls -- -l 動作していないように見えます(無視されているようです)。私は何か間違ったことをしているのですか、それともmanページを間違って解釈していますか? 男性からの関連する引用: -cオプションが存在する場合、コマンドはstringから読み取られます。文字列の後に引数がある場合、$ 0から始まる位置パラメータに割り当てられます。 そして A-オプションの終了を通知し、さらにオプション処理を無効にします。-の後の引数は、ファイル名と引数として扱われます。

1
このファイルが「検索」に表示されないのはなぜですか?
findwith を使用するとgrep、パターンに一致するファイルを見つけることができます。 # find | grep error ./solr-modifiedSolr4/SolrPhpClient/phpdocs/errors.html ./error_log ./includes/classes/error_log ただし、find最初のファイルを単独で使用すると見つかりません。 # find . -name error* ./error_log ./includes/classes/error_log なぜしないfind見つけerrors.htmlて使用されていないときにファイルをgrep?findこのファイルの表示にも使用されますか?

1
「sed」置換に補間された文字列がすべてのメタ文字をエスケープすることを保証する方法
テキストストリームを読み取り、後でで実行されるsedコマンドのファイルを生成するスクリプトがありますsed -f。生成されるsedコマンドは次のとおりです。 s/cid:image002\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1922/g s/cid:image003\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1923/g s/cid:image004\.jpg@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1924/g sedコマンドを生成するスクリプトが次のようなものであると仮定します。 while read cid fileid do cidpat="$(echo $cid | sed -e s/\\./\\\\./g)" echo 's/'"$cidpat"'/https:\/\/mysite.com\/files\/'"$fileid"'/g' >> sedscr done cid文字列内のすべての正規表現メタ文字が適切にエスケープおよび補間されるようにスクリプトを改善するにはどうすればよいですか?
21 sed  quoting 

2
高度に投票されたワンライナーのネストされた二重引用符
3.5Kを超える票を含むStackOverflowの回答にDIRは、現在のbashスクリプトのディレクトリに割り当てるためのこの1つのライナーが含まれています。 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ネストされた二重引用符に困惑しています。私が知る限り、次のフラグメントは二重引用符で囲まれています。 "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ...そして、=($( dirnameおよび))の右側にある他のものはすべて引用符で囲まれていません つまり、2番目、4番目、および6 "番目の"文字は、それぞれ1番目、3番目、および5 番目の文字を「閉じる」と仮定します。 二重引用符で"${BASH_SOURCE[0]}"何が達成されるのか理解していますが、他の2組の二重引用符の目的は何ですか? 一方、(および高い得点にもかかわらず)上記のスニペットが正しくない場合、名目上の意図を達成する正しい方法は何ですか? (名目上の意図ではpwd、最初にcd-ingの後に返された値をで返されたディレクトリに収集dirname "${BASH_SOURCE[0]}"し、cdサブシェルで-ing を実行し$PWD、親シェルのが変更されないようにします)。

1
アンパサンド(&)を使用したsed
sedを使用して、SASファイル内のパターンを個別に変更するのではなく、検索して置換しています。問題は、マクロ変数を置き換えようとしていますが、アンパサンドを使用すると正しく処理されないことです。 Here's my code: sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas このコマンドを実行するたびに、元のテキストにあらゆる種類のファンキーなものを追加して実行するようです。 質問:アンパサンドを含むテキストをsedコマンドで置き換えるにはどうすればよいですか?
19 sed  quoting  replace 

4
evalを使用してスペースを含む値をbashの変数に割り当てる方法
を使用して変数に値を動的に割り当てたいeval。次のダミーの例が機能します。 var_name="fruit" var_value="orange" eval $(echo $var_name=$var_value) echo $fruit orange ただし、変数値にスペースが含まれevalている場合$var_value、二重引用符で囲まれていてもエラーを返します。 var_name="fruit" var_value="blue orange" eval $(echo $var_name="$var_value") bash: orange : command not found これを回避する方法はありますか?
19 bash  shell  quoting 

2
環境変数での一重引用符と二重引用符の意味は何ですか?
.profileで次のようにいくつかの環境変数を定義しました。 MY_HOME="/home/my_user" しかし、引用符を取り除いてファイルを再ソースしない限り、変数は評価されないようです。スペースがある場合は引用符が必要であり、エスケープが望ましくない場合は一重引用符が使用されると思います。誰かが変数定義での一重引用符と二重引用符の重要性を明確にできますか?フロントティックとバックティックはどうですか?

3
引用符で囲まれた変数のオプションが失敗するのはなぜですか?
私は、bfooで変数を引用する必要があることを読みました。たとえば、$ fooではなく「$ foo」です。しかし、スクリプトを書いているときに、引用符なしでは機能するが、引用符なしでは機能しないケースを見つけました。 wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line これは動作します: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" これはしません($ wget_optionsの前後の二重引用符に注意してください): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" この理由は何ですか? 最初の行は良いバージョンです。または、この動作の原因となる隠しエラーがあると疑うべきですか? 一般に、bashとその引用がどのように機能するかを理解するための優れたドキュメントはどこにありますか?このスクリプトを書いている間、私はルールを理解するのではなく、試行錯誤のベースに取り組み始めたと感じています。

6
実行時に変数を引用する必要がありますか?
シェルスクリプトの一般的なルールは、やむを得ない理由がない限り、変数を常に引用することです。あなたがおそらく知りたいと思うより多くの詳細については、この素晴らしいQ&Aを見てください:bash / POSIX shellsで変数を引用するのを忘れることのセキュリティの意味。 ただし、次のような関数を検討してください。 run_this(){ $@ } $@そこに引用されるべきかどうか?少し遊んでみましたが、引用符がないことが問題を引き起こすケースを見つけることができませんでした。一方、引用符を使用すると、引用符で囲まれた変数としてスペースを含むコマンドを渡すときに中断します。 #!/usr/bin/sh set -x run_this(){ $@ } run_that(){ "$@" } comm="ls -l" run_this "$comm" run_that "$comm" 上記のスクリプトを実行すると戻ります: $ a.sh + comm='ls -l' + run_this 'ls -l' + ls -l total 8 -rw-r--r-- 1 terdon users 0 Dec 22 12:58 da -rw-r--r-- 1 …

2
シェル変数の展開とグロブの効果とその上での分割
この投稿には実際には2つの個別の質問が含まれていますが、それらをグループ化することで、より多くのコンテキストが得られると思います。私は変数の引用符についてこの質問をしましたが、そもそも変数の展開が何を意味するのかよくわかりません。だから私の最初の質問は: unix / linux speakの変数展開とは何ですか? 私の質問の2番目の部分は、次の用語に関連しています。 glob スプリット 上記は何を意味し、変数展開にどのように影響しますか?元の質問への回答には、次のことが記載されています。 (リストコンテキストで)引用符がないことは、split + glob演算子と考えてください。 echo $ testがecho glob(split( "$ test"))のように。 私は直接の概念取り組む任意の答えを見つけることができませんでしたグロブや分割をではなく、直接、このように他の質問に答えるには、それらの用語を使用しています最近のもの。

2
二重引用符内の単一引用符とBashリファレンスマニュアル
セクション3.1.2.3の二重引用符で、Bashマニュアルは次のように述べています。 文字を二重引用符( '"')で囲むと、引用符内のすべての文字のリテラル値が保持されますが、例外は '$'、 '`'、 '\'、および履歴展開が有効な場合は '!'です。 現時点では、単一引用符(')に関心があります。 前のセクションで説明した特別な意味、セクション3.1.2.2は次のとおりです。 文字を一重引用符(')で囲むと、引用符内の各文字のリテラル値が保持されます。バックスラッシュが先行する場合でも、単一引用符は単一引用符の間に出現しない場合があります。 2つの博覧会を組み合わせて、 echo "'$a'" 変数がここでa定義されていない(従って$a= NULL文字列)は、印刷すべきである$aように、画面上に''シールドであろう、それは特別な意味内部だ有する、$特別な解釈から。代わりに、印刷し''ます。なぜそうなのか?
18 bash  shell  quoting 

1
$(command $ arg)を引用する正しい方法は何ですか?
長年私を悩ませてきたこの難問を解決する時が来ました... 私は時々これに会ってきました、そして、これが行く方法であると思いました: $(comm "$(arg)") そして、私の見解は経験に強く支えられていると思いました。しかし、私はもうよくわかりません。Shellcheckでも決心することはできません。両方です: "$(dirname $0)"/stop.bash ^-- SC2086: Double quote to prevent globbing and word splitting. そして: $(dirname "$0")/stop.bash ^-- SC2046: Quote this to prevent word splitting. 背後にあるロジックは何ですか? (これはShellcheckバージョン0.4.4、btwです。)

1
このffmpegコマンドがzshではなくbashで機能するのはなぜですか?
今日、私は仕事から家に帰り(Ubuntuボックスでbashを実行)、私の大好きなzshでローカルアーチボックスでコードを実行しようとしましたが、コマンドは失敗しましたか? コマンドは、個人情報とIPが明らかに変更された状態で以下にあります ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4 それはbashで完璧に動作しますが、zshで実行するとエラーが発生します zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 私の愛するzshが私を裏切ったのはなぜですか?
17 bash  zsh  quoting  url 

5
生成されたファイル名のリストを引数リストとして使用—スペースあり
によって収集されfindたファイル名のリストを使用してスクリプトを起動しようとしています。特別なものはなく、次のようになります。 $ myscript `find . -name something.txt` 問題は、パス名の一部にスペースが含まれているため、引数の展開時に2つの無効な名前に分割されることです。通常、名前を引用符で囲みますが、ここでは逆引用符の展開によって挿入されます。find各ファイル名の出力をフィルタリングして引用符で囲みましたが、bashがそれらを見るまでにそれらを取り除くには遅すぎて、ファイル名の一部として扱われます: $ myscript `find . -name something.txt | sed 's/.*/"&"/'` No such file or directory: '"./somedir/something.txt"' はい、それがコマンドラインの処理方法のルールですが、どうすれば回避できますか? これは恥ずかしいことですが、私は正しいアプローチを思い付くことに失敗しています。私は最終的にそれをどのように行うかを見つけましたxargs -0 -n 10000...しかし、それは私がまだ聞きたいと思うようなsuchいハックです:バッククォート展開の結果を引用する方法、または別の方法で同じ効果を達成するにはどうすればよいですか? 編集:私は、事実について混乱していたxargs んそれはそう言われていますか、システムの制限を超えることがありますしない限り、単一の引数リストにコレクトすべての引数を。まっすぐに設定してくれてありがとう!他の人は、受け入れられた答えを読んでいるときにこれを覚えておいてください。なぜなら、それは直接指摘されていないからです。 私は答えを受け入れましたが、私の質問は残ります:バックティック(または$(...))拡張でスペースを保護する方法はありませんか?(受け入れられた解決策は非bash回答であることに注意してください)。

2
bashの二重引用符はどのように一致(ペア)しますか?
を使用していGNU bash 4.3.48ます。単一のドル記号のみが異なる次の2つのコマンドを検討してください。 コマンド1: echo "(echo " * ")" コマンド2: echo "$(echo " * ")" それらの出力は、それぞれ (echo test.txt ppcg.sh ) そして * したがって、最初のケースで*は明らかにがグロブされます。つまり、最初の引用符は2番目と一緒にペアを形成し、3番目と4番目は別のペアを形成します。 2番目のケースで*はがグロブされず、出力にちょうど2つの余分なスペースがあります。1つはアスタリスクの前、もう1つは後です。つまり、2番目の引用符は3番目の引用符に、最初の引用符は4番目に続きます。 $()引用符が次の引用符と一致せず、代わりにネストされているという構造以外のケースはありますか?この動作は適切に文書化されていますか?はいの場合、対応する文書はどこにありますか

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.