Проверить обязательный аргумент параметров

Я просто забыл mount boot (спасибо, jasonwryan ).

Решение этой проблемы в моем случае было:

  1. Используйте livecd для монтирования всех разделов и используйте chroot.
  2. Обновление:

    пакман -Сью

  3. Регенерация initramfs с помощью:

    mkinitcpio -p linux

  4. Если вы используете grub:

    grub -mkconfig -или /mnt/boot/grub/grub.cfg

  5. Перезапустить.

0
01.08.2019, 17:45
2 ответа

Это происходит потому, что shiftвыполняет сдвиг $2в $1независимо от того, какой текст у вас есть для падежей. Точная цель вашего сценария неясна, но, например, если вы хотите избежать этого, вы можете сделать что-то вроде:

while [[ "$1" != "" && "$2" != -* ]]; do
    case $1 in
        -f | --first )          shift
                                first=$1
                                ;;
        -s | --second )         shift
                                second=$1
                                ;;
        * )                     break
    esac
    shift
done

echo "first: "$first" second: "$second

Это позволит избежать манипуляций, если аргумент отсутствует.

Пример вывода:

$./script.sh --first a --second b
first: a second: b
$./script.sh --first --second b
first:  second: 
0
28.01.2020, 02:39

Используйте оболочку, созданную -в getopts. При этом используется строка опций, в которой вы можете перечислить все допустимые символы опций И ​​независимо от того, требуют ли они аргумента или нет (, указав после символа опции:). Например:

while getopts 'f:s:' opt; do
  case "$opt" in 
    f) first="$OPTARG" ;;
    s) second="$OPTARG" ;;

    :) usage 1 "-$OPTARG requires an argument" ;;
    ?) usage 1 "Unknown option '$opt'" ;;
  esac
done

shift $((OPTIND -1))

Обратите внимание, что встроенный -в getoptsне поддерживает длинные опции --. Если это требование, используйте программу getoptиз пакета util-linux-. НЕ используйте никакую другую версию, все остальные имеют серьезные недостатки.

TEMP=$(getopt -o 'f:s:' --long 'first:,second:' -n "$0" -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$TEMP"

while true ; do
  case "$1" in
    -f|--first)    first="$2" ; shift 2 ;;
    -s|--second)   second="$2" ; shift 2 ;;
    --)            shift ; break ;; 
     *)            echo 'Internal error!' ; exit 1 ;;
  esac
done

ПРИМЕЧАНИЯ:

  • getoptss)встроен -в оболочки POSIX, является переносимым и стандартным.
  • getopt(безs)не является стандартом -, с несколькими конфликтующими версиями, большинство из которых имеют серьезные недостатки. Версия из пакета util-linuxбезопасна в использовании, если вас не волнует переносимость.
  • Оба они выдают ошибку, если опция, требующая аргумента, не указана.
3
28.01.2020, 02:39

Теги

Похожие вопросы