我想以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?
我如何检查正确的参数数量(一个参数).如果有人试图在不传递正确数量的参数的情况下调用脚本,并检查以确保命令行参数确实存在并且是目录.
我正在尝试做一些常见的事情:在shell脚本中解析用户输入.如果用户提供了有效的整数,则脚本会执行一项操作,如果无效,则执行其他操作.麻烦的是,我还没有找到一种简单(而且相当优雅)的方式 - 我不想用char来区分char.
我知道这一定很容易,但我不知道如何.我可以用十几种语言来做,但不是BASH!
在我的研究中,我发现了这个:
其中有一个关于正则表达式的答案,但据我所知,这是C(以及其他)中可用的函数.尽管如此,它看起来像是一个很好的答案,所以我用grep尝试了它,但是grep不知道该怎么做.我试过-P在我的盒子上意味着把它当作PERL regexp - nada.Dash E(-E)也没有用.并且-F都没有.
为了清楚起见,我正在尝试这样的东西,寻找任何输出 - 从那里,我将破解脚本以利用我得到的任何东西.(IOW,我期待一个不合格的输入在有效行重复时不返回任何内容.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Run Code Online (Sandbox Code Playgroud)
有人请说明这是最容易做到的吗?
坦率地说,在我看来,这是TEST的缩影.它应该有这样的旗帜
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
Run Code Online (Sandbox Code Playgroud) 我想同时使用getopts和位置参数,但是如果我将位置参数传递给程序,则会getopts丢失。
directory=$1
while getopts l: flag; do
case "$flag" in
l) level=$OPTARG;;
esac
done
if [ -n "$level" ]; then
echo "Level exist!"
else
echo "Level doesn't exist!"
fi
Run Code Online (Sandbox Code Playgroud)
所以当我像这样运行程序时:
sh myprogram.sh ~/documents -l 2
Run Code Online (Sandbox Code Playgroud)
我预计:
Level exist!
相反,它返回:
Level doesn't exist!
问题是,如果我在没有位置参数(~/documents)的情况下运行程序,如下所示:
sh myprogram.sh -l 2
我得到正确的输出:
Level exist!
这是为什么?如何getopts在 bash 中同时使用位置参数?
谢谢!