在bash脚本中,我需要添加一个grep选项以在命令行中接受,以仅从与模式匹配的文件中读取单词。提示用户输入书籍,作者,出版者和出版年份,并且列表以book1〜author1〜pub1〜date1格式存储在文件簿中,每组都在单独的行中。如果在命令行中传递了“ print”(bookinfo打印),则文件“ books”的内容将被放入Book:book1(\ n)作者:author1 ect中的book_print文件中。格式。我想做的是添加一个grep选项,以便在命令行中使用-f选项指定一个字符串时,只有“ books”文件中包含该模式的行才会放入“ book_print”文件中。例如,如果命令是“ bookinfo -f“ author2””,则仅“ books”中的行 包含author2的内容将被放入book_print文件中。(bookinfo是脚本的名称)
这是我到目前为止所拥有的。我启动了-f选项代码,但不知道从这里开始。
#!/bin/bash
n=${1:-1}
#while getopts f name
#do
# case $name in
# f)dopt=1;;
# *) echo "Invalid arg";;
# esac
#done
if [[ $1 == "print" ]]
then
printf "Booktitle: \t\t %s\n" `awk -F '~' '{print $1}' books` >> book_print
printf "Author(s): \t\t %s\n" `awk -F '~' '{print $2}' books` >> book_print
printf "Publisher: \t\t %s\n" `awk -F '~' '{print $3}' books` >> book_print
printf "Year of Publication: \t %s\n" `awk -F '~' '{print $4}' books` >> book_print
else
for ((i = 1; i < n + 1; i++))
do
echo -n "Booktitle: "
read b
book=$b
echo -n $book >> books
echo -n "~" >> books
echo -n "Author(s): "
read a
author=$a
echo -n $author >> books
echo -n "~" >> books
echo -n "Publisher: "
read p
publisher=$p
echo -n $publisher >> books
echo -n "~" >> books
echo -n "Year of publication: "
read y
year=$y
echo $year >> books
done
fi
编辑-我将while循环代码更改为以下代码:
while getops ":f" opt;
do
case $opt in
f)
grep "$OPTARG" books
;;
*)
echo "Invalid argument."
;;
esac
done
我的图书文件包含A〜B〜C〜D和E〜F〜G〜H行。当我运行命令./bookinfo -f“ A”时,将显示整个工作簿文件,而不仅仅是包含A的行。
看来您正朝正确的方向前进,这是您需要的:
#!/bin/bash
while getopts "f:" opt;
do
case $opt in
f)
echo "Found pattern: $OPTARG"
;;
*)
echo "Wrong arg"
# Call the usage function here
esac
done
您可能需要阅读本getops教程,以进一步了解getops的工作原理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句