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