5

需要的脚本是

#!/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

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

对于错误消息,我正在考虑回显类似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 中止,仍然试图获得调用消息的回显。

4

4 回答 4

3

当您调用类似 的脚本./scriptname file > newfile时,shell 解释file./scriptname. 这是因为>是标准输出重定向运算符。

我想提出两种可能的选择:


备选方案 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]}"

注意:如果您正在检查参数是否有效,通常最好在检查完成后才运行命令。


备选方案 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"
于 2012-10-19T07:37:05.267 回答
3

我会为此使用参数扩展:

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

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

于 2012-10-19T08:21:45.653 回答
1

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

if [ ! -f "$1" ]; then

  echo 'Usage: '
  echo 
  echo './Scriptname inputfile > outputfile'
  exit 0

fi
于 2012-10-19T02:49:02.403 回答
1

您还可以检查参数计数$#cat使用消息:

if [ ! $# -eq 1 ]; then
cat << EOF
    Usage:

    $0 'input_file' > output_file
EOF
    exit 1
fi
于 2012-10-19T02:55:41.253 回答