web-dev-qa-db-ja.com

変数をディレクトリ名に設定するために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

これにより、現在のディレクトリで使用する3つの変数が設定されます(この場合、NGC2201を親ディレクトリとして使用し、7019および2221をこれらの変数のサブディレクトリとして使用します)。

私の質問は、NGC2201を$ gという名前の変数として、2221を$ obsという変数として自動的に設定するスクリプトを作成する方法です。

スクリプトが2221を実行した後、ディレクトリを7019に設定し、手順を繰り返したいと思います。 NGC2201内のディレクトリが終了したら、スクリプトをIC0499に移動し、プロセスを繰り返すなどしてください。

ディレクトリを介してスクリプトを実行するにはどうすればよいですか?あまりにも邪魔にならないため、グローバル化することはできません。満足のいくように、2つのディレクトリに移動するだけで十分です。

可能であればcsh内に保持したいと思いますが、tcshまたはbashでこれが簡単な場合は、それだけです。さらに、このようにループするよりも簡単な解決策があれば、私もそのすべてです。

1
J. Doe

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には詳細な 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はスクリプトではあまり人気がなかったことに注意してください。システムレベルのrcスクリプトを記述する場合は、cshの使用を避けてください。他のシステムで実行する必要があるスクリプトには、/bin/shを使用できます。

4
dessert