TCSH-用于检查值是否在数组/列表中的最紧凑的语法?

时间:2019-04-15 09:10:17

标签: tcsh

我试图找出是否存在一种更紧凑的方式来编写以下格式的tcsh代码,理想情况下仍在tcsh中。我花了一段时间搜索使用不同的关键字,但找不到任何有用的东西。

基本上,代码片段只是循环通过一个数字序列,然后,如果该循环的值在一组数字内,则分配一个变量。为简单起见,我将要比较的数字列表$ VAR相对较短,并且比较出现的次数很少,但是实际的问题是大小都是两个方面的两倍。

foreach VAR (`seq 1 24`)
    if ($VAR == 1 || $VAR == 2 || $VAR == 3 || $VAR == 4) then 
        set cat = small
    else if ($VAR == 5 || $VAR == 6 || $VAR == 7 || $VAR == 8) then
        set cat = medium
    else
        set cat = large
    endif
end

我想我在考虑更多关于python的思路,您可以只说“ if x in [...]”等,而不需要像上面的情况那样分别将$ VAR与每个数字进行比较。我曾考虑过以下类型的设置,但最终会导致总体上出现更多行。

foreach VAR (`seq 1 24`)
    foreach C (1 2 3 4)
        if ($C == $VAR) then
            set cat = small
        endif
    end
    ...
end

如果所提供的代码与tcsh中的代码一样简单,那么bash是否有更简洁的说法?感谢您的提示。

1 个答案:

答案 0 :(得分:0)

恐怕您在tcsh中不会保存任何行:

#/bin/tcsh
foreach VAR (`seq 1 24`)
  if (${VAR} < 5) then
    set cat = "small"
  else if (${VAR} > 8) then
    set cat = "large"
  else
    set cat = "medium"
  endif
end
exit(0)

您还可以考虑将逻辑传递给AWK(我不知道您的情况是否有帮助):

#/bin/tcsh
foreach VAR (`seq 1 24`)
  set cat = (`echo ${VAR} | awk '$0<5 {print("small"); exit;} $0>8 {print("large"); exit;} {print("medium");}'`)
end
exit (0)