Моя файловая структура похожа на это.
unix% ls
NGC2201 IC0499 IC7216 NGC7169
unix% cd NGC2201
unix% ls
7019 2221 note
где 7019 и 2221 новые каталоги, и примечание является текстовым файлом, который я использую для создания переменных. Содержание в 2 221 и 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, я хотел бы, чтобы он затем установил каталог как 7 019, и повторил бы шаги. После того, как каталоги в NGC2201 закончены, я хотел бы, чтобы сценарий шел дальше к IC0499, повторил процесс и т.д.
Как я заставляю сценарий пробегать каталоги? Я не могу сделать это глобальным, потому что это не может быть слишком навязчиво; мне нужен он, чтобы только пойти два каталога глубоко, чтобы быть удовлетворительным.
Я хотел бы сохранить его в csh, если это возможно, но если это легче в tcsh или ударе, я - все для него. Кроме того, если существует более легкое решение, чем цикличное выполнение это как это, я - все для этого также.
В csh
, можно использовать a 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
эквивалентный a for
цикл. Конечно, можно использовать cut
как выше, но bash
также имеет разработанную функцию Parameter Expansion, таким образом, Вы ничего не должны называть внешним:
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
никогда не было так же популярно для сценариев. Если Вы - сценарии дистанционного управления уровня системы письменности, избегают использованияcsh
. Можно хотеть использовать/bin/sh
для любых сценариев, которым, возможно, придется работать на других системах.