Bash输出为Applescript列表问题

And*_*yer 1 macos bash applescript sed list

这只是让我疯了.我试图用bash读取文件,删除重复项,排序,然后通过applescript显示"列表选择"窗口.

我的$ DATALOG文件的格式如下:

field1 field2

field1 field3

field1 field4

等等...

AppleScript的=awk '{print $2}' $DATALOG | awk ' !x[$0]++' | sort -u | tr "_" " "| sed 's/^/\"/' | sed 's/$/\"/' | tr "\n" "," | sed 's/.$//'

现在,这条线路很棒.在$ Applescript中,我得到这样的输出:

"场2","场3","场4"

这正是我想要的.

现在,我接受输出,并在引号和applescript部分之前添加反斜杠.

Applescript=`echo "tell application \"System Events\" to return (choose from list {$Applescript})"| sed 's/\"/\\\"/g'`
Run Code Online (Sandbox Code Playgroud)

这让我得到了我想要的东西:

告诉应用程序\"系统事件\"返回(从列表{\"字段2 \",\"字段3 \",\"字段4 \"}中选择)

现在,我尝试osascript命令:

osascript -e $ Applescript

我收到一个错误:

4:4:语法错误:预期的表达式但发现脚本结束.(-2741)


所以,我添加引号:

osascript -e"$ Applescript"

我收到一个错误:

17:18:语法错误:预期的表达式,属性或密钥形式等,但发现未知令牌.(-2741)

我不知道这里到底发生了什么,所以我决定复制$ Airport的回声并尝试将其作为一个变量.

机场=tell application \"System Events\" to return (choose from list {\"field 2\",\"field 3\",\"field 4\"})

并且无需任何修改即可使用.

所以....

我需要弄清楚如何在不必永久设置变量的情况下执行此操作.

Ned*_*ily 5

不要试图让它比需要的更复杂.利用shell的两个字符串引号字符组成一个shell字作为osascript -e参数的值:

Applescript=$(awk '{print $2}' $DATALOG | awk ' !x[$0]++' | sort -u | tr "_" " "| sed 's/^/\"/' | sed 's/$/\"/' | tr "\n" "," | sed 's/.$//')
osascript -e 'tell application "System Events" to return (choose from list {'"$Applescript"'})'
Run Code Online (Sandbox Code Playgroud)

此外,避免使用反引号进行命令替换是个好主意; 该$(command)是首选形式,因为它是非常容易,即使复杂的嵌套打交道时树立正确的命令.