質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Q&A

解決済

3回答

811閲覧

シェルスクリプトの書き方

ryoma7i

総合スコア5

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

0グッド

0クリップ

投稿2023/03/15 06:52

転送するコマンドをシェルに記載したいのですが
元が複数あっても同じところにもっていくわけでなく行先ももちろん
パスを分けるので複数書かないといけないです。

賢い書き方を教えて抱けますでしょうか?
最悪全部'&&'でつなげていってもいいんですが
かっこいい書き方で教えてください

aws s3 cp /var/log/maillog-* s3://{バケット名}/{パス}
aws s3 cp /var/log/spooler-* s3://{バケット名}/{パス}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2023/03/15 07:08

この情報では、どのようなところに困難を感じているのかわかりません。 ファイルと転送先の具体的な対応についての情報わありますか? たとえば、maillog-* であらわされるファイルは s3のどういう場所にどのような名前で配置されるのですか?
ryoma7i

2023/03/15 07:16 編集

>この情報では、どのようなところに困難を感じているのかわかりません。 →確かに羅列してもできることなので困難ではありません  シェルスクリプト記載するにあたりかっこよくなるなら参考にしたいというだけです。 >ファイルと転送先の具体的な対応についての情報わありますか? →いやこれについてはいまのところこれだけです。S3の設定して決まれば追記するんですが  決まればこの後ろに入れていくということだけです ただ伺いたいのですが、コマンドの羅列をシェルに記載するにあたっての質問が かっこよくしたい(見栄えを良くしたい、他人に見せられるレベルにしたい)ということにおいて S3の場所を教えてほしいというのは本当に必要な情報なのでしょうか?
melian

2023/03/15 07:21

一応、bash や zsh にある連想配列(hash)を使えば見栄えはよくなる?かもしれませんが、本質的にはコマンドを羅列するのと同じです。まぁ、シェルスクリプトの先頭に set -e を付けるくらいでしょうかね。。。("&&" で繋げる必要はなくなります)
TakaiY

2023/03/15 07:46 編集

例えば /var/log にあるすべてのもしくは特定のディレクトリを、そのディレクトリ名から作られるバケット名やパス名に転送するのであれば、羅列でなくfor文などで効率よく書けでしょう。 ファイルとs3のパスの対応を 別のテキストファイルに入れておいて読むっていうのもありでしょう。
ryoma7i

2023/03/15 07:49

TakaiY様 ありがとうございます。 少しfor文での作成は頑張ってみたいと思います。 別のテキストファイルはちょっと・・・というところですね。 理由としては1つのシェルでシンプルにまとめたいということです。 残念ながらシェルがこれだけではありませんのでそういう考えをしております。
maisumakun

2023/03/15 07:50

> 複数書かないといけないです。 いくつぐらいになることを想定していますか?
ryoma7i

2023/03/15 07:51

ログファイル20個ほどです。 /va/logにあるものだけはありませんね
guest

回答3

0

既に解決済みですが、一例としてヒアドキュメントを使う方法など。(IFS 等、適当に変更してください)

bash

1#!/bin/bash 2 3set -eu 4shopt -s nullglob 5 6bucket='s3://bucket' 7while IFS=, read src dst 8do 9 declare -a files=($(echo "${src}")) 10 [[ ${#files[@]} == 0 ]] && continue 11 # aws s3 cp "${files[@]}" "${bucket}/${dst}" 12done <<EOT 13/var/log/maillog-*,path01 14/var/log/spooler-*,path02 15EOT

投稿2023/03/15 08:02

編集2023/03/15 08:29
melian

総合スコア19754

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

失礼しました
ですが・・・まだ正式に決まってません

ですがパケット名までは同じです。パスがログの目的別のものになる予定です。
s3://{バケット名}/{パス}

投稿2023/03/15 07:57

ryoma7i

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

複数の物を規則性無く異なる場所にコピーするなら、書き並べるしか無いです。
パスなどに共通部分が多いなら、関数定義すると見やすくなるかもしれません。コピー先とコピー元に規則性があるならその規則を関数内で実装します。
共通部分が少なく、コピー先とコピー元に規則性も無いなら、質問文のように単に並べるしか無いです。

S3の場所を教えてほしいというのは本当に必要な情報なのでしょうか?

「S3の場所を教えてほしい」という質問じゃなくて、
「コピー先とコピー元に規則性があるかどうか。あるならどういう規則性か」という質問ですね。

&&でつなげるかset -eを書くかは「エラーの時どうしたいか」次第です。

関数定義のサンプル:
コピー先とコピー元のパスに、同じ文字列がありそれ以外は共通という一例。

Bash

1foo(){ 2 aws s3 cp /var/log/$1-* s3://{バケット名}/backup-$1 3} 4 5foo maillog && 6foo spooler

投稿2023/03/15 07:53

編集2023/03/15 09:36
otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問