ShellScript + Xcode

时间:2011-03-29 08:25:09

标签: xcode shell

我正在使用Texture Packer和一个shell脚本在我的Xcode项目的每个“干净”或“构建”中生成精灵表。但是,我想以条件方式生成它们(编译标志或命令行)。

我不习惯使用shell脚本,我不知道如何从我的shell脚本中的项目设置或命令行获取标志。

是否可以使用其他变量$ {ACTION}? 如何使用项目标志或命令参数设置它们?

THX

1 个答案:

答案 0 :(得分:0)

人们通常会想到将标志作为程序的参数传递,即

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

这需要将参数作为选项进行管理,使用case语句或调用getopts和其他专用函数。在SO搜索getopts应该会为您提供所需的所有信息。

  

我在下面讨论的假设您可以修改脚本以放入$ {ACTION}变量,我将其称为标志变量。当你提到条件动作时,这就是我使用'true'或'false'来控制运行代码块的标志变量的原因。如果您了解这些概念,那么使用最少量的代码修改来修改代码以有条件地运行进程应该不难。如果您给我们一个特定的示例,'我需要我的代码来有条件地执行...',我和其他人可以轻松帮助您解决问题。


另一种方式,可能更适合您的需求,是设置脚本的环境,以便shellcript进程可以看到所需的任何变量。你可以用两种不同的方式做到这一点。

  1. 设置标准环境变量并在调用脚本之前将其导出,即

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

    (您的shell脚本可能不需要file1 - > file..n)

  2. OR'将标志变量传入shellcript作为脚本调用的一部分

    flag1=true flag2=false myShellScript file1 file2 file...n
    
  3. 要使这些方法中的任何一个有用,您需要使用标志变量,如

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

    :-是一个shell参数运算符,表示'如果flag1不存在或设置为“”,暂时使用此:-之后的值,在这种情况下是假的。

    使用上面的2个编号技术,flag1 的值为'true',因此临时替换不会发生。

    请注意,如果使用技术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。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,或者给它一个+(或 - )作为有用的答案