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

#linux #shell #sh #command-line-arguments

#linux #оболочка #sh #аргументы командной строки

Вопрос:

У меня есть следующий сценарий оболочки, в котором я просто хочу распечатать первый аргумент по мере его передачи

Код:

 #!/bin/bash

if [ "$1" == "" ]; then
    exit 1
fi

echo $1
  

Допустим, имя скрипта testarg.sh называется следующим образом — testarg.sh abc . Отлично!

Приведенный выше сценарий оболочки работает, если я передаю простые аргументы, такие как «abc» или «xyz123». И, вызывая его, как testarg.sh xyz123 выводит «xyz123». Все хорошо!

Проблема:
Но if точно выводит содержимое, если я передаю сложную строку со специальными символами. Допустим, я назвал это так, как показано ниже:

 ./testarg.sh $6$nB3/jwAqgRcS9LN7$8c5InVbk5SLFiwuz9Xm6EHHRuZHMI0ggMhmxJ7Pr7NuBZ0TXtProuZ6LpQ6ZrFySly12cbGmWHsFpukEKAzdW.
  

Вопрос:
В приведенном выше вызове я хочу передать $6$nB3/jwAqgRcS9LN7$8c5InVbk5SLFiwuz9Xm6EHHRuZHMI0ggMhmxJ7Pr7NuBZ0TXtProuZ6LpQ6ZrFySly12cbGmWHsFpukEKAzdW. в качестве аргумента и распечатать его точно таким, какой он есть, включая косую черту и точки. Нужно ли применять специальные приемы?

Я не хочу, чтобы пользователь моего скрипта утруждал себя вставкой специальных escape-символов для косых черт. Есть ли способ, которым я могу хорошо обработать это в своем скрипте и получить значение $1 as, чтобы точно его распечатать?

Ответ №1:

Вам нужно вызвать скрипт с одинарными кавычками вокруг аргумента. Невозможно заставить это работать, изменив код сценария.

 ./testarg.sh '$6$nB3/jwAqgRcS9LN7$8c5InVbk5SLFiwuz9Xm6EHHRuZHMI0ggMhmxJ7Pr7NuBZ0TXtProuZ6LpQ6ZrFySly12cbGmWHsFpukEKAzdW.'