Как распечатать $ в аргументе

Не мог распечатать тот же аргумент 1$

    #!/bin/bash
    if [[ "$1" =~ ^((-{1,2})([Hh]$|[Hh][Ee][Ll][Pp])|)$ ]]; then
            display_help; exit 1
    else
            while [[ $# -gt 0 ]]; do
            opt="$1"
            shift;
            current_arg="$1"
            case "$opt" in
                    "run_command"   ) RUN_COMMAND="$1"; shift;;
                    "cmd1"          ) CMD1="$1"; shift;;
                    *                   ) echo "ERROR: Invalid option: \""$opt"\"" >&2
                          exit 1;;
            esac
            done
    fi

    if [[ "$RUN_COMMAND" == "Custom" ]];then
            export command1=`echo $CMD1`
            echo $command1
    else
            echo "Invalid arguments"
    fi

Результат производится

  ./test_non.sh run_command Custom cmd1 "date|awk '{print \\$1}'"
    date|awk '{print \}'
2
задан 15 November 2019 в 14:03

2 ответа

Необходимо ли использовать

./script run_command Custom cmd1 "date|awk '{print \\$1}'"

Почему? Я действительно не знаю причину того двойного \, но вероятно она должна выйти из специального символа $, И число аргумента также (одно \ для $ и 1)

Вот некоторые результаты:

  • хороший:

    damadam@Pc:~$ export command1=`echo "date|awk '{print \\$1}'"`
    damadam@Pc:~$ echo $command1
    date|awk '{print $1}'
    
  • тесты:

    damadam@Pc:~$ export command1=`echo "date|awk '{print \$\1}'"`
    damadam@Pc:~$ echo $command1
    date|awk '{print $\1}'
    
    damadam@Pc:~$ export command1=`echo "date|awk '{print $\1}'"`
    damadam@Pc:~$ echo $command1
    date|awk '{print $\1}'
    
  • тест OP:

    damadam@Pc:~$ export command1=`echo "date|awk '{print \$1}'"`
    damadam@Pc:~$ echo $command1
    date|awk '{print }'
    
<час>

Редактирование 1: с демонстрационным кодом сценария, данным OP (я назвал его test.sh для тестирования его лично), просто нуждайтесь в сингле \ для выхода $1 аргумент

damadam@Pc:~$ ./test.sh run_command Custom cmd1 "date|awk '{print \$1}'"
date|awk '{print $1}'
0
ответ дан 2 December 2019 в 02:38

В первую очередь, когда Вы выполняете это:

./script run_command Custom cmd1 "date|awk '{print $1}'"

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

$ set -x
$ ./script run_command Custom cmd1 "date|awk '{print $1}'"
+ ./script run_command Custom cmd1 'date|awk '\''{print $1}'\'''
date|awk '{print $1}'

строка, запускающаяся с + шоу Вы команда, на самом деле выполненная. Как Вы видите, эти $1 исчез, потому что $ указывает на переменную оболочки и, так как у Вас есть все в двойных кавычках, которое передается оболочке, которая пытается развернуть ее. С тех пор $1 не установлен, это ни до чего не расширяется. Сравните его с тем, что происходит, если Вы используете переменную, которая установлена:

$ foo="bar"
$ ./script run_command Custom cmd1 "date|awk '{print $foo}'"
+ ./script run_command Custom cmd1 'date|awk '\''{print bar}'\'''
date|awk '{print bar}'

, Как Вы видите, $foo в Вашей команде awk, расширен до [1 113] прежде передаваемый [1 114]. Так, необходимо выйти $1:

$ ./script run_command Custom cmd1 "date|awk '{print \$1}'"
+ ./script run_command Custom cmd1 'date|awk '\''{print $1}'\'''
date|awk '{print $1}'

я также не понимаю то, что это, как предполагается, делает:

if [[ "$RUN_COMMAND" == "Custom" ]];then
  export command1=`echo $CMD1`
  echo $command1
else

Вам не нужно export вообще, и Вы не должны повторять одну переменную для установки его как значения другого. Все, в чем Вы нуждаетесь, существует:

if [[ "$RUN_COMMAND" == "Custom" ]];then
  command1=$CMD1

На самом деле, Вам не нужно $CMD1 вообще. Просто набор $command1 с начала. Вот немного улучшенная версия Вашего сценария:

#!/bin/bash

## dummy function since you didn't include yours
display_help(){
  echo "help"
}

if [[ "$1" =~ ^((-{1,2})([Hh]$|[Hh][Ee][Ll][Pp])|)$ ]]; then
  display_help
  exit 1
else
  while [[ $# -gt 0 ]]; do
    opt="$1"
    shift;
    current_arg="$1"
    case "$opt" in
      "run_command")
        RUN_COMMAND="$1"
        shift
        ;;
      "cmd1")
        command1="$1"
        shift
        ;;
      *)
        echo "ERROR: Invalid option: '$opt'" >&2
        exit 1
        ;;
    esac
  done
fi

if [[ "$RUN_COMMAND" == "Custom" ]];then
  echo "$command1"
else
  echo "Invalid arguments"
fi
3
ответ дан 2 December 2019 в 02:38

Другие вопросы по тегам:

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