Bash脚本的变量语法错误(家庭作业)
我目前正在为一门Unix课程做家庭作业,其他的事情我都做完了,但我就是不知道我做错了什么。我在csh中完成了完全相同的脚本(但我们也需要在bash中完成)。我已经修复了一些错误,但现在我在尝试运行它时得到的是“变量语法” 我试过在while和ifs中使用双括号 我还尝试在尝试读取输入之前声明输入的变量 我也试过窃听班上的几个人,但他们中的大多数人都很无知,只是模仿别人Bash脚本的变量语法错误(家庭作业),bash,Bash,我目前正在为一门Unix课程做家庭作业,其他的事情我都做完了,但我就是不知道我做错了什么。我在csh中完成了完全相同的脚本(但我们也需要在bash中完成)。我已经修复了一些错误,但现在我在尝试运行它时得到的是“变量语法” 我试过在while和ifs中使用双括号 我还尝试在尝试读取输入之前声明输入的变量 我也试过窃听班上的几个人,但他们中的大多数人都很无知,只是模仿别人 #/!bin/bash # #Menunix - Bash # #Usage: menunixb input = "$(1)"
#/!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应用程序。我见过一些人用蓝鱼。大多数是免费的,易于安装,并且是开源的
- 一个不那么秘密的把戏。将
放入代码中。一旦shell对该行进行插值,它将打印出正在执行的行和结果。您甚至可以将set-xv
提示符设置为PS4
,这样也会打印出shell脚本的行号。这是一个很好的调试辅助工具。要关闭详细调试,请使用\$LINENO:
set+xv
#/usr/bin/env bash
-请参阅以了解其利弊。