Как настроить цикл в 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
для любых сценариев, которые могут быть запущены в других системах.