Как настроить цикл в csh для установки переменных на имена каталогов?

Моя файловая структура похожа на это.

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

1
задан 6 June 2018 в 09:05

1 ответ

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

4
ответ дан 3 December 2019 в 06:51

Другие вопросы по тегам:

Похожие вопросы: