我正在尝试编写一个脚本,它将在命令行中接受带有双引号的空字符串作为附加参数。我希望脚本将这些参数与双引号空字符串一起传递,但命令解释器似乎将这种参数解释为空字符串,并删除引号。有办法这样做吗?
作为一个简单的例子,我将在文件script.sh中获得:
#!/bin/bash
/home/myapp $1 $2如果我按提示运行:
$ ./script.sh arg1 ""脚本只执行"/home/myapp arg1",但忽略/忽略第二个参数("")。我希望它保留这个空字符串,而不是执行:/home/myapp arg1 ""
发布于 2014-04-26 02:57:21
您正在正确地将空字符串参数传递给脚本。
是脚本搞砸了它:
#!/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被设置为空字符串,正如语法所示。
发布于 2014-04-26 00:36:04
如果您将"$@" 传递给,则 空的参数将被传递,太了。
#!/bin/bash
/home/myapp "$@"通过"$@"传递的原始参数与传入的参数完全相同-即使是作为空字符串传递的参数(例如,''、""或"$someVar"传递,其中变量someVar未设置或包含空字符串)。
如果可能存在,则多个参数()
#!/bin/bash
# Copy the (up to) first 2 arguments - whether they're empty strings or not -
# to a separate array.
firstTwo=("${@:1:2}")
shift; shift # Remove the first 2 arguments from the arguments array.
# Invoke the app with the (up to) first 2 arguments stored in the new array.
/home/myapp "${firstTwo[@]}"
# Process the remaining arguments, if any.
for a; do
echo "remaining: [$a]"
done发布于 2014-04-26 00:24:29
你应该用反斜杠逃避它。
$ ./script.sh arg1 \"\"可进行测试,例如在回波上:
$ echo \"\"
""https://stackoverflow.com/questions/23305076
复制相似问题