如果用户错误地调用脚本,则将BASH脚本退出并打印错误消息



所需的脚本是

#!/bin/bash
# Check if there are two arguments
if [ $# -eq 2 ]; then
   # Check if the input file actually exists.
   if ! [[ -f "$1" ]]; then
     echo "The input file $1 does not exist."
     exit 1
   fi
else
   echo "Usage: $0 [inputfile] [outputfile]"
   exit 1
fi
# Run the command on the input file
grep -P "^[s]*[0-9A-Za-z-]+.?[s]*$" "$1" > "$2"

编辑,脚本已更改为

grep -P "^[s]*[0-9A-Za-z-]+.?[s]*$" $*
if [ ! -f "$1" ]; then
  echo 'Usage: '
  echo
  echo './Scriptname inputfile > outputfile'
  exit 0
fi

无参数调用脚本没有任何误差,坐着空白

Usage: 
./Scriptname inputfile > outputfile

我有一个代码

grep -P "^[s]*[0-9A-Za-z-]+.?[s]*$" $*

此代码在它们上拉出一个单词,然后将输出泵送到新文件,例如

This is a multi word line
this
the above line is not
now
once again wrong

输出将为

This
now

代码有效,用户使用./scriptname file > newfile

调用代码

但是,如果用户错误地调用脚本,我正在尝试扩展代码,以给他们提供错误消息。

对于错误messange,我正在考虑回声回回scriptname file_to_process > output_file之类的东西。

我确实尝试了

if [incorrectly invoted unsure what to type]
echo $usage
exit 1
Usage="usage [inputfile] [>] [outputfile]

但是我几乎没有运气。代码运行,但如果我仅使用脚本名称调用,则无能为力。另外,如果我仅使用脚本名称和输入文件调用脚本,它将输出结果而不是使用错误消息退出。

我尝试过的其他是

if [ ! -n $1 ]; then
  echo 'Usage: '
  echo 
  echo './Scriptname inputfile > outputfile'
  exit 0
fi

给出了我到目前为止收到的答复,我的代码现在

#!/bin/bash
grep -P "^[s]*[0-9A-Za-z-]+.?[s]*$" $*
if [ ! -f "$1" ]; then
  echo 'Usage: '
  echo 
  echo './Scriptname inputfile > outputfile'
  exit 0
fi

在没有输入文件的情况下调用脚本时,脚本无需执行任何操作,必须用Ctrl C中止,仍试图获取Invoke消息的回声。

当您调用脚本(例如./scriptname file > newfile)时,Shell将file解释为./scriptname的唯一参数。这是因为>是标准输出重定向操作员。

我想提出2种可能的替代方案:


替代1 :也许您可以尝试以这样的1个参数的方式传递它?

./scriptname 'file > newfile'

在这种情况下,一种检查格式的一种方法是

#!/bin/bash
# Check if the format is correct
if [[ $1 =~ (.+)' > '(.+) ]]; then
  # Check if the input file actually exists.
  if ! [[ -f "${BASH_REMATCH[1]}" ]]; then
    echo "The input file ${BASH_REMATCH[1]} does not exist!"
    exit 1
  fi
else
  echo "Usage: $0 "[inputfile] [>] [outputfile]""
  exit 1
fi
# Redirect standard output to the output file
exec > "${BASH_REMATCH[2]}"
# Run the command on the input file
grep -P "^[s]*[0-9A-Za-z-]+.?[s]*$" "${BASH_REMATCH[1]}"

Note :如果您要检查参数是否有效,则通常仅在检查完成后运行命令。


替代2 :通过2个参数,例如

./scriptname file newfile

脚本看起来像这样

#!/bin/bash
# Check if there are two arguments
if [ $# -eq 2 ]; then
   # Check if the input file actually exists.
   if ! [[ -f "$1" ]]; then
     echo "The input file $1 does not exist."
     exit 1
   fi
else
   echo "Usage: $0 [inputfile] [outputfile]"
   exit 1
fi
# Run the command on the input file
grep -P "^[s]*[0-9A-Za-z-]+.?[s]*$" "$1" > "$2"

我将使用参数扩展:

inputfile=${1:?Usage: $(basename $0) inputfile > outputfile}

如果脚本是没有参数(即$1尚未设置的)的脚本,则${var:?error message}的扩展会导致Shell在给定消息和退出中显示错误。否则第一个参数将分配给$inputfile

尝试在$1周围添加双引号,并使用-f检查是否存在,并且是正常文件:

if [ ! -f "$1" ]; then
  echo 'Usage: '
  echo 
  echo './Scriptname inputfile > outputfile'
  exit 0
fi

您也可以使用$#cat检查参数计数:

if [ ! $# -eq 1 ]; then
cat << EOF
    Usage:
    $0 'input_file' > output_file
EOF
    exit 1
fi

相关内容

  • 没有找到相关文章

最新更新