2013-06-21 32 views
11

Tôi có tập lệnh shell mà tôi gọi sử dụng osascriptosascript gọi tập lệnh shell và chuyển vào biến mà tôi đã đặt trong tập lệnh shell gốc. Tôi không biết làm thế nào để vượt qua biến đó từ từ bản thảo đến kịch bản lệnh shell.Vượt qua biến từ kịch bản lệnh shell thành dạng chữ viết hoa

Làm cách nào để chuyển một biến từ kịch bản lệnh shell sang tập lệnh con trỏ tới tập lệnh shell ...?

Hãy cho tôi biết nếu tôi không hiểu.

i=0 
for line in $(system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p' | grep "Serial Number:" | awk -F ": " '{print $2}'); do 
UDID=${line} 
echo $UDID 
#i=$(($i+1)) 
sleep 1 


osascript -e 'tell application "Terminal" to activate' \ 
-e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \ 
-e 'tell application "Terminal" to do script "cd '$current_dir'" in selected tab of the front window' \ 
-e 'tell application "Terminal" to do script "./script.sh ip_address '${#UDID}' &" in selected tab of the front window' 

done 

Trả lời

13

Biến Shell không mở rộng bên trong dấu ngoặc đơn. Khi bạn muốn chuyển một biến trình bao tới osascript, bạn cần phải sử dụng dấu ngoặc kép "". Vấn đề là, hơn là bạn phải thoát khỏi dấu ngoặc kép cần thiết bên trong osascript, như:

kịch bản

say "Hello" using "Alex" 

bạn cần thoát khỏi dấu ngoặc kép

text="Hello" 
osascript -e "say \"$text\" using \"Alex\"" 

này không phải là rất có thể đọc được, do đó nó tốt hơn nhiều để sử dụng tính năng heredoc của bash, như

text="Hello world" 
osascript <<EOF 
say "$text" using "Alex" 
EOF 

Và bạn c một kịch bản ghi multiline bên cho miễn phí, nó là tốt hơn nhiều so với sử dụng nhiều -e args ...

+0

Đây là lời khuyên không tốt. Ngoài việc vụng về không cần thiết, nó không làm vệ sinh văn bản được chèn vào nên không mạnh mẽ và không an toàn, ví dụ: 'text = 'Bob nói" hello "'' sẽ gây AS để ném một lỗi cú pháp do dấu ngoặc kép không thoát. Không bao giờ sử dụng mã munging nếu một giải pháp tốt hơn tồn tại, mà nó làm: như Lauri Ranta nói, xác định một xử lý 'chạy' rõ ràng và vượt qua dây của bạn thông qua ARGV. Xem http://stackoverflow.com/questions/16966117/bash-combining-variables-to-form-a-command-sent-to-applescript-using-the-osascr/16977401#16977401 để biết thêm chi tiết. – foo

+1

@foo Bạn nói đúng, sử dụng 'khi chạy argv' là" đúng "hơn. Của tôi không phải là một giải pháp _perfect_, nhưng tôi sử dụng nó bản thân mình nhiều lần mà không có bất kỳ vấn đề, nó là đơn giản và có thể sử dụng cho nhiều kịch bản ... – jm666

+1

Yours là một giải pháp _buggy_. Nếu $ text chứa các ký tự dấu ngoặc kép hoặc dấu gạch chéo ngược, nó sẽ làm cho mã AS bị lỗi hoặc - tệ hơn - hành xử theo các cách không mong muốn. Nếu bạn phải sử dụng mã munging, bạn _must_ khử trùng các đầu vào của bạn. ví dụ. Google "tấn công SQL injection" để hiểu tại sao "nó làm việc cho tôi" là _not_ một phản ứng thích hợp khi ai đó chỉ ra lỗ hổng này. – foo

2

Bạn cũng có thể sử dụng một bộ xử lý chạy hoặc xuất:

osascript -e 'on run argv 
    item 1 of argv 
end run' aa 

osascript -e 'on run argv 
    item 1 of argv 
end run' -- -aa 

osascript - -aa <<'END' 2> /dev/null 
on run {a} 
    a 
end run 
END 

export v=1 
osascript -e 'system attribute "v"' 

Tôi không biết cách nào để lấy STDIN. on run {input, arguments} chỉ hoạt động trong Automator.

Các vấn đề liên quan