Передача параметров, передаваемых по имени к сценариям оболочки

Ваш fstab звучит поврежденным, просто измените /etc/fstab, и измените строку, которая монтирует Ваш корень к новому, вероятно, UUID=XXX,

Для нахождения всего uuids работать blkid как корень.

Если Ваш grub.cfg устарел, использовать grub-mkconfig -o /boot/grub/grub.cfg повторно создавать grub.cfg

Править

Обратите внимание, что, когда личинка сканирует для корневого устройства, она берет текущий смонтированный в качестве корня. Необходимо будет изменить grub.cfg вручную и загрузиться от SSD, впоследствии, работать grub-mkconfig снова

119
07.11.2017, 13:11
9 ответов

Если вы не возражаете, ограничиваясь однобуквенными именами аргументов, например my_script -p '/ some / path' -a5 , то в bash вы можете использовать встроенные getopts , например

#!/bin/bash

while getopts ":a:p:" opt; do
  case $opt in
    a) arg_1="$OPTARG"
    ;;
    p) p_out="$OPTARG"
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    ;;
  esac
done

printf "Argument p_out is %s\n" "$p_out"
printf "Argument arg_1 is %s\n" "$arg_1"

Затем вы можете выполнить

$ ./my_script -p '/some/path' -a5
Argument p_out is /some/path
Argument arg_1 is 5

Существует полезное Небольшое руководство по getopts , или вы можете ввести help getopts в командной строке оболочки.

155
27.01.2020, 19:29
[1168366] С помощью [1168679]zsh[1168680] вы бы использовали [1168681]zparseopts[1168682]:

Но вы бы вызвали скрипт с помощью [1168683]myscript --p_out foo[1168684].

Обратите внимание, что [1168685]zparseopts[1168686] не поддерживает опции сокращения long или синтаксис [1168687]--p_out=foo[1168688] вроде GNU [1168689]getopt(3)[1168690] поддерживает.[1168371].
15
27.01.2020, 19:29

Вероятно, наиболее близкий к этому синтаксис:

p_out='/some/path' arg_1='5' my_script
35
27.01.2020, 19:29
mitsos@redhat24$ my_script "a=1;b=mitsos;c=karamitsos"
#!/bin/sh
eval "$1"

Вы только что вводили параметры командной строки внутри сценария !!

-3
27.01.2020, 19:29

/etc/rc.d/rc.local

Посмотрите на файл rc.local в вашей системе, независимо от того, что там установлено, будет выполняться при каждой загрузке системы. Можно также установить cron-задание, основываясь на предварительной информации о том, когда система перезагрузится, что может привести к удалению команды из rc.local после завершения загрузки компьютера.

Вы также можете поместить все, что хотите, в скрипт init в каталоге/etc/init.d или соответствующем каталоге/etc/rc.d.

-121--150480-

Для моделирования входа в систему (без прохождения «sudo -i») необходимо использовать команду «su».

Проверка справочной страницы для параметра «» - «»:

-, -l, --login
          Starts the shell as login shell with an environment similar to a real login:

             o      clears all environment variables except for TERM

             o      initializes the environment variables HOME, SHELL, USER, LOGNAME, PATH

             o      changes to the target user's home directory

             o      sets argv[0] of the shell to '-' in order to make the shell a login shell

Кроме того, здесь необходимо использовать doc .

Например, можно проверить этот идентификатор пользователя в журнале печати с помощью команды 'id':

#\bin\bash

id

su - user <<EOF
userPassword
id
#here you can execute your script

EOF

id

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

-121--150767-

Я украл это у drupal.org , но вы можете сделать что-то подобное:

while [ $# -gt 0 ]; do
  case "$1" in
    --p_out=*)
      p_out="${1#*=}"
      ;;
    --arg_1=*)
      arg_1="${1#*=}"
      ;;
    *)
      printf "***************************\n"
      printf "* Error: Invalid argument.*\n"
      printf "***************************\n"
      exit 1
  esac
  shift
done

Единственное замечание - вы должны использовать синтаксис мой _ скрипт --p_out=/some/path --arg_1=5.

38
27.01.2020, 19:29

Если функция или приложение имеет более нуля аргументов, у них всегда есть последний аргумент.

Если вы хотите прочитать пары флагов и значений, например: $ ./t.sh -o output -i input -l last

И вы хотите принять переменную количество пар параметр / значение,

И не нужно огромное дерево «если .. то .. еще .. фи»,

Затем, после проверки количества аргументов, отличного от нуля и даже,

Напишите цикл while с этими четырьмя операторами eval в качестве тела, за которым следует оператор case, используя два значения, определенные при каждом проходе цикла.

Здесь показана сложная часть сценария:

#!/bin/sh    

# For each pair - this chunk is hard coded for the last pair.
eval TMP="'$'$#"
eval "PICK=$TMP"
eval TMP="'$'$(($#-1))"
eval "OPT=$TMP"

# process as required - usually a case statement on $OPT
echo "$OPT \n $PICK"

# Then decrement the indices (as in third eval statement) 

:<< EoF_test
$ ./t.sh -o output -i input -l last
-l 
last
$ ./t.sh -o output -l last
-l 
last
$ ./t.sh  -l last
-l 
last
EoF_test
-2
27.01.2020, 19:29

Я использую этот скрипт и он работает как шарм:

for ARGUMENT in "$@"
do

    KEY=$(echo $ARGUMENT | cut -f1 -d=)
    VALUE=$(echo $ARGUMENT | cut -f2 -d=)   

    case "$KEY" in
            STEPS)              STEPS=${VALUE} ;;
            REPOSITORY_NAME)    REPOSITORY_NAME=${VALUE} ;;     
            *)   
    esac    


done

echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"

Использование

bash my_scripts.sh  STEPS="ABC" REPOSITORY_NAME="stackexchange"

Результат консоли:

STEPS = ABC
REPOSITORY_NAME = stackexchange

STEPS и REPOSITORY_NAME готовы к использованию в скрипте.

Не имеет значения, в каком порядке расположены аргументы.

32
27.01.2020, 19:29

Я только что придумал этот скрипт

while [ $# -gt 0 ]; do

   if [[ $1 == *"--"* ]]; then
        v="${1/--/}"
        declare $v="$2"
   fi

  shift
done

передайте его как my_script --p_out /some/path --arg_1 5, а затем в скрипте вы можете использовать $arg_1и $p_out.

15
27.01.2020, 19:29

Я только что сделал это. Он не требует "=" и поддерживает параметры, не имеющие значения -. Помните о необходимости дополнительных команд shiftдля значений параметров.

#!/bin/bash

if [ $# -eq 0 ]; then
    printf "Utilizacao:\n"
    printf "$0 [[--imagem_inicial|-i] <tag_inicial>] [[--imagem_final|-f] <tag_final>] [--verbose|-v]\n"
    exit 1
fi

while [ $# -gt 0 ]; do
  case "$1" in
    --imagem_inicial|-i)
      export tag_imagem_inicial="${2}"
      shift
      ;;
    --imagem_final|-f)
      export tag_imagem_final="${2}"
      shift
      ;;
    --verbose|-v)
      export verbose_option=1
      ;;
    *)
      printf "ERRO: Parametros invalidos\n"
      printf "Execute sem parametros para a sintaxe.\n"
      exit 1
  esac
  shift
done

echo tag_imagem_inicial=${tag_imagem_inicial}
echo tag_imagem_final=${tag_imagem_final}
0
28.05.2021, 05:13

Теги

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