我目前正在编写一个脚本,而且我正在艰难地使用带有强制参数的多个标志。为了简洁起见,我将其缩小为两个选项(即使它仍然很长)
#THE NAME OF THE SCRIPT IS testfind.sh
#!/bin/bash
while getopts :f:d: opt
do
case $opt in
f) #With the flag (-f), we run a find command to search
fOption=$OPTARG #for all files. The $OPTARG is the directory the user
find ${fOption} -type f #gives the command to start the search. Same concept
;; #with flag (-d) except it runs find on directories.
d)
dOption=$OPTARG
find ${dOption} -type d
;;
esac
done
shift $((OPTIND -1))
如果我只使用两个标志中的一个来运行命令,它运行正常。我正在使用wc -l进行测试。为清楚起见,我将使用系统显示的文件和目录的数量:
./testfind.sh -f /home | wc -l #WORKS FINE, puts out a count of 342
./testfind.sh -d /home | wc -l #WORKS FINE, puts out a count of 1996
./testfind.sh -d /home -f /home | wc -l #WORKS FINE, puts out count of 2338, (total of d and f)
现在这里是1和2的标志
./testfind.sh -df /home | wc -l #FAILS, RUNS FIRST FLAG BUT NOT
#THE SECOND. It will only run whichever
#flag I put in first.
我正在尝试使^上面的最后一行工作,以便它同时输出d和f的输出(-df)。在GetOpts中有没有办法做到这一点?
答案 0 :(得分:0)
Getopts支持使用多个语句,但不会使用强制语句的多个语句。如上所述,以下内容无效:
./testfind.sh -df /home | wc -l
当我们查看我们为getopts提供的所有标志选项时,我们会看到以下内容
getopts :f:d: opt
注意:这是我犯错误的地方。 f和d标志都期待最后的强制性声明。由于getopts不支持这一点,而不是将f作为第二个标志读取,它正在读取它,好像它是强制语句本身一样。为了绕过这个,我做了以下几点:
#!/bin/bash
while getopts :fd opt #NOTE: ONLY USE SHORT FLAGS! THIS WAY, GET OPTS
do #CAN EASILY CALL ON WHATEVER YOU THROW AT IT.
#MULTIPLE MANDATORY ARGUMENTS NOT SUPPORTED BY GETOPTS.
case $opt in
f)
fOption=$OPTARG #The variable ${2} is where all the power in this
find ${2} -type f #Script lies. By default, getOpts is taking every
;; #Argument you throw at it after the name of the
#Script. In this case It's everything after
d) #./testfind.sh . For Example, it took -df and set
dOption=$OPTARG #-df to $1. The same way, it takes /home and set
find ${2} -type d #/home itself to $2.
;;
esac
done
shift $((OPTIND -1))
所需的一切都在评论中解释(在#的右侧)。现在,同样的概念将适用于您抛出的任何目录和标志。只要标志有效且目录有效,它就会找到您需要的任何内容并以您想要的任何顺序打印出来。你甚至可以抛出./testfind -dfdfdfdfdfdfdfdf / home,它会打印你喂它的目录中的每一个标志。 Neato aye!
-Credits向Mark Plotnick发表评论,重点介绍了getopts如何阅读带有强制性陈述的旗帜。谢谢!