【问题标题】:Bourne Shell - How to identify that first parameter is ''Bourne Shell - 如何识别第一个参数是''
【发布时间】:2012-02-23 11:17:55
【问题描述】:

Bourne Shell 脚本如何知道它收到的第一个参数是''(两个单引号?

我试过了

if [ -z "$1" ] ; then
    echo "Wrong number of parameters"
fi

但似乎$1 扩展为空字符串,"$1" 也是如此。

【问题讨论】:

  • 需要这是''吗?那么,通过"''" 应该可以工作。
  • 喜欢它是 '',这样 Linux 和 Windows 版本的相同脚本的用户将使用相同的参数。

标签: linux shell parameters sh


【解决方案1】:

当您在命令行 shell 中键入 '' 时,将其转换为参数 - 零长度字符串。 检查保存数字或参数的变量(在检查 -z "$1" 之前)。

# check for any arguments
if [ "$#" -eq 0 ]; ...
# or -- has arguments and first one is ''
if [ "$#" -gt 0 -a -z "$1" ]; ...

有关 INTEGER 比较测试(-eq、-gt 等),请参见“man test”。

编辑(根据 cmets 提问):

在 Windows 上(您使用什么外壳?)您必须检查 ''(两个字符)(我认为 cmd.exe 以这种方式传递)。在 linux 上,你的脚本得到一个字符串长度为零的参数。

如果 [ \( "$#" -gt 0 -a -z "$1" \) -o "$1" = "''" ]; ...

【讨论】:

  • 所以你是说脚本不知道它是 '' 还是一个空字符串,因为 '' 在调用之前被“翻译”了?
  • 是的,在 Linux shell 上进行参数处理/引用/等。在您的脚本中,无法检测用户输入的是“”还是“”。您只能通过查看参数计数器 ($#) 来检测是否存在零长度参数或根本没有参数。
  • 谢谢,我想你的解决方案现在最适合我。
  • @kupson 您必须检查 $# 才能知道是否传递了空参数,这是不正确的。 ${1?Unset} 将退出脚本,如果没有传递参数,但如果传递了空字符串则不会,如果传递了空参数,则 ${1+set} 将被“设置”,否则为空字符串。跨度>
  • @WilliamPursell 毕竟看起来 bash 4.1.5 和 dash 0.5.5 无法区分 ${1:-x} (或 ':?x' ':+x' ) 在 "" 和不传递参数之间。
【解决方案2】:

我假设你的意思是传递了一个参数,但它的值为空。检查方法如下:

if [ $# -gt 0 -a "$1" = '' ]
then
    echo '$1 was passed, but empty'
fi

如果您想检查传递了多少参数(是否为空),请使用$#(参数计数):

if [ $# -eq 0 ]
then
    echo 'no parameters were passed'
fi

如果你想检查两个引号("")和引号('')之间的区别,没有办法做到这一点仅在 Bourne shell 中。到您的代码执行时,这些字符串已被评估为空字符串。

【讨论】:

    【解决方案3】:

    '' 显然不是空字符串;它包含两个字符。做

    [ "$1" = "''" ]
    

    但是,在 (Linux) 命令行上,您必须将参数传递为

    ./script.sh "''"
    

    【讨论】:

    • 如果我回显 "$1" 我仍然得到空字符串,为什么比较会起作用?另外我怀疑你打算使用==
    • = 应该可以很好地进行字符串比较。如果$1是空字符串,这显然会返回false。
    【解决方案4】:
    if [ "$1" == "--" ] ; then
         echo "Wrong number of parameters"
    fi
    

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2010-09-07
      • 2016-03-10
      • 2017-12-03
      相关资源
      最近更新 更多