Dim*_*ims 5 bash quoting variable
以下脚本:
$ cat runme01.sh
#!/bin/bash
A=myval
B=$A/{fix}
C=$A/fix
set -xT
echo $B
echo $C
Run Code Online (Sandbox Code Playgroud)
如果运行,则打印以下内容:
$ ./runme01.sh
+ echo 'myval/{fix}'
myval/{fix}
+ echo myval/fix
myval/fix
Run Code Online (Sandbox Code Playgroud)
如您所见,变量 B传递给echo在单引号,而变量C传递W / O他们。
可能是花括号导致了这种情况。
我想总是不带引号地传递它们。怎么做?
切勿尝试将跟踪输出解释为纯信息以外的任何内容。这是调试输出。
它在单引号中显示大括号的事实并不意味着外壳程序将该特定字符串解释为myval/{fix}其他任何东西。特别是,它并不能意味着字符串传递引用! shell 在跟踪输出中添加单引号,因为大括号有时是特殊的,但是,在这种情况下它们不是(因为您从未使用实际的大括号扩展)。
同样发生在这里(在一个空目录中运行):
$ echo *
+ echo '*'
*
Run Code Online (Sandbox Code Playgroud)
*我的命令中没有引用,因此 shell 会尝试扩展它。它不会扩展到任何东西,因此它保持未扩展状态。生成跟踪输出的代码注意到*字符串中有 a 并将其加引号。这是基于跟踪打印的字符串中存在的字符机械添加单引号,它不会以任何方式影响命令或其结果。
再次说明这一点:
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Jun 14 20:15 "filename"
-rw-r--r-- 1 kk wheel 0 Jun 14 20:13 'filename'
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 *
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 **
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 123
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 file
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 long name
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 {}
Run Code Online (Sandbox Code Playgroud)
$ echo *
+ echo '"filename"' ''\''filename'\''' '*' '**' 123 file 'long name' '{}'
"filename" 'filename' * ** 123 file long name {}
Run Code Online (Sandbox Code Playgroud)
即,字符串中的某些字符将导致生成跟踪输出的代码在该字符串周围添加引号 bash. shell 还会对字符串中的单引号进行转义。
将其与dash或进行比较pdksh:
$ echo *
+ echo "filename" 'filename' * ** 123 file long name {}
"filename" 'filename' * ** 123 file long name {}
Run Code Online (Sandbox Code Playgroud)
这些特定的 shell 不添加引号(或转义单引号)。真的没关系,它只是调试输出。
始终双引号变量扩展,除非您明确希望 shell 对字符串执行分词和文件名生成(通配)。
并非总是需要双引号,但记住总是双引号比记住不需要的上下文更容易。
您的脚本已更正:
#!/bin/bash
A=myval
B="$A/{fix}"
C="$A/fix"
set -xT
printf '%s\n' "$B"
printf '%s\n' "$C"
Run Code Online (Sandbox Code Playgroud)
这将确保您始终获得这些值$B并$C打印到标准输出,而不管它们的值如何。在您的原始代码中,如果have $Abeen *、 using$B和$Cunquoted 可能会引入一些匹配的文件名。
请注意,跟踪输出仍将引用 myval/{fix}使用此代码字符串。别担心,它没有任何意义,它只是 shell 试图对其调试输出提供帮助。
有关的:
| 归档时间: |
|
| 查看次数: |
2769 次 |
| 最近记录: |