我目前正在从事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
答案 0 :(得分:3)
答案 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 引号内使用,或者必须将其转义为\'
。
=
中的变量作业中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)
我为你缩减了代码。你有几个问题:
today's
之类的字词,或者您开始将所有内容引用到文件的末尾。fi
来结束if语句。你在哪种类型的系统?您应该始终使用真实的实时程序编辑器。我在我工作中使用记事本的打击开发人员。
if
语句和today's
错误。set -xv
放入代码中。一旦shell插入该行,它就会打印出正在执行的行和结果。您甚至可以将PS4
提示设置为\$LINENO:
,这也将打印出您的shell脚本的行号。这是一个很好的调试辅助工具。要关闭详细调试,请使用set +xv
。