Разбор аргументов скрипта после getopts

Прочтите документацию по execl (3)и execve (2 )(, которые вызываютсяexecl). Они могут потерпеть неудачу (, и это единственный способ вернуться; в случае успеха эти функции не возвращаются, так как они изменяют все виртуальное адресное пространство своего процесса ).

Итак, код (с использованием perror (3)):

 execl("/home/amir/Desktop/OSAssignment/script.sh","script.sh",NULL);
 perror("execl script.sh");

У вас должен быть исполняемый скрипт, и вы должны запустить его с шебангом . Его первая строка должна быть#!/bin/sh

Пожалуйста, внимательно прочитайте документацию по каждой используемой вами функции.

1
31.10.2019, 15:52
2 ответа

Я могу винить только себя за плохое общение, но Кусалананда дал ответ, который я искал, в комментарии.

После использования getoptsдля разбора переключателей

while getopts "p" opt; do
  case $opt in
    p) p_post_deploy=true ;;
  esac
done

эта строка

shift "$((OPTIND - 1))"

удалит все переключатели из списка аргументов, так что вы снова сможете использовать позиционные аргументы, как если бы они были без переключателей.

Оболочка не сбрасывается OPTINDавтоматически. Вы должны сбросить его вручную.

0
27.01.2020, 23:58

Ваше применение тестовой конструкции

if [[ "$*" -eq 0 ]]

неверно. -eqиспользуется для целочисленных сравнений, и, учитывая, что $*относится к списку аргументов всех оставшихся аргументов, а не к их количеству, ваша тестовая конструкция обязательно выдаст синтаксическую ошибку, если список оставшихся В этот момент аргументы содержат только один элемент, который также должен представлять целое число (, а это не то, чего вы хотите достичь ).

Теперь, для реальной задачи, я думаю, что трудно смешивать «не -параметры опции» (, которым не предшествует «объявление»-<some letter>)с параметрами опции как до тех пор, пока вы разрешаете произвольный порядок (, то есть пока вы не указываете, что имя файла должно быть последним ). Если вы хотите использовать getopts, вы можете просто сделать имя файла дополнительным параметром, потребовав, чтобы оно было указано как -f <filename>. Затем вы можете использовать

while getopts "pf:" opt; do
  case $opt in
    p)
       p_post_deploy=true
    ;;
    f)
       backportfile=$OPTARG
    ;;
  esac
done

и getoptsавтоматически жаловаться, если имя файла не указано.

./test.sh: option requires an argument -- f

Позже вы сможете проверить, существует ли файл, как

if [[ ! -f "$backportfile" ]]
then
  echo "$backportfile is not a valid file"
  exit 1
fi
0
27.01.2020, 23:58

Теги

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