Linux 分离;旗帜;从「;“论点”;在bash脚本中
我正在使用一个遗留的shell脚本,该脚本用于测试二进制文件中的某些功能(即调用Linux 分离;旗帜;从「;“论点”;在bash脚本中,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,我正在使用一个遗留的shell脚本,该脚本用于测试二进制文件中的某些功能(即调用nm,objdump,ldd,等等;并对结果进行一些解析)。shell脚本目前非常“敏感”,而且很大,所以我希望尽量减少对它所做的更改 它当前首先检查参数的数量,每个参数都是一条路径,即: if [ "$#" -lt 3 ] then echo "Error. Invalid number of arguments." exit fi 我想添加一些附加参数及其长格式等价物,以禁用脚本内部的某些功能,而不会使
nm
,objdump
,ldd
,等等;并对结果进行一些解析)。shell脚本目前非常“敏感”,而且很大,所以我希望尽量减少对它所做的更改
它当前首先检查参数的数量,每个参数都是一条路径,即:
if [ "$#" -lt 3 ]
then
echo "Error. Invalid number of arguments."
exit
fi
我想添加一些附加参数及其长格式等价物,以禁用脚本内部的某些功能,而不会使上述测试无效,即:
-h | --help: Print shell usage and expected arguments.
-x | --xfer: Do some extra copy logic.
-d | --dry: Do a dry-run, and don't actually change any files.
但是,我不希望将标志(即以连字符开头的参数)计为参数(即,不影响将参数分配给$1
、$2
和$3
)。例如,以下是当前对我的脚本的有效调用:
bash ./test.sh ./ ./out ./logs
我希望以下可能的调用也能起作用:
bash ./test.sh ./ ./out ./logs --dry
bash ./test.sh --xfer ./ ./out ./logs
bash ./test.sh --help
bash ./test.sh ./ --xfer ./out --dry ./logs
如何设置脚本以“过滤”以连字符开头的参数(一个或两个),并保持对
$1
、$2
和$3
)的相同分配?您可以在事后修改参数列表:
set -- one two three
因此,您可以将自己的解析放在顶部,并使用set--
将您想要的任何参数放在它们想要的位置
以过滤为例:
#!/usr/bin/env bash
# ^^^^- not /bin/sh, as arrays are bash-only
help_and_exit() {
local retval=${1:-1}
cat <<EOF
${0##*/} [-d|--dry-run] [-x|--xfer] input output whatever
...put your extended help here...
EOF
exit "$retval"
}
args=( )
dry_run=0; xfer=0
while (( $# )); do
case $1 in
-d|--dry) dry_run=1 ;;
-x|--xfer) xfer=1 ;;
-h|--help) help_and_exit 0 ;;
-*) printf 'Unknown option: %q\n\n' "$1"
help_and_exit 1 ;;
*) args+=( "$1" ) ;;
esac
shift
done
set -- "${args[@]}"
#/usr/bin/env bash
#^^^^-不是/bin/sh,因为数组只是bash
帮助_和_退出(){
本地retval=${1:-1}
cat BTW,如果非侵入性是您的第一个目标,我将通过环境而不是在命令行上接受这些选项。@CharlesDuffy的观点很好。还有一个问题:我将如何修改此选项,以便某些标志可以有一个参数,而我不希望该optarg
被解释为脚本的参数self?即-d
需要一个单独的参数。谢谢。-d)dry_-run=$2;shift;
--请参见。您也可以使用它们自己的大小写
块处理-dry=*
和-d*
(设置dry_-run=${1}-d}
,分别对这些块进行排序,以便在字符串为空时调用-d
-one以支持-d*
)。