【问题标题】:Parameter not being passed to shell script copyfile.sh: 1: copyfile.sh: [d: not found参数未传递给 shell 脚本 copyfile.sh: 1: copyfile.sh: [d: not found
【发布时间】:2013-08-31 18:29:44
【问题描述】:

我正在尝试将一个简单的参数传递给一个 shell 脚本。这是脚本:

if ["$1" == "d"]; then

        if ["$2" == NULL]; then
            echo "Please enter the local location of the files"
        else
            LOCAL = $2
            scp -r -i ~/Dropbox/Business/aws/first.pem $LOCAL ubuntu@XX.XX.194.202:~/test/
        fi

    else
        scp -r -i ~/Dropbox/Business/aws/first.pem ~/Dropbox/Business/aws/files/binaryhustle/ ubuntu@XX.XX.194.202:~/test/
    fi

我输入:sh copyfile.sh d 我得到的错误是copyfile.sh: 1: copyfile.sh: [d: not found

【问题讨论】:

  • 命令后面什么时候不用空格了?
  • 抱歉,不确定您的意思?这是我的第一个 shell 脚本

标签: linux bash shell unix sh


【解决方案1】:

由于您使用的是双等号 (==),我可以假设您使用的是 Bash 等高级 shell。对于普通的 shell,你只能使用一个 = 例如

if [ "$1" = d ]; then

对于上面的代码,将"$1"、=、d 和] 视为[ 的3 个单独参数,就像任何其他命令一样,因此需要空格来分隔它们。如果您执行了["$1",那就像尝试运行"[$1" 一样。只有if 所做的是根据前面命令的结果来决定脚本的流程,[ 通常可以返回 0(成功/真)或 1(失败/假)。

其实相当于:

if test "$1" = d; then

此外,shell 脚本中没有 NULL 关键字。您必须与空字符串进行比较

        if [ "$2" = '' ]; then

或者使用-z:

        if [ -z "$2" ]; then

对于 bash,建议使用 [[ ]]。这是一种特殊的语法,不像 '[' 或 'test' 像其他命令一样执行。它在更高的层次上得到了更多的解释。有了它,即使不引用变量,参数也不会受到路径名扩展或分词的影响。

if [[ $1 == d ]]; then

        if [[ -z $2 ]]; then

虽然我仍然建议为带有变量的文字字符串引用第二个参数,以防止由于每个版本(可能是较旧的版本)的 bash 实现不同而导致重新解释。

[[ $var == "$xyz" ]]

而且你不能在作业上放置空格:

        LOCAL=$2

最好用变量引用你的论点以防止word splitting 和pathname expansion。

        scp -r -i ~/Dropbox/Business/aws/first.pem "$LOCAL" ubuntu@XX.XX.194.202:~/test/

【讨论】:

  • 哇,这帮了大忙,我还应该提到,通过运行 bash 而不是 sh,我克服了一些问题,在你告诉我 == 是 bash 语法的一部分之后,我这样做了。跨度>
【解决方案2】:

Shell 脚本真的特别关注空格,所以 if 条件应该这样写:

if [ "$1" == "d" ]; then

此外,与 NULL 的比较可能不起作用,但这应该可以解决问题:

if [ "$2" == "" ]; then

【讨论】:

    【解决方案3】:

    if 语句中的括号在[ 之后和] 之前需要空格:

    if [ "$1" == "d" ]; then
    

    如果您不放置空格,那么 shell 会看到 [d,因为您将字符串 ["$1" 中的 d 替换为 $1。

    此外,如果您正在检查 $2 是否为空,则无法通过与 NULL 进行比较来做到这一点。 NULL 不是预定义的 shell 空字符串。你需要这样做:

    if [ "$2" == "" ]; then
    

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2012-12-08
      相关资源
      最近更新 更多