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

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

7
echoとcatの実行時間にこのような違いがあるのはなぜですか?
回答この質問は、私は別の質問をさせて: 私は、次のスクリプトは、同じことを行う2つ目は、最初のものを使用しているため、はるかに高速であるべきと思ったcat何度もファイルを開く必要がなく、二つだけのファイルを開きます一度だけ変数をエコーし​​ます: (正しいコードについては、更新セクションを参照してください。) 最初: #!/bin/sh for j in seq 10; do cat input done >> output 第二: #!/bin/sh i=`cat input` for j in seq 10; do echo $i done >> output 入力は約50メガバイトです。 しかし、2番目の方法を試したときは、変数のエコーiが大規模なプロセスだったため、遅すぎました。また、2番目のスクリプトで問題が発生しました。たとえば、出力ファイルのサイズが予想よりも小さかったです。 私はまたのmanページを確認echoし、catそれらを比較します: echo-テキストの行を表示します cat-ファイルを連結し、標準出力に出力します しかし、違いはありませんでした。 そう: なぜ2番目のスクリプトでcatがとても速く、エコーがとても遅いのですか? それとも変数の問題ですiか?(そのマニュアルページで echoは「テキスト行」と表示されると言われているので、i。のような非常に長い変数ではなく、短い変数に対してのみ最適化されていると思います。しかし、それは単なる推測です。) そして、使用するときに問題が発生したのはなぜechoですか? 更新 間違って使用するseq 10代わりに使用しました`seq 10`。これは編集されたコードです: 最初: #!/bin/sh for j …

3
xargsで引数を引用する方法
1 MBを超えるフォルダー内のすべてのファイルを削除するとします。 $ find . -size +1M | xargs -0 rm これにより、名前にスペースが含まれるファイルは削除されません。だから私はそれが送信するすべての引数を引用したいrm。場合はfind、それを与えるSome report.docxことは渡す必要があります"Some report.docx"しrm。 どうやってやるの?
15 shell  find  quoting  rm  xargs 

3
「find -exec」はどのようにファイル名にスペースを渡しますか?
名前にスペースが含まれるファイルを含むディレクトリがある場合、たとえば $ ls -1 dir1 file 1 file 2 file 3 これらすべてを次のように別のディレクトリに正常にコピーできます。 $ find dir1 -mindepth 1 -exec cp -t dir2 {} + ただし、の出力にfind dir1 -mindepth 1はエスケープされていないスペースが含まれます。 $ find dir1 mindepth 1 dir1/file 1 dir1/file 3 dir1/file 3 のprint0代わりに使用する場合print、出力にはエスケープされていないスペースが含まれています。 $ find dir1 mindepth 1 -print0 dir1/file 1dir1/file 2dir1/file 3 を使用してこれらのファイルを手動でコピーcpするには、スペースをエスケープする必要があります。しかし、私がコマンドを使用するか、コマンドの最後に関係なく、cpの引数が来るとき、これは不要であるようです。find+\; …

2
おそらく空白を含むファイル名のリストを扱うPOSIX準拠の方法
空白を含むファイル名を操作するための配列の使用を提案するBashスクリプトガイドを見てきました。ただし、DashAsBinShは配列には移植性がないことを示唆しているため、空白を含むファイル名のリストを扱うPOSIX準拠の方法を探しています。 以下のスクリプト例を修正して、 echo foo/target/a.jar foo/target/b.jar bar/target/lol whitespace.jar ここにスクリプトがあります #!/usr/bin/env sh INPUT="foo/target/a.jar foo/target/b.jar bar/target/b.jar bar/target/lol whitespace.jar" # this would be produced by a 'ls' command # We can execute the ls within the script, if it helps dostuffwith() { echo $1; }; F_LOCATIONS=$INPUT ALL_FILES=$(for f in $F_LOCATIONS; do echo `basename $f`; …

4
パイプをgrepする方法|
パイプ文字を含む行|または文字をgrepするにはどうすればよいですか>: files content: |this is test where is > this is none 今、私はgrepコマンドを使用して必要です grep -iE "<some expression>" file_name 出力: |this is test where is >


4
bash globを文字列変数にする方法は?
システム情報 OS:OS X bash:GNU bash、バージョン3.2.57(1)-release(x86_64-apple-darwin16) バックグラウンド タイムマシンで、すべてのgit / nodejsプロジェクトからディレクトリとファイルのセットを除外する必要があります。私のプロジェクトディレクトリはしている~/code/private/と~/code/public/私はやってループのbashを使用しようとしているのでtmutil。 問題 短縮版 計算された文字列変数を持っている場合k、forループの前または直前にどのようにグロブするのですか? i='~/code/public/*' j='*.launch' k=$i/$j # $k='~/code/public/*/*.launch' for i in $k # I need $k to glob here do echo $i done 以下の長いバージョンでは、が表示されますk=$i/$j。そのため、forループで文字列をハードコーディングできません。 ロングバージョン #!/bin/bash exclude=' *.launch .classpath .sass-cache Thumbs.db bower_components build connect.lock coverage dist e2e/*.js e2e/*.map libpeerconnection.log node_modules npm-debug.log …

2
特殊文字を通常の文字として使用する方法は?
「二重引用符文字( ")の入力方法?"などの多くの質問 求められている、と我々は同じ答え(と、それを入力して、私たちのコミュニティを乱雑にしたくない\"で囲まれていない場合は'、S "で囲まれている場合'、S。)だから、質問はここにあります。 通常のような特殊な文字を端末に入力することはできません。たとえば、次のコマンドは失敗します。 echo Updates (11) それでは、これらの文字を通常の文字であるかのように端末に入力する方法は? !#$^&*?[](){}<>~;'"\|<space><tab><newline>

2
変数はcdに「〜」をどのように使用できますか?
$BASECDで変数を使用するにはどうすればよいですか。私は次を試しましたが、エラーが発生します $ cd ~/z/repo_1_ruby_193/ 23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ BASE="~/z" 23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ cd $BASE/repo_1_ruby_193 -bash: cd: ~/z/repo_1_ruby_193: No such file or directory 23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193

1
「ドット」を2回エスケープする必要があるのはなぜですか?
リテラルと見なされるように*(){}$、withの\ような特殊文字をエスケープできることを知っています。 たとえば、\*または\$ しかし、.私はそれを2回し\\.なければならない場合、そうでなければそれは特別なキャラクターと見なされます。例: man gcc | grep \\. なぜそうなのですか?


3
コマンドオプションを使用してコマンドインジェクションを防ぐ方法
シミュレーターに渡すカスタムオプションをユーザーが指定できるようにする必要があるラッパーアプリケーションがあります。ただし、ユーザーがユーザーオプションを使用して他のコマンドを挿入しないようにします。これを達成する最良の方法は何ですか? 例えば。 ユーザーが提供するもの: -a -b アプリケーションの実行: mysim --preset_opt -a -b しかし、私はこれが起こることを望まない: ユーザーが提供するもの: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh アプリケーションの実行: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh 現在、ユーザーが提供したすべてのオプションを単一引用符で囲み、ユーザーが提供した単一引用符'を取り除くだけで、最後の例のコマンドが無害になることができると考えています: mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh' 注:mysimコマンドは、docker / lxcコンテナー内のシェルスクリプトの一部として実行されます。Ubuntuを実行しています。

3
なぜ感嘆符「!」がbashを混乱させるのですか?
!コマンドライン履歴のコンテキストでコマンドラインに特別な意味があることを認識していますが、それ以外に、実行スクリプトでは感嘆符が解析エラーを引き起こすことがあります。 私はそれが何かに関係していると思いますeventが、私はイベントが何であるか、それが何をするのか分かりません。それでも、同じコマンドは異なる状況で異なる動作をする可能性があります。 以下の最後の例では、エラーが発生します。しかし、なぜ、同じコードがコマンド置換の外側で機能したのですか?.. GNU bash 4.1.5を使用する # This works, with or without a space between ! and p { echo -e "foo\nbar" | sed -nre '/foo/! p' echo -e "foo\nbar" | sed -nre '/foo/!p'; } # bar # bar # This works, works when there is a space between ! …

2
サブシェル内のネストされた引用符
次のようなサブシェル出力をカプセル化するには、引用符を使用する必要があるとします。 DATA="$(cat file.hex | xxd -r)" しかし、次のようなものをネストする必要があります。 DATA="$(cat file.hex | xxd -r | tr -d \"$(cat trim.txt)\")" 単一引用符は、その中にある変数を展開しないため、使用できません。引用符のエスケープは、受動的なテキストとして扱われるため機能しません。 これをどのように処理しますか?

2
BashとZsh以外のシェルはANSI-Cクォートをサポートしていますか?例:$ 'string'
出力に緑色のチェックマークを出力するために次を使用するシェルスクリプトがあります。 col_green="\e[32;01m" col_reset="\e[39;49;00m" echo -e "Done ${col_green}✓${col_reset}" BashのANSI-C Quotingについて読んだ後、色変数を設定-eし、echoからフラグを削除するときに使用できることに気付きました。 col_green=$'\e[32;01m' col_reset=$'\e[39;49;00m' echo "Done ${col_green}✓${col_reset}" これは、Bashの組み込みエコーまたは外部ユーティリティ/bin/echo(私はmacOS上にある)に渡されたメッセージが正しく印刷されることを意味するため、魅力的です。 しかし、これによりスクリプトの移植性が低下しますか?BashとZshがこのスタイルの引用をサポートしていることは知っていますが、他のことについてはわかりません。

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