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

时间:2014-03-26 23:27:33

标签: bash

我目前正在从事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

5 个答案:

答案 0 :(得分:3)

看看:

input = "$(1)"

你注意到等号(=)周围的空格?这个is not allowed在bash中。它必须是

input="$(1)"

代替。

答案 1 :(得分:2)

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

echo 2: Display today's date and time

特别错误,因为它打开报价,但从不关闭它。尝试引用所有这些回声线:

echo "2: Display today's date and time"

剧透:我很无聊,refactored this。随意使用它来研究在shell中做事的不同方式。它可能涉及您在课堂上已经介绍过的功能,但无论如何您可能会觉得它很有用。

答案 2 :(得分:1)

更新:正如OP发现的那样,另一个问题是格式错误的shebang行:#/!bin/bash而不是#!/bin/bash(考虑使用#!/usr/bin/env bash)。< / p>

事先提示:http://shellcheck.net是检查shell代码错误的非常方便的工具。


@Ube和@ kojiro的回答都包含重要的指示:

  • '用于引用,因此必须在 double 引号内使用,或者必须将其转义为\'

    < / LI>
  • =中的变量作业中bash周围不允许有空格。

但还有更多:

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

  • 始终在bash中使用[[ ... ]]而不是[ ...];它更强大,并提供更多功能;一个恰当的例子:如果[ $input != 5 ]未定义或为空,$input中断 - 您必须对其进行双引号以防止这种情况发生;相比之下,可以使用[[ $input != 5 ]]

  • 所有 case分支必须以;;终止(即使是仅包含exit命令的分支;)。精细打印:最后一个分支也可以在没有;;

  • 的情况下工作
  • if [ -d $finput ] ; then ...语句缺少结束fi

答案 3 :(得分:0)

错误实际上在解释器行:

#/!bin/bash

不同
#!/bin/bash

一旦我实际上让脚本在bash中运行,那只是一些小的语法错误而且我已经完成了。

答案 4 :(得分:0)

我为你缩减了代码。你有几个问题:

  • 始终在echo语句周围使用引号。您无法使用today's之类的字词,或者您开始​​将所有内容引用到文件的末尾。
  • 使用缩进。我缩减了编辑器中出现的代码。注意什么?您错过了fi来结束if语句。

你在哪种类型的系统?您应该始终使用真实的实时程序编辑器。我在我工作中使用记事本的打击开发人员。

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