在我正在处理的bash脚本中,我需要在命令行添加一个grep选项,以便只读取与模式匹配的文件中的单词。提示用户输入书籍,作者,出版商和发布年份,并且列表以book1~author1~pub1~date1格式存储在文件簿中,每个集合在一个单独的行上。如果在命令行(bookinfo打印)传递“print”,则将文件“books”内容放入Book:book1(\ n)中的book_print文件中。 作者:author1等。格式。我要做的是添加一个grep选项,以便在命令行中使用-f选项指定字符串时,只有“books”文件中包含该模式的行才会放在“book_print”文件中。例如,如果命令是“bookinfo -f”author2“”,则只有包含author2的“books”中的行将被放入book_print文件中。 (bookinfo是脚本的名称)
这是我到目前为止所拥有的。我启动了-f选项代码,但不知道从哪里开始。
while getops ":f" opt;
do
case $opt in
f)
grep "$OPTARG" books
;;
*)
echo "Invalid argument."
;;
esac
done
编辑 - 我将while循环代码更改为以下内容:
LinearProgress
我的书籍文件包含A~B~C~D和E~F~G~H行。当我运行命令./bookinfo -f“A”时,我会看到整个书籍文件,而不仅仅是包含A的行。
答案 0 :(得分:2)
好像你朝着正确的方向前进,这就是你需要的:
#!/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 tutorial以进一步了解getops的工作原理。
答案 1 :(得分:1)
不是答案,而是快速重写以使您的代码更紧凑:
print() {
# doing this in a single awk command is much more efficient
# the default search pattern is "non-empty line"
awk -F '~' -v pattern="${1:-.}" '
$0 ~ pattern {
printf "Booktitle: \t\t %s\n", $1
printf "Author(s): \t\t %s\n", $2
printf "Publisher: \t\t %s\n", $3
printf "Year of Publication: \t %s\n", $4
}
' books >> book_print
}
populate() {
while true; do
# use read -p to incorporate the prompt,
# and just use one variable per item
read -p "Booktitle (blank to quit): " book
[[ -z "$book" ]] && break
reap -p "Author(s): " author
read -p "Publisher: " publisher
read -p "Year of publication: " year
# critically important to quote the variables here:
printf "%s~%s~%s~%s\n" "$book" "$author" "$publisher" "$year"
done >> books
}
# magic getopts here to set the search pattern, say in $search variable,
# and a flag to indicate print versus populate
if [[ "$do_search" -eq 1 ]]; then
print "$search"
else
populate
done