как добавить пользовательский мета-блок на вкладку редактора WYSIWYG

В ответе нет ответа расширенный getopt . И [0] голосовой ответ вводит в заблуждение: он игнорирует короткие опции стиля -⁠vfd (запрошенные OP), параметры после позиционных аргументов (также запрашиваемые OP) и игнорируют ошибки синтаксического анализа. Вместо этого:

  • Используйте расширенный getopt из util-linux или ранее GNU glibc.1
  • Он работает с getopt_long() функцией C GNU glibc.
  • Имеет все полезные отличительные черты (другие не имеют их): обрабатывает пробелы, цитирует символы и даже двоичные в аргументах2, он может обрабатывать опции в конце: script.sh -o outFile file1 file2 -v позволяет = -style long options: script.sh --outfile=fileOut --infile fileIn
  • Уже такой старый3, что никакой системы GNU этого не хватает (например, любой Linux имеет это).
  • Вы можете проверить свое существование с помощью: getopt --test → вернуть значение 4.
  • Другие getopt или shell-builtin getopts имеют ограниченное использование.

Следующие вызовы

myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile
myscript -v -f -d -o/fizz/someOtherFile -- ./foo/bar/someFile
myscript --verbose --force --debug ./foo/bar/someFile -o/fizz/someOtherFile
myscript --output=/fizz/someOtherFile ./foo/bar/someFile -vfd
myscript ./foo/bar/someFile -df -v --output /fizz/someOtherFile

все возвращают

verbose: y, force: y, debug: y, in: ./foo/bar/someFile, out: /fizz/someOtherFile

со следующим myscript

#!/bin/bash
# saner programming env: these switches turn some bugs into errors
set -o errexit -o pipefail -o noclobber -o nounset

! getopt --test > /dev/null 
if [[ ${PIPESTATUS[0]} -ne 4 ]]; then
    echo "I’m sorry, `getopt --test` failed in this environment."
    exit 1
fi

OPTIONS=dfo:v
LONGOPTS=debug,force,output:,verbose

# -use ! and PIPESTATUS to get exit code with errexit set
# -temporarily store output to be able to check for errors
# -activate quoting/enhanced mode (e.g. by writing out “--options”)
# -pass arguments only via   -- "$@"   to separate them correctly
! PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@")
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
    # e.g. return value is 1
    #  then getopt has complained about wrong arguments to stdout
    exit 2
fi
# read getopt’s output this way to handle the quoting right:
eval set -- "$PARSED"

d=n f=n v=n outFile=-
# now enjoy the options in order and nicely split until we see --
while true; do
    case "$1" in
        -d|--debug)
            d=y
            shift
            ;;
        -f|--force)
            f=y
            shift
            ;;
        -v|--verbose)
            v=y
            shift
            ;;
        -o|--output)
            outFile="$2"
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Programming error"
            exit 3
            ;;
    esac
done

# handle non-option arguments
if [[ $# -ne 1 ]]; then
    echo "$0: A single input file is required."
    exit 4
fi

echo "verbose: $v, force: $f, debug: $d, in: $1, out: $outFile"

1 расширенный getopt доступен на большинстве «bash-систем», включая Cygwin; на OS X попробуйте brew install gnu-getopt или sudo port install getopt 2 соглашения POSIX exec() не имеют надежного способа передать двоичный NULL в аргументы командной строки; эти байты преждевременно заканчивают первую версию аргумента 3, выпущенную в 1997 году или ранее (я только отследил ее до 1997 года)

1
задан johndoe 26 March 2019 в 19:27
поделиться