Как передать пустую строку с двойными кавычками в скрипт 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