Как передать пустую строку с двойными кавычками в скрипт bash?
Я пытаюсь написать скрипт, который будет принимать в качестве дополнительных аргументов в командной строке пустую строку с двойными кавычками. Я хочу, чтобы скрипт передавал эти аргументы вместе с пустой строкой с двойными кавычками, если это предусмотрено, но вместо этого интерпретатор команд, похоже, интерпретирует такой аргумент как пустую строку и удаляет кавычки. Есть ли способ сделать это?
в качестве простого примера я бы в файле script.sh:
#!/bin/bash
/home/myapp
Если Я запустите в командной строке:
$ ./script.sh arg1 ""
скрипт просто выполняет "/home/myapp arg1"
, но не/игнорирует второй аргумент ("")
. Я хочу, чтобы он сохранил эту пустую строку и вместо этого выполнил:/home/myapp arg1 ""
7 ответов
вы можете определить, сколько позиционных параметров было передано вашему скрипту изучение $#
параметр. Например, если это 2 или больше, то вы знаете, что что-то было передано для , даже если
пусто (кавычки удаляются при вызове оболочки). Следующее реализует эту логику, и передает
""
в программу (в данном случае echo
), если параметр был передан, но пустой:
#!/bin/bash
if [ $# -ge 2 ]; then
if [ "" ]; then
arg2=""
else
arg2='""'
fi
echo " $arg2"
elif [ $# == 1 ]; then
echo ""
fi
выход:
$ ./args.sh a a $ ./args.sh a "" a "" $ ./args.sh a 1 a 1 $
вы правильно передаете пустой строковый аргумент скрипту.
это сценарий, который испортил его:
#!/bin/bash
/home/myapp
скрипт не защищает расширение и
от разбиения слов. Это означает, что если
и
содержат несколько слов, которые превращаются в отдельные аргументы, и если любой из них расширяется до Ничего, они просто исчезают.
это должно быть:
#!/bin/bash
/home/myapp "" ""
в общем, вы можете заставить свой скрипт передать все свои аргументы вызываемой программе, например:
/home/myapp "$@"
котировки просто синтаксис оболочки; они не являются частью самих данных аргумента. При вводе program ""
в оболочку на уровне операционной системы программа получает пустую строку языка C: указатель на нулевой байт. Нет никаких цитат.
вы можете передать аргумент ""
(двухсимвольная строка, состоящая из двух двойных кавычек), но это не пустая аргумент. Один из способов сделать это, например,'""'
: заверните его в одинарные кавычки.
единственная причина делать такие вещи, когда вы манипулируете синтаксисом оболочки на метауровне: передача частей сценария оболочки исходный код, например, маркеры с кавычками, пустые или другие. Оболочка имеет команду eval
, который берет исходный код в качестве аргумента (или нескольких аргументов) и оценивает его.
empty_shell_string_syntax='""' # this variable holds the characters ""
eval empty_var=$empty_shell_string_syntax # empty_var gets set to empty string
до eval
вызывается, командная строка подлежит расширению. Это расширение удаляет синтаксис $empty_shell_string_sytnax
и заменяет его содержание, символы ""
. Итак, eval получает строку empty_var=""
. Он оценивает это, и поэтому empty_var
установлено в пустую строку, как указано.
дополнить полезное объяснение Каза:
Если ты ... --12-->передать "$@"
через пустой аргументы тоже будут переданы:
#!/bin/bash
/home/myapp "$@"
, проходящей через "$@"
сохраняет исходные аргументы ровно как прошло - даже аргументы как пустые строки (прошло как, например, ''
или ""
или "$someVar"
, где переменная someVar
не установлен или содержит пустую строка.)
в случае, если может быть более 2 аргументов:
#!/bin/bash
# Copy the (up to) first 2 arguments - whether they're empty strings or not -
# to a separate array.
firstTwo=("${@:1:2}")
shift; shift # Remove the first 2 arguments from the arguments array.
# Invoke the app with the (up to) first 2 arguments stored in the new array.
/home/myapp "${firstTwo[@]}"
# Process the remaining arguments, if any.
for a; do
echo "remaining: [$a]"
done
вы должны избежать его, используя обратную косую черту
$ ./script.sh arg1 \"\"
смогите быть испытано например на отголоске:
$ echo \"\"
""
вы также можете поместить их в одну цитату, чтобы их буквального значения, например :
]$ echo '""'
""
например, в скрипт:
]# cat a.bash
#!/bin/bash
echo ab
]$ ./a.sh '""'
a""b
]$ ./a.sh ""
ab
попробуйте это:
cmd=yourcomand;
n=0; for a in "$@"; do n=$((n +1)); cmd="$cmd ${$n+\"$$n\"}"; done
eval $cmd