我又卡住了。在这种情况下,我试图获取上周的作业,以便在将文件名放在命令行上时进行文本转换。上周的脚本删除了列并重新排列它们,替换了某些字符并删除了一些空格。本周的作业要求修改脚本以包含 if/then 参数。
这是我到目前为止所拥有的:
if [ $# -gt 0 ]
then
./hw9.sh
else
echo "Please enter a filename"
fi
name=First \Last
echo $name
starting_info=raw_info
date
#Pretend the rest of my original script is here#
Run Code Online (Sandbox Code Playgroud)
因此,当我测试它并输入它时./hw9.sh raw_info
,它可以工作,但仍然回显Please enter a filename
并运行我的原始./hw9.sh
脚本两次。Please enter a filename
如果用户只是在命令行上键入,它应该会回显./hw9.sh
,并且如果用户键入,它应该运行我的原始脚本./hw9.sh raw_info
有人可以提供一些指导吗?谢谢你!
根据您的描述,我相信您有一个名为 的脚本hw9.sh
,并且您已经设置了递归执行条件。
当您运行 时hw9.sh raw_info
,if
条件为 true ( = 1),并且执行$#
脚本。hw9.sh
在此嵌套执行中,if
条件为 false ( $#
= 0),因此脚本会回显提示并从那里继续执行。嵌套执行完成后,控件返回到父脚本,然后执行正文之后的脚本其余部分if
。因此,该脚本实际上运行了两次。
您可以使用这样的条件来捕获没有位置参数的情况,而不是使用递归。
if [[ $# -eq 0 ]];
then echo 'A filename is required.'
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
这没有考虑到您有多个位置参数的情况,或者参数不是字符串“raw_info”的情况。您也可以考虑添加这些。
另外,为了使您的最终脚本与最佳实践保持一致,请查看https://www.shellcheck.net/。