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

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

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

5回答

2896閲覧

定期実行のシェルで変数を引き継ぐ方法

natsu25

総合スコア46

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2019/12/06 06:59

Jenkinsのキュー数をチェックし、毎分定期実行するシェルを①~④の要件で作成したいです。
スクリプト内のcountという変数を次回実行の際に引き継ぐ方法が有りましたらご教授願えますでしょうか?

①Jenkinsのキューの数を数える(result)

②resultが100以上かつcountが10未満の場合countにプラス1

③resultが100未満ならcountを0にクリア→処理終了

④countが10になったらアラートをsend mailで発報後countを0にクリア→処理終了

bash

1#!/bin/bash 2 3URL=http://xxxx.net/queue/api/json 4MAIL_FROM=XXX@XXX.com 5MAIL_TO=XXX@XXXX.com 6SUBJECT="Alert" 7 8LIMIT=10 9COUNT= 10 11send_mail (){ 12cat << EOD | sendmail -t 13From: $MAIL_FROM 14To: $MAIL_TO 15Subject: $SUBJECT 16MIME-Version: 1.0 17Content-Type: text/plain; charset="ISO-2022-JP" 18Content-Transfer-Encoding: 7bit 19 20 21Alert 22 23EOD 24} 25 26 27result=`curl -s $URL | jq '.' | grep url | grep http | wc -l` 28 29if [ "$result" -ge 100 -a "$count" -lt $LIMIT ]; then 30 count=`echo "$count+1" | bc` 31elif [ "$result" -lt 100 ]; then 32 count=0 33 exit 0 34fi 35 36if [ "$count" -ge $LIMIT ]; then 37 count=0 38 send_mail 39fi

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

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

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

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

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

guest

回答5

0

すみません。解決している様ですが、
なんか皆さんファイルに保存ばっかりなので、
違う方法を試してみました。

要は、やりたい処理を関数にして
関数中で値の変化した変数を
関数の終了ステータスとして
呼び出し元に返し、
呼び出し元ではこれを別の変数に保存し
関数実行時の引数として与える。

これで外部ファイルを作成することなく
スクリプト内で変数の値を保持することが
可能です。

$ cat countup.sh

increment() { count=${1} echo ${count} count=$(( count + 1 )) return ${count} } argm=0 while true do increment ${argm} argm=$? sleep 10 done

実行結果(sleepは定期実行したいタイミングに適宜合わせる、制度は微妙)

$ sh -x countup.sh

  • argm=0
  • true
  • increment 0
  • count=0
  • echo 0

0

  • count=1
  • return 1
  • argm=1
  • sleep 10
  • true
  • increment 1
  • count=1
  • echo 1

1

  • count=2
  • return 2
  • argm=2
  • sleep 10
  • true
  • increment 2
  • count=2
  • echo 2

2

  • count=3
  • return 3
  • argm=3
  • sleep 10
  • true
  • increment 3
  • count=3
  • echo 3

3

  • count=4
  • return 4
  • argm=4
  • sleep 10
  • true
  • increment 4
  • count=4
  • echo 4

4

  • count=5
  • return 5
  • argm=5
  • sleep 10

^C
$

なんかこんな感じでどうでしょうかね。

投稿2020/06/09 12:00

編集2020/06/09 12:14
hana_yama_san

総合スコア923

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

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

dodox86

2020/06/09 12:31

質問文中には > Jenkinsのキュー数をチェックし、毎分定期実行するシェル とあり、Jenkins、つまり外部から定期的に別プロセスとして実行されるシェルスクリプト、と言う要件があります。
hana_yama_san

2020/06/09 12:59

それは申し訳ない。毎分定期実行といっても、外部要因の状況で実行タイミングが左右されるのですか。文脈からは「sleep 60 && 'キューのチェック`」とも読めるので・・・というか原文の「①Jenkinsのキューの数を数える(result)」に対応する「curl」から「wc -l」に至る中に実行タイミングが見えなくて、やっぱりcornとかで定期実行しているのでは?
dodox86

2020/06/09 13:14

> 「curl」から「wc -l」に至る中に実行タイミングが見えなくて、 ということはやはり外部から呼ばれていることを示唆していると思います。cronから呼ばれようと事情的には同じで、定期的と言うタイミングは外部が管理していて、質問者さん提示のシェルスクリプトは呼ばれて1回で終わり。その次に呼ばれたときに変数の値を引き継ぎたい、というところから質問が発していると判断しての私を含む皆さんの回答だったと思います。
hana_yama_san

2020/06/09 13:29

おっしゃるとおりです。cronであろうがなかろうが、外部から呼ばれた場合は都度プロセスは死にますので、 内部で変数を保持することが不可能なのは自明です。 私の提言は「外部管理を内部管理に変えてみてはどうですか」という話ですから。 ま、運用方針とか・一つのプロセスが走っているリスク(起動終了を管理していなければ不測の事態を把握できない) と言う観点に立てば、外部からコントロール出来ないものはNGなのは分かってます。 しかしこの場ではそこを考慮せずに自由な実行例を開示するのは有用ではないでしょうか。
dodox86

2020/06/09 13:39

> この場ではそこを考慮せずに自由な実行例を開示するのは有用ではないでしょうか。 こちらの点については回答の意図を明確にされる限り、私も同意いたします。
hana_yama_san

2020/06/09 13:56

すみません。意図が不明瞭で有ったならそれは私の責任です。
guest

0

他の方も書いていますが、永続化したい値はファイルに書き出しておいて、次回起動時に値を読み込むのが良いと思います。

書出:

sh

1echo "${変数}" > ファイル

読込:

sh

1変数="$(cat ファイル)"

投稿2019/12/31 08:35

miminashi

総合スコア22

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

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

0

bashで解釈できる形で書き出してsourceで読み込む方法もあります。

bash

1#!/bin/bash 2 3if [ -f "data.txt" ]; then 4 source data.txt 5else 6 count=0 7fi 8echo ${count} 9let count=count+1 10echo "count=${count}" > "data.txt"

ただ、改竄されると大変なことになるので注意が必要です。

投稿2019/12/06 10:25

nomuken

総合スコア1627

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

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

0

ベストアンサー

良くあるのが、KEY=VALUEなどのデータ形式のファイルで保存し、sedawkperlのスクリプトをワンライナーで書き、処理をするような例です。以下は、values.txtと言うファイルにCOUNT=数の形式で保存し、シェルスクリプトを呼び出すごとに+1する例です。参考にしてみてください。

bash

1#!/bin/bash 2 3COUNT=`sed -ne s/^COUNT=//p values.txt 2> /dev/null` 4if [ -z "$COUNT" ]; then 5 COUNT=0 6fi 7echo "BEFORE: $COUNT" 8let ++COUNT 9echo "AFTER: $COUNT" 10echo "COUNT=$COUNT" > values.txt

実行例です。

bash

1$ rm values.txt 2 3$ ./t2.sh 4BEFORE: 0 5AFTER: 1 6 7$ cat values.txt 8COUNT=1 9 10$ ./t2.sh 11BEFORE: 1 12AFTER: 2 13 14$ ./t2.sh 15BEFORE: 2 16AFTER: 3 17 18$ ./t2.sh 19BEFORE: 3 20AFTER: 4 21 22$ cat values.txt 23COUNT=4 24

投稿2019/12/06 08:16

dodox86

総合スコア9183

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

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

0

ファイルを使ってcount値を保持すればいいのでは?

  1. スクリプトの最初にRead openし、値を読み込み、closeする。
  2. スクリプトの最後でWrite openし、値を書き込み、closeする。

投稿2019/12/06 07:10

sage

総合スコア1216

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問