8

このスクリプトを機能させようとしています。これは、いくつかの変数を取り、それらをまとめて、結果を使用してAppleScriptコマンドを送信することを目的としたBashスクリプトです。後ろの変数からエコーされた文字列を端末に手動で貼り付けると、期待どおりに機能します。しかし、コマンドと文字列を結合しようとすると、うまくいきません。どうすればこれを機能させることができますか?to_osaosascript -eosascript -eto_osa

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\""
the_script='tell application "Safari" to set the URL of the front document to '
delimiter="'"
to_osa=${delimiter}${the_script}${the_url}${delimiter}
echo ${to_osa}
osascript -e ${to_osa}

スクリプトは、手動で作業するだけでなく、目的のコマンドをスクリプトに書き込んで実行するときにも機能します。

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh
sh  ~/Desktop/outputfile.sh
4

2 に答える 2

2

原則として、変数に二重引用符を入れずに、変数を二重引用符で囲みます。この場合、bash レベルの引用にはいくつかの二重引用符があり、AppleScript レベルの引用にはいくつかの二重引用符があるため、より複雑です。この場合、変数には AppleScript レベルの引用符が入り、変数には bash レベルの引用符が入ります。

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\""
the_script='tell application "Safari" to set the URL of the front document to '
osascript -e "${the_script}${the_url}"

ところで、echoこのようなものをチェックするために使用すると、非常に誤解を招く可能性があります。echoコマンドラインで変数を参照したときに実行されるものではなく、変数の内容を示しています。最大の違いは、 bash の解析 (引用符やエスケープの削除など) を行ったechoに引数を出力することですが、「文字列を手動で貼り付ける ... 動作します」と言うと、解析する前に必要なものだと言っていることになります。エコーされた文字列に引用符がある場合、それは bash がそれらを引用符として認識せず、削除したことを意味します。比較:

string='"quoted string"'
echo $string          # prints the string with double-quotes around it because bash doesnt't recognize them in a variable
echo "quoted string"  # prints *without* quotes because bash recognizes and removes them
于 2013-06-06T16:11:11.343 に答える