Jim*_*mmy 66 linux bash shell debian
我正在尝试创建一个shell脚本,其设计如下:
script.sh -t application
Run Code Online (Sandbox Code Playgroud)
首先,在我的脚本中,我想检查脚本是否已使用-t标志运行.例如,如果它没有像这样的标志运行我想让它出错:
script.sh
Run Code Online (Sandbox Code Playgroud)
其次,假设有一个-t标志,我想获取该值并将其存储在我可以在我的脚本中使用的变量中,例如:
FLAG="application"
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能够在任何一个方面取得的唯一进展是$ @抓取所有命令行参数,但我不知道这与标志有什么关系,或者这是否可能.
Gil*_*not 107
你应该阅读这个getopts教程.
-a需要参数的开关示例:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
像greybot说的那样(getopt!= getopts):
外部命令getopt(1)永远不会安全使用,除非你知道 它是GNU getopt,你以GNU特定的方式调用它,并确保GETOPT_COMPATIBLE不在环境中.改为使用getopts(shell builtin),或简单地循环遍历位置参数.
Veg*_*ger 25
用$#抢的参数的数目,如果它不等于2有没有提供了足够的论据:
if [ $# -ne 2 ]; then
usage;
fi
Run Code Online (Sandbox Code Playgroud)
接下来,检查是否$1等于-t,否则使用未知标志:
if [ "$1" != "-t" ]; then
usage;
fi
Run Code Online (Sandbox Code Playgroud)
最后存储$2在FLAG:
FLAG=$2
Run Code Online (Sandbox Code Playgroud)
注意:usage()是一些显示语法的函数.例如:
function usage {
cat << EOF
Usage: script.sh -t <application>
Performs some activity
EOF
exit 1
}
Run Code Online (Sandbox Code Playgroud)
这是一个通用的简单命令参数界面,您可以将其粘贴到所有脚本的顶部。
#!/bin/bash
declare -A flags
declare -A booleans
args=()
while [ "$1" ];
do
arg=$1
if [ "${1:0:1}" == "-" ]
then
shift
rev=$(echo "$arg" | rev)
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
then
bool=$(echo ${arg:1} | sed s/://g)
booleans[$bool]=true
echo \"$bool\" is boolean
else
value=$1
flags[${arg:1}]=$value
shift
echo \"$arg\" is flag with value \"$value\"
fi
else
args+=("$arg")
shift
echo \"$arg\" is an arg
fi
done
echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}
echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"
Run Code Online (Sandbox Code Playgroud)
通过运行命令:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
Run Code Online (Sandbox Code Playgroud)
输出将是这样的:
"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean
booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg
Boolean types:
Precedes Flag(pf): true
Final Arg(f): true
Colon Terminated(Ct): true
Not Mentioned(nm):
Flag: myFlag => my flag value
Args: one => firstArg, two => secondArg, three => thirdArg
Run Code Online (Sandbox Code Playgroud)
基本上,参数分为标志布尔值和通用参数。通过这种方式,用户可以将标记和布尔值放置在任何位置,只要他/她以指定的顺序保持通用参数(如果有)即可。
现在,让我和您再也不必处理bash参数解析了!
您可以在此处查看更新的脚本
在过去的一年中,这非常有用。现在,它可以通过在变量之前加上范围参数来模拟范围。
像这样调用脚本
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "$@"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
Run Code Online (Sandbox Code Playgroud)
看起来不像我实现了参数范围,不知道为什么我猜我还不需要它。
| 归档时间: |
|
| 查看次数: |
106347 次 |
| 最近记录: |