Osascript с использованием переменной bash с пробелом

Я использую osascript в Bash для отображения сообщения в Notification Center (Mac OS X) через Apple Script. Я пытаюсь передать текстовую переменную от Bash до Script. Для переменной без пробелов это работает отлично, но не для одного с пробелами:

Определение

var1="Hello"
var2="Hello World"

и используя

osascript -e 'display notification "'$var1'"'

работает, но используя

osascript -e 'display notification "'$var2'"'

дает

syntax error: Expected string but found end of script.

Что мне нужно изменить (я новичок в этом)? Спасибо!

Ответ 1

Вместо этого вы можете попробовать:

osascript -e "display notification \"$var2\""

Или же:

osascript -e 'display notification "'"$var2"'"'

Это устраняет проблему манипуляции переменными, содержащими пробелы в bash. Однако это решение не защищает от инъекций кода osascript. Поэтому было бы лучше выбрать один из решений Charles Duffy или использовать расширение параметра bash:

# if you prefer escape the doubles quotes
osascript -e "display notification \"${var2//\"/\\\"}\""
# or
osascript -e 'display notification "'"${var2//\"/\\\"}"'"'

# if you prefer to remove the doubles quotes
osascript -e "display notification \"${var2//\"/}\""
# or
osascript -e 'display notification "'"${var2//\"/}"'"'

Спасибо mklement0 за это очень полезное предложение!

Ответ 2

Эта версия полностью безопасна против инъекционных атак, в отличие от вариантов, пытающихся использовать конкатенацию строк.

osascript \
  -e "on run(argv)" \
  -e "return display notification item 1 of argv" \
  -e "end" \
  -- "$var2"

... или, если кто-то предпочитает передавать код на stdin, а не argv:

osascript -- - "$var2" <<'EOF'
  on run(argv)
    return display notification item 1 of argv
  end
EOF