我正在尝试编写一个脚本,该脚本将在命令行上接受一个带双引号的空字符串作为附加参数。我希望脚本将这些参数与双引号空字符串一起传递(如果提供),但命令解释器似乎将此类参数解释为空字符串并去掉引号。有什么办法吗?
作为一个简单的例子,我会在文件 script.sh 中:
#!/bin/bash
/home/myapp $1 $2
如果我在提示符下运行:
$ ./script.sh arg1 ""
脚本仅执行 "/home/myapp arg1"
,但遗漏/忽略了第二个参数 ("")
。我希望它保留这个空字符串,而是执行:/home/myapp arg1 ""
最佳答案
您正确地向脚本传递了一个空字符串参数。
是脚本搞砸了:
#!/bin/bash
/home/myapp $1 $2
脚本没有保护 $1
和 $2
的扩展免于分词。这意味着,如果 $1
和 $2
包含多个单词,它们将变成单独的参数,如果其中任何一个扩展为空,它们就会消失。
这应该是:
#!/bin/bash
/home/myapp "$1" "$2"
通常,您可以让脚本将其所有参数传递给被调用的程序,如下所示:
/home/myapp "$@"
引号只是 shell 语法;它们不是参数数据本身的一部分。当您在 shell 中键入 program ""
时,在操作系统级别,程序会收到一个空的 C 语言字符串:一个指向空字节的指针。没有引号。
您可以传递参数 ""
(由两个双引号组成的双字符字符串),但这不是一个空参数。一种方法是,例如,'""'
:将其用单引号括起来。
这样做的唯一原因是当您在元级别操纵 shell 语法时:传递 shell 脚本片段源代码,例如带引号的标记,空的或其他。 shell 有一个名为 eval
的命令,它将源代码作为参数(或多个参数)并对其求值。
empty_shell_string_syntax='""' # this variable holds the characters ""
eval empty_var=$empty_shell_string_syntax # empty_var gets set to empty string
在调用eval
之前,命令行会进行扩展。该扩展删除了语法 $empty_shell_string_sytnax
并将其替换为内容,即字符 ""
。然后 eval 得到字符串 empty_var=""
。它对此进行评估,因此 empty_var
被设置为空字符串,如语法所示。
关于bash - 如何将带双引号的空字符串传递给 bash 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305076/