说,我有一个用这行调用的脚本:
./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?
我想以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?
如何检查-h属性是否已传递到shell脚本?我想在用户呼叫时显示帮助消息myscript.sh -h.
是否可以在不使用临时文件的情况下在不同的变量中存储或捕获stdout和stderr ?现在我这样做是为了out在err运行时获取stdout 和stderr some_command,但是我想避开临时文件.
error_file=$(mktemp)
out=$(some_command 2>$error_file)
err=$(< error_file)
rm $error_file
Run Code Online (Sandbox Code Playgroud) 我必须在bash中编写一个函数.该函数将需要大约7个参数.我知道我可以调用这样的函数:
要使用参数调用函数:
function_name $arg1 $arg2
Run Code Online (Sandbox Code Playgroud)
我可以在函数中引用我的参数:
function_name () {
echo "Parameter #1 is $1"
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有更好的方法参考函数内部的参数?我可以避免$ 1,$ 2,$ 3,......的事情,只需使用$ arg1,$ arg2,......?
是否有适当的方法或我是否需要将这些参数重新分配给函数内的其他变量?例如:
function_name () {
$ARG1=$1
echo "Parameter #1 is $ARG1"
}
Run Code Online (Sandbox Code Playgroud)
任何例子都将非常感激.
这些术语有什么区别:"选项","参数"和"参数"?在手册页中,这些术语通常似乎可以互换使用.
我想在bash脚本中支持短期和长期选项,因此可以:
$ foo -ax --long-key val -b -y SOME FILE NAMES
Run Code Online (Sandbox Code Playgroud)
可能吗?
我注意到有时包装脚本将${1:+"$@"}用于参数而不仅仅是"$@".
例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用
exec "$binary" $opts ${1:+"$@"}
Run Code Online (Sandbox Code Playgroud)
任何人都可以分解${1:+"$@"}成英语并解释为什么它会优于普通的优势"$@"吗?
我希望能够在我的脚本中接受强制和可选标志.这是我到目前为止所拥有的.
#!bin/bash
while getopts ":a:b:cdef" opt; do
case $opt in
a ) APPLE="$OPTARG";;
b ) BANANA="$OPTARG";;
c ) CHERRY="$OPTARG";;
d ) DFRUIT="$OPTARG";;
e ) EGGPLANT="$OPTARG";;
f ) FIG="$OPTARG";;
\?) echo "Invalid option: -"$OPTARG"" >&2
exit 1;;
: ) echo "Option -"$OPTARG" requires an argument." >&2
exit 1;;
esac
done
echo "Apple is "$APPLE""
echo "Banana is "$BANANA""
echo "Cherry is "$CHERRY""
echo "Dfruit is "$DFRUIT""
echo "Eggplant is "$EGGPLANT""
echo "Fig is "$FIG""
Run Code Online (Sandbox Code Playgroud)
但是,输出如下:
bash script.sh -a apple -b banana …Run Code Online (Sandbox Code Playgroud) 我想让我的bash脚本处理长参数.我找到了getopt,但它在OS X中不受支持.任何人都可以告诉我为什么getoptBSD实现了,而不是GNU?我尝试getopt在GNU C lib中构建,但由于我在Linux上的技能不佳而失败了.
有人做过这项工作吗?
bash ×8
shell ×6
arguments ×2
command-line ×2
getopts ×2
scripting ×2
getopt ×1
getopt-long ×1
gnu ×1
macos ×1
option ×1
parameters ×1
unix ×1