Не мог распечатать тот же аргумент 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 \}'
Необходимо ли использовать
./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}'
В первую очередь, когда Вы выполняете это:
./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