bash - 如何将带双引号的空字符串传递给 bash 脚本?

标签 bash shell

我正在尝试编写一个脚本,该脚本将在命令行上接受一个带双引号的空字符串作为附加参数。我希望脚本将这些参数与双引号空字符串一起传递(如果提供),但命令解释器似乎将此类参数解释为空字符串并去掉引号。有什么办法吗?

作为一个简单的例子,我会在文件 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/

相关文章:

bash - 按深度排序文件 (bash)

linux - 监听音频线

linux - Linux 相当于 DOS 暂停是什么?

linux - 如何在 if block 的变量中捕获命令错误消息

linux - tar 提取最近的文件

eclipse - *.bat 从 Eclipse 打开的文件在错误的目录中打开

ruby - 使用 Cygwin 运行 Ruby gem

Bash 在变量中存储命令 PID 并终止进程

linux - Curl:如何向 cookie 中插入值?

bash - '\r' : command not found - . bashrc/.bash_profile