web-dev-qa-db-ja.com

スペース付きのbash変数を使用したosascript

Bashでosascriptを使用して、Appleスクリプトを介して通知センター(Mac OS X)にメッセージを表示しています。Bashからスクリプトにテキスト変数を渡そうとしています。スペースのない変数の場合、これは問題なく機能しますが、スペースのある変数では機能しません。

定義

var1="Hello"
var2="Hello World"

と使用

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

動作しますが、

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

収量

syntax error: Expected string but found end of script.

何を変更する必要がありますか(私はこれに不慣れです)?ありがとう!

13
Bernd

代わりに使用してみてください:

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に感謝します!

22
Idriss Neumann

このバージョンは、文字列の連結を使用しようとするバリアントとは異なり、インジェクション攻撃に対して完全に安全です。

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

...または、argvではなくstdinでコードを渡すことを好む場合:

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