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

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