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

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

13
パイプ文字を持つパターンで複数のパターンをgrepするにはどうすればよいですか?
2つのパターンのいずれかに一致する複数のファイルですべての行を検索したい。入力して探しているパターンを見つけようとしました grep (foo|bar) *.txt しかし、シェルは|をパイプとして解釈しbar、実行可能ファイルではない場合に文句を言います。 同じファイルセットで複数のパターンをgrepするにはどうすればよいですか?

10
名前が「-」(ハイフン、ダッシュまたはマイナス)で始まるファイルを削除するにはどうすればよいですか?
ファイル名がダッシュ(ハイフンまたはマイナス)で始まるファイルを削除するにはどうすればよいです-か?リモートOSXサーバーにssh'dし、ディレクトリにこのファイルがあります: tohru:~ $ ls -l total 8 -rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help ... どのように--helpしてCLIから削除できますか?この問題は時折さまざまな形で出くわします。これらのファイルは簡単に作成できますが、取り除くのは困難です。 バックスラッシュを使用してみました rm \-\-help 引用符を試してみました rm "--help" マイナス(ダッシュまたはハイフン)文字がオプションとして解釈されるのを防ぐにはどうすればよいですか?

5
シェルスクリプトが空白またはその他の特殊文字で停止するのはなぜですか?
または、堅牢なファイル名処理およびシェルスクリプトで渡すその他の文字列の入門ガイド。 ほとんどの場合、うまく機能するシェルスクリプトを作成しました。ただし、一部の入力(たとえば、一部のファイル名)で停止します。 次のような問題が発生しました。 スペースを含むファイル名を持っていて、hello worldそれは2つの別個のファイルhelloとworld。 2つの連続したスペースを持つ入力行があり、入力で1つに縮小しました。 入力行から先頭と末尾の空白が消えます。 入力に文字の1つが含まれている場合、\[*?実際にはファイルの名前であるテキストに置き換えられることがあります。 入力にアポストロフィ'(または二重引用符")が含まれており、その時点以降は状況がおかしくなりました。 入力にバックスラッシュがあります(または、Cygwinを使用していて、ファイル名の一部にWindowsスタイルの\区切り文字があります)。 何が起こっており、どうすれば修正できますか?

3
shスクリプトでsedを使用する場合、どの文字をエスケープする必要がありますか?
次のスクリプトを使用します。 #!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file] sh(dashここ)でこれを実行しようとすると、エスケープする必要がある括弧のために失敗します。しかし、私はしません(オクテットの間、またはバックスラッシュ自体をエスケープする必要があります\sか\1)。ここでのルールは何ですか?いつ使用する必要があります{...}か[...]?私がしていることと逃げる必要がないことのリストはありますか?

3
bash / POSIXシェルで変数を引用するのを忘れた場合のセキュリティへの影響
しばらくunix.stackexchange.comをフォローしている場合はecho $var、Bourne / POSIXシェル(zshは例外)のリストコンテキスト(のように)で変数を引用符で囲まないでおくと、非常に特別な意味があり、正当な理由がない限り、実行しないでください。 ここでいくつかのQ&Aで詳細に議論されています(例:シェルスクリプトが空白または他の特殊文字でチョークするのはなぜですか?、二重引用符が必要なのはいつですか?、シェル変数の展開とグロブと分割の効果、引用符付き引用符なしの文字列展開) これは、70年代後半のBourneシェルの最初のリリース以降のケースであり、Kornシェル(David Kornの最大の後悔の 1つ(質問#7))によって変更されていないかbash、Kornシェルをほとんどコピーしたものです。 POSIX / Unixでどのように指定されているか。 現在、ここにはまだ多くの回答があり、変数が引用されていない公開されているシェルコードもときどき公開されています。あなたは今までに人々が学んだと思っていただろう。 私の経験では、変数を引用するのを省略した人が主に3種類あります。 初心者。確かにそれは完全に直感的でない構文であるため、それらは言い訳することができます。そして、彼らを教育することは、このサイトでの私たちの役割です。 忘れっぽい人。 繰り返しハンマーを打っても納得しない人、Bourneシェルの作者が私たちのすべての変数を引用するつもりはなかったと思う人。 この種の行動に関連するリスクを明らかにすれば、彼らを説得できるかもしれません。 変数の引用を忘れた場合に起こりうる最悪の事態は何ですか。それは本当にそれが悪いですか? ここでどのような脆弱性について話しているのですか? どのような状況で問題になりますか?

3
なぜ 'ls'はアイテムを一重引用符でスペースで突然ラップするのですか?
私のマシンの1つ(Debian Sidを実行している)でls、スペースを含むファイル名を入力するたびに、単一引用符で囲まれていることに気付きました。 私はすぐにエイリアスをチェックしましたが、それらが無傷であることがわかりました。 wyatt@debian630:~/testdir$ ls 'test 1.txt' test1.txt wyatt@debian630:~/testdir$ alias alias ls='ls --color=auto' alias wget='wget --content-disposition' wyatt@debian630:~/testdir$ (画像) 名前に単一引用符を含むファイルを使用した別のテスト(jimmijによる要求にも応答): wyatt@debian630:~/testdir$ ls 'test 1.txt' test1.txt 'thishasasinglequotehere'\''.txt' wyatt@debian630:~/testdir$ touch "'test 1.txt'" wyatt@debian630:~/testdir$ ls ''\''test 1.txt'\''' test1.txt 'test 1.txt' 'thishasasinglequotehere'\''.txt' (画像) 新しいcoreutils-8.26の出力で更新します(明らかに紛らわしくないですが、デフォルトではいらいらします)。このプリントアウトをしてくれたPádraigBradyに感謝します。 $ ls "'test 1.txt'" test1.txt 'test 1.txt' "thishasasinglequotehere'.txt" $ ls -N ...



3
Bashの$(コマンド置換)内での引用
Bash環境では、スペースを含む変数を使用し、これらの変数をコマンド置換内で使用します。残念ながら、SEで答えが見つかりません。 変数を引用する正しい方法は何ですか?そして、これらがネストされている場合はどうすればよいですか? DIRNAME=$(dirname "$FILE") または、置換外で引用しますか? DIRNAME="$(dirname $FILE)" または両方? DIRNAME="$(dirname "$FILE")" またはバックティックを使用しますか? DIRNAME=`dirname "$FILE"` これを行う正しい方法は何ですか?そして、引用符が正しく設定されているかどうかを簡単に確認するにはどうすればよいですか?

1
二重引用符はいつ必要ですか?
以前は$VARIABLE、少なくともシェルが単一のアイテムとして解釈することを望んでいた場合、を含む式を二重引用符で囲む$VARIABLEことを推奨していました。 ただし、シェルの最近のバージョンでは、二重引用符は必ずしも必要ではありません(少なくとも上記の目的のため)。例えば、中bash: % FOO='bar baz' % [ $FOO = 'bar baz' ] && echo OK bash: [: too many arguments % [[ $FOO = 'bar baz' ]] && echo OK OK % touch 'bar baz' % ls $FOO ls: cannot access bar: No such file or directory ls: cannot access ...

6
cronタブジョブ内で「日付」を実行するにはどうすればよいですか?
ログファイル名に現在の時間が含まれているcronスクリプトのログファイルを作成したい。これは私が使用しようとしたコマンドです: 0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log 残念ながら、それが実行されるとこのメッセージが表示されます。 /bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file dateさまざまな方法でパーツをエスケープしようとしましたが、あまり運がありません。これをcrontabファイルでインラインで実行することは可能ですか、またはこれを行うためにシェルスクリプトを作成する必要がありますか?

7
bashで感嘆符(!)を使用できませんか?
curlコマンドを使用!して、パスに感嘆符()が付いたhttp URLにアクセスしようとしています。例えば: curl -v "http://example.org/!287s87asdjh2/somepath/someresource" コンソールはで応答しbash: ... event not foundます。 ここで何が起こっていますか?感嘆符をエスケープするための適切な構文は何でしょうか?

4
二重引用符「[[」内ではなく、単一括弧「[」内ではなく引用符なしのスペースを使用したパラメーター展開が機能するのはなぜですか?
単一または二重の括弧の使用と混同しています。このコードを見てください: dir="/home/mazimi/VirtualBox VMs" if [[ -d ${dir} ]]; then echo "yep" fi 文字列にスペースが含まれていても、完全に機能します。しかし、単一のブラケットに変更すると: dir="/home/mazimi/VirtualBox VMs" if [ -d ${dir} ]; then echo "yep" fi それは言います: ./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected 次のように変更すると: dir="/home/mazimi/VirtualBox VMs" if [ -d "${dir}" ]; then echo "yep" fi 正常に動作します。誰かが何が起こっているのか説明できますか?"${var}"スペースに起因する問題を防ぐために、変数を二重引用符で囲む必要があるのはいつですか?
86 bash  quoting  ksh  test 

7
sedを使用して、複雑な文字列を検索および置換します(正規表現を使用することが望ましい)
次の内容のファイルがあります。 <username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname> そして、1行目の「名前」を「何か」に、2行目の「パスワード」を「何か」に、3行目の「名前」を「何か」に変更するスクリプトを作成する必要があります。ファイル内で発生するこれらの順序に依存することはできないため、「name」の最初の出現を「something」に、2回目の「name」の出現を「somethingdifferent」に単純に置き換えることはできません。正しいものを見つけて置き換えるために、実際に周囲の文字列を検索する必要があります。 これまでのところ、最初の「名前」の出現を見つけて置き換えるためにこのコマンドを試しました。 sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml しかし、それは機能していないので、これらのキャラクターのいくつかはエスケープする必要があるなどと考えています。 理想的には、正規表現を使用して、2つの「ユーザー名」の出現を一致させ、「名前」のみを置換できるようにしたいです。このしかし、とのような何かsed: <username>.+?(name).+?</username> 括弧内の内容を「何か」に置き換えます。 これは可能ですか?

3
スクリプトに$“ dollarsign-prefixed string”があるとはどういう意味ですか?
私はこれを初期化スクリプトで見ました: echo $"Stopping Apache" そのドル記号は何のためですか? これまでの私の研究: 私はこれをbashマニュアルで見つけました: 引用 場合は設定、$'string'および$"string"引用は内で行われ${parameter}、二重引用符で囲まれた展開。このオプションはデフォルトで有効になっています。 ...しかし、$接頭辞のある文字列とない文字列の違いは見つかりません: $ echo "I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in ${PWD}" I am in /var/shared/home/southworth/qed $ echo "I am in ${PWD}" I am in /var/shared/home/southworth/qed ...

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