我正在尝试制作一个可执行文件来搜索特定文本。我想检索数据文件中包含我传递的值的任何行。所以我创建了一个名为的数据文件.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
去掉了。