如何在 csh 中设置循环以将变量设置为目录名称?

如何在 csh 中设置循环以将变量设置为目录名称?

我的文件结构是这样的。

unix% ls
NGC2201 IC0499 IC7216 NGC7169
unix% cd NGC2201
unix% ls
7019 2221 note

其中 7019 和 2221 是新目录,note 是我用来创建变量的文本文件。2221 和 7019 中的内容很重要,但不需要设置为变量;我之后的脚本会处理所有这些。

我当前的脚本如下:

# The purpose of this script is to take the note files provided and set the values as variables.

#!/bin/csh -f

set z=`grep -E '^z=' note | cut -d= -f2`
set nh=`grep 'NH' note | cut -d= -f2`
set xc=`grep 'Center' note | cut -d, -f1 | cut '-d' -f4`


echo $z $nh $xc

这将设置当前目录中使用的三个变量(在本例中,我们将使用 NGC2201 作为父目录,并使用 7019 和 2221 作为这些变量要使用的子目录)。

我的问题是如何编写脚本来自动将 NGC2201 设置为名为 $g 的变量,将 2221 设置为名为 $obs 的变量。

脚本运行完 2221 后,我希望它将目录设置为 7019 并重复这些步骤。NGC2201 内的目录完成后,我希望脚本继续运行到 IC0499,重复该过程,等等。

我如何让脚本在目录中运行?我不能将其设为全局的,因为它不能太过干扰;我只需要它深入两个目录即可令人满意。

如果可能的话,我希望将其保留在 csh 中,但如果在 tcsh 或 bash 中更容易,我完全赞成。此外,如果有比像这样循环更简单的解决方案,我也完全赞成。

答案1

在中csh,您可以使用foreach循环来循环遍历当前目录中目录的每个子目录:

foreach i (*/*/)
  set g=`echo $i | cut -d/ -f1`   # slash-delimited, select first field
  set obs=`echo $i | cut -d/ -f2` # slash-delimited, select second field
  echo $g $obs
end

相当于bash一个for循环。当然你可以cut像上面一样使用,但bash还有一个详细的参数扩展功能,因此您不需要调用任何外部功能:

for i in */*/; do
  g=${i%%/*}   # cut everything from the first slash 
  obs=${i#*/}  # cut everything until first slash
  obs=${obs%/} # cut slash at the end
  echo $g $obs
done

echo用您想对变量执行的任何操作替换该行。

示例运行

%csh提示,是$那个bash

% tree    
.
├── IC0499
├── IC7216
│   └── 2222
├── NGC2201
│   ├── 2221
│   ├── 7019
│   └── note
└── NGC7169

7 directories, 1 file

% foreach i (*/*/)
? set g=`echo $i | cut -d/ -f1`
? set obs=`echo $i | cut -d/ -f2`
? echo $g $obs
? end
IC7216 2222
NGC2201 2221
NGC2201 7019

$ for i in */*/; do g=${i%%/*}; obs=${i#*/}; obs=${obs%/}; echo $g $obs; done
IC7216 2222
NGC2201 2221
NGC2201 7019

引用https://www.cyberciti.biz/faq/csh-shell-scripting-loop-example/

请注意,它csh因许多创新功能而广受欢迎,但csh从未像脚本那样受欢迎。如果您正在编写系统级 rc 脚本,请避免使用csh。您可能希望/bin/sh对可能需要在其他系统上运行的任何脚本使用。

相关内容