擅长:python、mysql、java
<h3>为什么</h3>
<p>当字符串被展开时,它会被拆分成单词,但不会重新计算以查找特殊字符,如引号或美元符号或。。。这是自1978年左右的伯恩壳牌(Bourne shell)以来,壳牌一直“一贯”的做法。</p>
<h3>修复</h3>
<p>在<code>bash</code>中,使用数组保存参数:</p>
<pre><code>argumentArray=(-ir 'hello world')
grep "${argumentArray[@]}" .
</code></pre>
<p>或者,如果勇敢/鲁莽,使用<code>eval</code>:</p>
<pre><code>argumentString="-ir 'hello world'"
eval "grep $argumentString ."
</code></pre>
<p>另一方面,谨慎往往是勇敢的最好部分,与<code>eval</code>合作是一个谨慎胜于勇敢的地方。如果您不能完全控制<code>eval</code>的字符串(如果命令字符串中有任何用户输入未经过严格验证),那么您将面临潜在的严重问题。</p>
<p>注意,GNU Bash手册中的<a href="http://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions" rel="noreferrer">Shell Expansions</a>描述了Bash的扩展序列。请特别注意第3.5.3节Shell参数扩展、第3.5.7节单词拆分和第3.5.9节引号删除。</p>