说,我有一个用这行调用的脚本:
./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile
Run Code Online (Sandbox Code Playgroud)
或者这个:
./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile
Run Code Online (Sandbox Code Playgroud)
什么是分析这使得在每一种情况下(或两者的组合)的接受的方式$v,$f以及 $d将全部设置为true和$outFile将等于/fizz/someOtherFile?
我希望使用我的shell脚本调用多种形式的命令行选项.
我知道getopts可以使用,但就像在Perl中一样,我无法对shell做同样的事情.
关于如何做到这一点的任何想法,以便我可以使用如下选项:
./shell.sh --copyfile abc.pl /tmp/
./shell.sh -c abc.pl /tmp/
Run Code Online (Sandbox Code Playgroud)
在上面,两个命令对我的shell意味着相同的东西,但使用getopts,我还没有能够实现这些?
我想以myscript这种方式调用文件:
$ ./myscript -s 45 -p any_string
Run Code Online (Sandbox Code Playgroud)
要么
$ ./myscript -h #should display help
$ ./myscript #should display help
Run Code Online (Sandbox Code Playgroud)
我的要求是:
getopt 这里得到输入参数-s存在,如果没有返回错误-s是45还是90-p存在并且之后有输入字符串./myscript -h或只是./myscript显示帮助我到目前为止尝试了这段代码:
#!/bin/bash
while getopts "h:s:" arg; do
case $arg in
h)
echo "usage"
;;
s)
strength=$OPTARG
echo $strength
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
但是使用该代码我会收到错误.怎么用Bash和getopt?
我需要帮助getopts.
我创建了一个Bash脚本,在运行时看起来像这样:
$ foo.sh -i env -d directory -s子目录-f文件
从每个标志处理一个参数时,它可以正常工作.但是当我从每个标志调用几个参数时,我不确定如何从变量中提取多个变量信息getopts.
while getopts ":i:d:s:f:" opt
do
case $opt in
i ) initial=$OPTARG;;
d ) dir=$OPTARG;;
s ) sub=$OPTARG;;
f ) files=$OPTARG;;
esac
done
Run Code Online (Sandbox Code Playgroud)
抓住选项后,我想从变量构建目录结构
foo.sh -i test -d directory -s subdirectory -s subdirectory2 -f file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
那么目录结构就是
/test/directory/subdirectory/file1
/test/directory/subdirectory/file2
/test/directory/subdirectory/file3
/test/directory/subdirectory2/file1
/test/directory/subdirectory2/file2
/test/directory/subdirectory2/file3
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想getopts在我的.bash_profile中定义的函数内部使用.我的想法是,我想将一些标志传递给此函数以改变其行为.
这是代码:
function t() {
echo $*
getopts "a:" OPTION
echo $OPTION
echo $OPTARG
}
Run Code Online (Sandbox Code Playgroud)
当我这样调用它时:
t -a bc
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
-a bc
?
Run Code Online (Sandbox Code Playgroud)
怎么了?我想在bc没有手动移位和解析的情况下获得该值.如何getopts在函数内正确使用?
编辑:纠正我的代码片段尝试$ OPTARG,无济于事
编辑#2:好的事实证明代码没问题,我的shell被搞砸了.打开一个新窗口解决了它.arg值确实在$ OPTARG中.
是否可以使用getopts一起处理多个选项?例如,myscript -iR或myscript -irv.
此外,我有一种情况,基于条件脚本将需要强制选项.例如,如果脚本的参数是一个目录,我将需要指定-R或-r选项以及任何其他选项(myscript -iR mydir或myscript -ir mydir或myscript -i -r mydir或myscript -i -R mydir),如果只有文件-i就足够了(myscript -i myfile).
我试图搜索但没有得到任何答案.
while getopts "hd:R:" arg; do
case $arg in
h)
echo "usgae"
;;
d)
dir=$OPTARG
;;
R)
if [[ $OPTARG =~ ^[0-9]+$ ]];then
level=$OPTARG
else
level=1
fi
;;
\?)
echo "WRONG" >&2
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
level是指参数-R,dir是指参数-d
当我输入 ./count.sh -R 1 -d test/它正确的工作
当我输入./count.sh -d test/ -R 1它正确的工作
但我想在输入./count.sh -d test/ -R或输入时使其工作./count.sh -R -d test/
这意味着我想要-R一个默认值,命令序列可以更灵活.
我试图-temp用Bash getopts 解析一个选项.我正在调用我的脚本:
./myscript -temp /foo/bar/someFile
Run Code Online (Sandbox Code Playgroud)
这是我用来解析选项的代码.
while getopts "temp:shots:o:" option; do
case $option in
temp) TMPDIR="$OPTARG" ;;
shots) NUMSHOTS="$OPTARG" ;;
o) OUTFILE="$OPTARG" ;;
*) usage ;;
esac
done
shift $(($OPTIND - 1))
[ $# -lt 1 ] && usage
Run Code Online (Sandbox Code Playgroud) 我想像这样调用一个bash脚本
$ ./scriptName -o -p -t something path/to/file
Run Code Online (Sandbox Code Playgroud)
这是我得到的
#!/bin/bash
o=false
p=false
while getopts ":opt:" options
do
case $options in
o ) opt1=true
;;
p ) opt2=true
;;
t ) opt3=$OPTARG
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
但我怎么得到path/to/file?
我正在寻找一种方法来处理包含空格的参数,这些空格必须由shell getopts命令解析.
while getopts ":a:i:o:e:v:u:" arg
do
echo "ARG is: $arg" >> /tmp/submit.log
case "$arg" in
a) arg1="$OPTARG" ;;
i) arg2="$OPTARG" ;;
o) arg3="$OPTARG" ;;
...
u) argn="$OPTARG" ;;
-) break ;;
\?) ;;
*) echo "unhandled option $arg" >> /tmp/submit.log ;;
?) echo $usage_string
exit 1 ;;
esac
done
Run Code Online (Sandbox Code Playgroud)
现在,如果-u具有像"STRING WITH WHITE SPACE"这样的参数,而不仅仅是触发了字符串的第一部分,而while循环不会结束.
非常感谢.