【问题标题】:Csh adding strings to an array, whitespace troublescsh将字符串添加到数组中,空格问题
【发布时间】:2012-10-20 10:05:57
【问题描述】:

我在用 csh 做一些基本的事情时遇到了麻烦。我有一个字符串:

set newCmd = "$expansionCmd –option1 –option2 …"

我正在创建一个由这些字符串组成的数组,稍后我想执行它:

set expansionCmdList = ($expansionCmdList[*] "$newCmd")   
#I also tried without quotes, e.g. just $newCmd

最后我尝试迭代并执行这些命令:

foreach exCmd ($expansionCmdList) 
    `exCmd`    #execute it in the shell
end 

但问题是数组条目不是完整的字符串,而是字符串的每一部分都用空格分隔,即第一个条目只是“$expansionCmd”,下一个条目是“--option1”等。

提前为使用c shell道歉,我公司的代码库卡住了。

【问题讨论】:

    标签: arrays string shell scripting csh


    【解决方案1】:

    每当您扩展整个数组并希望保持其各个元素的身份不变时,您需要在扩展时使用:q(用于“引用”)修饰符。否则,一旦您执行set expansionCmdList=($expansionCmdList[*] "$newCmd") 之类的操作,列表中的所有先前命令都会拆分为它们的组成词,每个词现在都是它自己的数组元素。简单演示:

    % set a = ( a "b c" d )
    % echo $a[2]
    b c
    % set a = ( $a[*] e )
    % echo $a[2]
    b
    

    糟糕,您甚至在进入执行循环之前就弄乱了数组。使用:q,事情会变得更好:

    % set a = ( a "b c" d )
    % set a = ( $a:q e )
    % echo $a[2]
    b c
    

    你需要在for循环中使用相同的修饰符:

    foreach exCmd ($expansionCmdList:q) 
    

    最后,`exCmd` 尝试运行一个字面上名为“exCmd”的命令,然后获取其输出并将 that 作为命令运行。您可能想要做的只是执行一个等于变量值的命令。您可能会在这里遇到更多空白问题,并且您无法通过将每个命令设为数组来解决它们,因为 csh 不支持数组数组。公平警告。但是如果命令没有任何引用需求,这将起作用:

      $exCmd
    

    【讨论】:

    • 谢谢哥们...我发誓我能在 c shell 上找到的唯一文档就是人们说不要使用 c shell。
    • 嗯,不使用 csh 进行脚本编写的唯一重要原因是 csh 不是一种很好的脚本语言……因为您必须将别名扭成结拥有任何类型的子程序能力。但如果这就是你所拥有的,那就是你所拥有的。它确实早在 POSIX shell 之前就有了数组和内置算术。 :)
    • 请注意,使用${array}:q 将不起作用——它必须是$arr:q
    • @SeanAllred 当然。 ${array}:q 专门使用花括号来阻止修饰符的应用,并在结果中获得文字 :q。如果你想使用 curlies 并且仍然应用修饰符,它是 ${array:q}
    【解决方案2】:

    Mark 的解决方案对于大多数应用程序来说显然更胜一筹,但还有另一种选择。不直接使用foreach,而是获取数组的大小,遍历序列:

    set BUILD_MATRIX = ( "makefile.make:make --jobs --makefile=makefile.make" \
                         "Makefile:make --jobs --makefile=Makefile" \
                         "build.xml:ant" )
    
    foreach i ( `seq ${#BUILD_MATRIX}` )
      echo $i
      echo $BUILD_MATRIX[$i]
    end
    

    (复制自Accessing array elements with spaces in TCSH

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2023-02-04
      • 2021-04-13
      • 2021-03-10
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多