if/then 参数 linux

if/then 参数 linux

我又卡住了。在这种情况下,我试图获取上周的作业,以便在将文件名放在命令行上时进行文本转换。上周的脚本删除了列并重新排列它们,替换了某些字符并删除了一些空格。本周的作业要求修改脚本以包含 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_infoif条件为 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在终端中运行。

相关内容