Bash スクリプト: 引用符、一重引用符などを含む変数を bash スクリプトに渡す

Bash スクリプト: 引用符、一重引用符などを含む変数を bash スクリプトに渡す

これが次の文字列であると仮定します:

   'a',"b"

一重引用符と二重引用符の両方が含まれています。

これを単一の文字列として bash スクリプトに渡すにはどうすればよいでしょうか?

これは bash スクリプトです:

#!/bin/bash
echo $1

それは反響するはずだ

'a',"b"

しかし、文字列がこれほど小さいとは想定できません。最終的には、文字列全体を送信する予定です。

 /etc/httpd/conf/httpd.conf

この bash スクリプトに文字列として追加します。

そのため、引用符と一重引用符を一度に 1 つずつエスケープすることはできません。

答え1

使用できますコマンド置換:

oo.sh "$(cat /etc/httpd/conf/httpd.conf)"

これが実行されcat /etc/httpd/conf/httpd.conf、出力 (ファイルの内容) が に与えられた最初の引数に格納されますoo.sh。引用符で囲まれているため、単一の引数として渡されます。スペースと特殊文字はそのまま渡されます。 はoo.sh単一の引数を取得します。


しかし、もっと広い意味では、可能であればファイル名をスクリプトに渡すか、ファイルの内容を標準入力 ( oo.sh < /etc/httpd/conf/httpd.conf) として渡す方がよいかもしれません。より標準的であるだけでなく、すべてのコマンドライン引数を合わせた長さには最大長があり、ファイルはそれよりも長くなる可能性があります。今はうまく動作していても、時間が経つにつれてファイルが大きくなる可能性がある場合、最終的には全体を引数として渡すと、「引数リストが長すぎます」というエラーが発生して動作しなくなります。

その制限は で確認できますgetconf ARG_MAX。サイズは大きく異なります。ここでは 2MB の制限と 256KB の制限を持つシステムがあります。ファイルが常に小さい場合は心配する必要はありませんが、そうでない場合は、データをスクリプトに取り込む別の方法を試す必要があります。

関連情報