我的文件结构是这样的。
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
对可能需要在其他系统上运行的任何脚本使用。