如何根据我在文件中提供的 $OPTARG 进行搜索?

如何根据我在文件中提供的 $OPTARG 进行搜索?

我正在尝试制作一个可执行文件来搜索特定文本。我想检索数据文件中包含我传递的值的任何行。所以我创建了一个名为的数据文件.addr_book,并创建了一个名为的可执行文件lookup.ksh

Lookuo.ksh:

#!/bin/ksh

while getopts ":a:" option;
do
 case $option in
  a)
   echo searching for $OPTARG
   cat .addr_book | grep -o '$OPTARG.*' 
   ;;
  *)
   echo "invalid option -$OPTARG"
   ;;
 esac
done

当我执行文件时,./lookup.ksh -a test 它只会显示:searching for test

我觉得猫.addr_book | grep -o '$OPTARG.*' 有问题。

任何帮助将不胜感激

答案1

当您在变量扩展周围使用单引号时,您将阻止 shell 扩展该变量。您应该使用双引号。

这里有一个改进建议:

#!/bin/sh

while getopts "a:" option; do
   case $option in
       a) word=$OPTARG ;;
       *) echo 'error' >&2
          exit 1
   esac
done

if [ -z "$word" ]; then
    echo 'Missing word to search for' >&2
    exit 1
fi

printf 'Searching for "%s"\n' "$word"
grep -o "$word.*" .addr_book

我做了一些改变:

  • 该脚本未使用ksh特定功能,因此我将其设为脚本/bin/sh
  • 我将命令行解析与脚本的主要部分(the grep)分开了。这使得脚本更容易维护。
  • :字符串中的首字母getopts表示getopts您将自己处理无效的命令行参数。很少需要这样做,因为来自通常的诊断消息getopts就足够了。
  • 诊断消息(不属于脚本正常输出的任何内容,例如错误消息或警告)应发送到标准错误流 ( >&2)。
  • 如果要搜索的词丢失或为空,则会生成诊断消息。
  • 变量数据的输出应该用 来完成printf
  • cat去掉了。

相关内容