我又卡住了。在这种情况下,我试图获取上周的作业,以便在将文件名放在命令行上时进行文本转换。上周的脚本删除了列并重新排列它们,替换了某些字符并删除了一些空格。本周的作业要求修改脚本以包含 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#
因此,当我测试它并输入它时./hw9.sh raw_info
,它可以工作,但仍然回显Please enter a filename
并运行我的原始./hw9.sh
脚本两次。Please enter a filename
如果用户只是在命令行上键入,它应该会回显./hw9.sh
,并且如果用户键入,它应该运行我的原始脚本./hw9.sh raw_info
有人可以提供一些指导吗?谢谢你!
答案1
根据您的描述,我相信您有一个名为 的脚本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
这没有考虑到您有多个位置参数的情况,或者参数不是字符串“raw_info”的情况。您也可以考虑添加这些。
另外,为了使您的最终脚本与最佳实践保持一致,请查看https://www.shellcheck.net/。
答案2
如果您实际上没有接受文件名并执行某些操作,那么询问文件名是没有意义的。因此,如果给定了一个文件并且是有效的常规文件,那么让您的脚本对文件进行操作;如果没有给出文件,则让您的脚本对默认文件名进行操作。我们还添加一些基本的错误检查:
#!/bin/bash
## Set the default input file
file_name="raw_info"
# Exit if we have more than one argument
if [ $# -gt 1 ]; then
echo "This script can only take one argument." >&2
exit 1
# If we have exactly one argument, check that it is an existing file
elif [ $# -eq 1 ]; then
if [ -f "$1" ]; then
file_name="$1"
echo "I will work on provided file '$file_name'."
elif [ -d "$1" ]; then
echo "You gave '$1', but that is a directory!"
exit 2
else
echo "You gave '$1' but it isn't an existing regular file!" >&2
exit 3
fi
else
if [ -e "$file_name" ]; then
echo "No file name given, I will work on '$file_name'." >&2
else
echo "No file name given and default file name '$file_name' not found!" >&2
exit 4
fi
fi
### Assuming you want the script from https://unix.stackexchange.com/q/721051
cut -f3 -d, "$file_name" > first
cut -f2 -d, "$file_name" > last
cut -f1 -d, "$file_name" > id
该脚本将cut
在变量中存储的任何文件上运行命令,如果没有向脚本提供参数,则该文件$file_name
将是默认值,或者如果您传递参数,则为您提供的任何参数。raw_info
只是>&2
将错误和信息消息发送到标准错误。如需有关所使用的各种测试的帮助,请help test
在终端中运行。