Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本的变量语法错误(家庭作业)_Bash - Fatal编程技术网

Bash脚本的变量语法错误(家庭作业)

Bash脚本的变量语法错误(家庭作业),bash,Bash,我目前正在为一门Unix课程做家庭作业,其他的事情我都做完了,但我就是不知道我做错了什么。我在csh中完成了完全相同的脚本(但我们也需要在bash中完成)。我已经修复了一些错误,但现在我在尝试运行它时得到的是“变量语法” 我试过在while和ifs中使用双括号 我还尝试在尝试读取输入之前声明输入的变量 我也试过窃听班上的几个人,但他们中的大多数人都很无知,只是模仿别人 #/!bin/bash # #Menunix - Bash # #Usage: menunixb input = "$(1)"

我目前正在为一门Unix课程做家庭作业,其他的事情我都做完了,但我就是不知道我做错了什么。我在csh中完成了完全相同的脚本(但我们也需要在bash中完成)。我已经修复了一些错误,但现在我在尝试运行它时得到的是“变量语法”

我试过在while和ifs中使用双括号 我还尝试在尝试读取输入之前声明输入的变量 我也试过窃听班上的几个人,但他们中的大多数人都很无知,只是模仿别人

#/!bin/bash
#
#Menunix - Bash
#
#Usage: menunixb
input = "$(1)" 
while [ $input != 5 ]
do
    echo Please choose an option
    echo 1: List Files 
    echo 2: Display today's date and time
    echo 3: Check whether a file is a directory or not
    echo 4: Create a file backup
    echo 5: Quit
    read input
    case $input in
        1) 
            ls
            ;;
        2)
            echo -n Time:
            date +"%T"
            echo Date:
            date +"%D"
            ;;
        3)
            echo What file do you wish to check
            read finput
            if [ -d $finput ] ; then
                echo $finput is a Directory
            elif [ -f $finput ] ; then
            echo $finput is a File
            else
                echo $finput does not exist
                ;;
            4)
                echo Please enter filename to backup
                read binput
                cp $binput{,.bak}
                ;;
            5)
                exit 1
            *)
                echo Please choose a valid input
                exit 1
            esac
        done
#EOF

您必须修复
echo
语句周围的引号

echo 2: Display today's date and time
尤其错误,因为它打开报价单,但从不关闭报价单。尝试引用所有这些回音行:

echo "2: Display today's date and time"
剧透者:我很无聊,很无聊。您可以随意使用它来研究在shell中做事情的不同方式。它可能涉及到你在课堂上没有被介绍过的功能,但你可能会发现它很有用。

看看:

input = "$(1)"
你注意到等号(=)周围的空格了吗?这是在bash。一定是这样

input="$(1)"

相反。

更新:正如OP发现的,另一个问题是错误的shebang行:
#/!bin/bash
而不是
#/bin/bash
(不过可以考虑使用
#!/usr/bin/env-bash

预先提示:是检查shell代码错误的非常方便的工具


@Ube和@kojiro的答案都包含重要的提示:

  • 用于引用,因此它必须在双引号内使用,或者必须作为
    \”
    转义

  • bash
    中变量赋值中的
    =
    周围不允许有空格

但还有更多:

  • 使用
    $1
    引用第一个参数
    $(1)
    做了一些根本不同的事情:它使用命令替换(
    $(…)
    )来执行包含的命令并返回其stdout输出;因此,
    $(1)
    尝试执行一个很可能不存在的命令
    1
    并返回其输出

  • 在bash中始终使用
    […]
    而不是
    […]
    ;它更健壮,提供更多功能;举个例子:
    [$input!=5]
    如果
    $input
    未定义或为空,则它将中断-您必须对其进行双引号以防止出现这种情况;相比之下,可以使用
    [[$input!=5]]

  • 所有
    案例
    分支必须以
    终止
    (即使是只包含
    退出
    命令的分支;)。精细打印:最后一个分支也可以不包含

  • if[-d$finput];然后…
    语句缺少结束符
    fi


错误实际上在解释器线路上:

#/!bin/bash
不一样

#!/bin/bash

一旦我真的在bash中运行了脚本,它只是一些小的语法错误,我就完成了

我为您缩进了代码。您有几个问题:

  • 在echo语句周围始终使用引号。您不能使用像今天的这样的词,否则您将开始在文件末尾引用所有内容
  • 使用缩进。我缩进了编辑器上显示的代码。注意到什么了吗?您缺少用于结束if语句的
    fi
你使用什么类型的系统?您应该始终使用真正的实时程序编辑器。我对在我的工作中使用记事本的开发人员使用兴奋剂

  • 您始终可以在任何平台上使用。它安装在Linux和Mac上,可以在Windows上下载。执行自动缩进和语法突出显示,这将捕获不完整的
    if
    语句和您今天的
    错误
  • VIM可能有点令人生畏。它很强大,但很难学习。是一个易于使用的程序编辑器,具有语法高亮显示和自动缩进功能
  • 在Mac上,可以免费试用,包括语法高亮显示和自动缩进。您还可以使用Mac OS X免费提供的Xcode
  • 在Linux上,您只能靠自己。大多数Linux用户使用VIM、EMACs或Eclipse。Kate很受欢迎,但却是KDE应用程序。我见过一些人用蓝鱼。大多数是免费的,易于安装,并且是开源的
  • 一个不那么秘密的把戏。将
    set-xv
    放入代码中。一旦shell对该行进行插值,它将打印出正在执行的行和结果。您甚至可以将
    PS4
    提示符设置为
    \$LINENO:
    ,这样也会打印出shell脚本的行号。这是一个很好的调试辅助工具。要关闭详细调试,请使用
    set+xv

查看代码的语法突出显示。提示:请考虑使用缩进。这使得代码更具可读性,从而更易于调试。:)注意,为了更便于移植,并尊重用户对bash解释器的选择,有些人更喜欢
#/usr/bin/env bash
-请参阅以了解其利弊。