2011-03-29 54 views
0

我使用Texture Packer和一個shell腳本在我的Xcode項目的每個「清理」或「構建」中生成精靈表。但是,我想以條件方式生成它們(編譯標誌或命令行)。ShellScript + Xcode

我不是用來使用shell腳本,我不知道如何從我的shell腳本中的項目設置或命令行中獲取標誌。

其他變量$ {ACTION}是否可用? 如何使用項目標誌或命令參數設置它們?

THX

+0

我合併了你的未註冊帳戶,你現在應該能夠選擇你喜歡的答案是正確的。 – 2011-03-31 10:22:05

回答

0

人們通常認爲傳遞標誌作爲參數傳遞給一個程序,即

myShellScript -o (options) flag1 flag2 file1 file2 file...n 

這需要的參數作爲選項的管理,無論是與一個case語句或致電getopts等專業功能。在SO搜索getopts應該會給你所需的所有信息。

我在下面討論的是假設你可以修改你的腳本來放入$ {ACTION}變量,我把它稱爲標誌變量。當您提到條件操作時,這就是我使用'true'或'false'來控制運行代碼塊的標誌變量的原因。如果您理解了這些概念,那麼修改代碼以有條件地運行流程並不難,並且代碼修改量最少。如果你給我們一個特定的的例子,'我需要我的代碼來有條件做',我和其他人可以很容易地幫助你解決你的問題。


所以另一種方式,可能更適合你的需要,是建立你的腳本環境,因此所需要的任何變量的shell腳本過程可視化。你可以用兩種不同的方式來做到這一點。

  1. 標準設置環境變量和之前導出它們你打電話給你的腳本,即

    flag1=true ; flag2=false ; export flag1 flag2 
    myShellScript file1 file2 file...n 
    

    (文件1 - > file..n可能不需要你的shell腳本)

  2. 或作爲腳本調用的一部分,將標誌變量傳入您的shell腳本

    flag1=true flag2=false myShellScript file1 file2 file...n 
    

爲了使這些方法之一是有用的,你需要使用該標誌的變量,比如

if ! ${flag1:-false} ; then 
    print "Skipping flag one code" 
else 
    print "Inside flag one code, doing stuff" 
fi 

:-是一個shell參數運營商,說「如果有標誌1不存在或設置爲「」,暫時使用此值:-之後的值,在這種情況下爲false。

隨着我們的2個技術上面,FLAG1 確實有一個值,「真」,所以臨時 substituion不會發生。

請注意,如果您使用技巧1,則將flag1設置爲具有值(true),並且將其關閉的唯一方法是將其設置爲不同的值。符號將永遠不會生效。您必須從命令行中取消設置flag1才能看到:-表示法再次運行。當您使用命令行測試代碼時,這可能會讓您感到困惑,因此請務必始終取消設置您希望使用任何參數修飾符(還有其他參數)處理的變量。

如果你不習慣使用解析爲if true then ; print "true" ; fi的語句,這裏有一點需要解釋。

shell的評估順序查找變量,即$ {flag1}並替換它爲這些變量找到的任何值。因此使用if ${flag1:-false} ; then ...發現var,它沒有值,所以然後false被替換。值false解析爲命令/bin/false,以便執行命令。它的唯一目的是返回一個非零的退出代碼。

你可以通過使用命令行,'打開調試',與set -vx並玩耍,看看很多。這是一個快速示例。

**# Shell built-ins** 
/home/Shellter :>which true 
true 
/home/Shellter :>which false 
false 

# which point to 
/home/Shellter :>srchpath true 
-rwxrwxr-x 1 Shellter  None   17 Jan 13 2009 /usr/bin/true 
/home/Shellter :>srchpath false 
-rwxrwxr-x 1 Shellter  None   17 Jan 13 2009 /usr/bin/false 

#turn on debugging mode 
/home/Shellter :>set -vx 

# test true and false at the most basic level 
# then what is the exit code? 
/home/Shellter :>true 
true 
[1]+ true 
/home/Shellter :>echo $? 
echo $? 
[1]+ echo 0 
0 

/home/Neil_2 :>false 
false 
[1]+ false 
/home/Neil_2 :>echo $? 
echo $? 
[1]+ echo 1 
1 

/home/Shellter :>unset myFlag 
unset myFlag 
[1]+ unset myFlag 
/home/Shellter :>if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi 
if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi 
[1]+ false 
[1]+ print 'found false value' 
found false value 

# set myFlag 
/home/Shellter :>myFlag=true 
myFlag=true 
[1]+ myFlag=true 
/home/Shellter :>if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi 
if ${myFlag:-false} ; then print "found true value" ; else print "found false value" ; fi 
[1]+ true 
[1]+ print 'found true value' 
found true value 

我希望這會有所幫助。

P.S.因爲你似乎是一個新用戶,如果你得到一個可以幫助你的答案,請記住將它標記爲已接受,或者給它一個+(或 - )作爲有用的答案