Ale*_*lex 9 shell bash quoting
我有一些 bash 脚本,其中一个包含以下内容:
#!/bin/bash
source $(dirname ${BASH_SOURCE[0]})/script.sh
Run Code Online (Sandbox Code Playgroud)
而另一个有以下内容:
#!/bin/bash
source "$(dirname ${BASH_SOURCE[0]})/script.sh"
Run Code Online (Sandbox Code Playgroud)
这些脚本的行为有何不同,为什么?什么是区别?
Adr*_*rth 12
如果没有引号,字符串会受到分词和globbing 的影响。另请参阅BashPitfalls #14。
相比
$ echo $(printf 'foo\nbar\nquux\n*')
foo bar quux ssh-13yzvBMwVYgn ssh-3JIxkphQ07Ei ssh-6YC5dbnk1wOc
Run Code Online (Sandbox Code Playgroud)
和
$ echo "$(printf 'foo\nbar\nquux\n*')"
foo
bar
quux
*
Run Code Online (Sandbox Code Playgroud)
当分词发生时,第一个字符IFS
用作分隔符(默认情况下,它是一个空格)。
在几乎所有情况下,您都希望添加引号。有一些例外,例如
在不发生分词/通配符的表达式中,例如简单(非数组)赋值和case
语句。以下都是安全的:
foo=*
foo=${bar}qux${quux}
foo=$(bar "${quux}")
case ${var} in
然而,这不是(如果您所追求的是带有文字星号字符的单个元素):
foo=( * )
当您特别希望发生分词时,例如在以空格分隔的字符串中循环标记(禁用通配符)。但是 - 如果可能,请使用数组。
主要区别在于引用的版本不受 shell 的字段拆分的影响。
使用双引号,命令扩展的结果将作为一个参数提供给source
命令。如果没有引号,它将被分解为多个参数,IFS
默认情况下取决于其中包含空格、制表符和换行符的值。
如果目录名称不包含此类空格,则不会发生字段拆分。
根据经验,最好在命令替换和变量扩展中使用双引号。
归档时间: |
|
查看次数: |
6448 次 |
最近记录: |