
csh スクリプトに、少なくとも 2 行の出力 (場合によってはそれ以上) ができるコマンドがあります。これらの行を別の変数に変換し、別のコマンドに渡したいと考えています。コマンド 1 から出力された各変数をループして実行するように 2 番目のコマンドを設定するにはどうすればよいでしょうか。以下は、コマンド 1 の出力を変数に変換するコマンドです。
set vars = `echo "command 1"`
set numRows = $#vars
if ($numRows < 2) then
echo "ERROR! $numRows rows!"
exit
endif
`echo '/command2 -L '$vars[1]'`
答え1
注意: 私は csh ではなく bash を使用しています。これは、私が嫌いなわけではないからです。しかし、csh でもこのすべてを実行できます。翻訳するだけで済みます。代わりに bash で作業したい場合は、最初に「bash --login」を実行するだけで、その後は bash で作業できます。
シェルスクリプトであなたが説明したようなタスクを実行するには、プログラミング言語のようにループではなくパイプを使用します。誤解しないでください。はcsh と bash のループ構造ですが、あなたが説明した内容については、別の方法で行います。
複数行の出力を生成するコマンドがあり、それらの行を別のコマンドで 1 行ずつ処理したい場合は、次のように 2 つのコマンドをパイプ | で接続します。
cat file.txt | grep "いくつかの単語"
grep コマンドは、パイプによって cat コマンドの STDOUT にリンクされている STDIN から入力される各行を処理します。これは些細な例ですが、役に立ちます。
別の:
echo '1,2,3' | tr ',' '\n'
これにより、すべてのカンマが改行に置き換えられ、1 行の入力から 3 行の出力が作成されます。
ディレクトリ内のすべてのファイル名に拡張子を追加したい場合は、次のようにします。
cd directory
for filename in *
do
mv ${filename} ${filename}.extension
done
* はファイル グロビング パターンです。ファイル グロビングとは、コマンド ラインのパターンが、現在のディレクトリ内のグロビング パターンに一致する任意のファイル名に置き換えられることです。* は「何でも」を意味します。