Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 分离;旗帜;从「;“论点”;在bash脚本中_Linux_Bash_Shell_Scripting - Fatal编程技术网

Linux 分离;旗帜;从「;“论点”;在bash脚本中

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 我想添加一些附加参数及其长格式等价物,以禁用脚本内部的某些功能,而不会使

我正在使用一个遗留的shell脚本,该脚本用于测试二进制文件中的某些功能(即调用
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*
)。