質問編集履歴

4

表現に誤りがあった箇所を修正

2020/04/16 08:19

投稿

umino
umino

スコア54

test CHANGED
File without changes
test CHANGED
@@ -16,9 +16,19 @@
16
16
 
17
17
 
18
18
 
19
- #
19
+ #
20
20
 
21
+ if echo "$str" | grep "$tmp" >/dev/null; then
22
+
23
+ echo "パターンが含まれています"
24
+
21
- key=$tmp文字列の中で、$strの直後1文字を取得(上記例では"1")
25
+ key=$tmp文字列の中$validationStrの直後1文字を取得(上記例では"1")
26
+
27
+ else
28
+
29
+ echo "パターンが含まれていません"
30
+
31
+ fi
22
32
 
23
33
  ```
24
34
 

3

表現を簡潔にしました

2020/04/16 08:19

投稿

umino
umino

スコア54

test CHANGED
File without changes
test CHANGED
@@ -16,15 +16,13 @@
16
16
 
17
17
 
18
18
 
19
- if [[ $tmpに$validationStrを含んでいる場合 ]];then
19
+ #
20
20
 
21
- keyword=$strの直後1文字を取得(上記例では"1")
21
+ key=$tmp文字列の中で、$strの直後1文字を取得(上記例では"1")
22
-
23
- fi
24
22
 
25
23
  ```
26
24
 
27
- 上記の書き方を知りたいです。
25
+ 上記$keyの書き方を知りたいです。
28
26
 
29
27
  正規表現になると思いますが、お詳しい方ご教示いただけませんでしょうか?
30
28
 

2

タイトルをわかりやすくしました。

2020/04/16 08:08

投稿

umino
umino

スコア54

test CHANGED
@@ -1 +1 @@
1
- シェルスクリプトで、可変の文字列からる1文字だけ抽出したい
1
+ シェルスクリプトで、固定文字列とマッチす直後の1文字だけ抽出したい
test CHANGED
File without changes

1

簡潔に書き直しました

2020/04/16 08:00

投稿

umino
umino

スコア54

test CHANGED
File without changes
test CHANGED
@@ -1,163 +1,33 @@
1
- ### 前提
1
+ ```
2
2
 
3
- とあるシェルスクリプト`/home/testuser/foo.sh -e 1(or 2)`があります。
3
+ #!/bin/bash -
4
-
5
- オプション-eは必須で、パラメータには1か2のみ渡ります。
6
4
 
7
5
 
8
6
 
9
- このシェルスクリプトは、
7
+ # 可変文字列
10
8
 
11
- 1.cronで30秒おきに実行します。
9
+ tmp="12028 /bin/sh -c for i in 15 45;do (sleep ${i} ; /home/testuser/foo.sh -e 1 >> /dev/null 2>&1) & done"
12
10
 
11
+
12
+
13
+ # チェック・抽出用文字列(固定)
14
+
15
+ validationStr="/home/testuser/foo.sh -e "
16
+
17
+
18
+
13
- 2.cronでなく手動でCLIから実行すこともあります。
19
+ if [[ $tmpに$validationStrを含ん場合 ]];then
20
+
21
+ keyword=$strの直後1文字を取得(上記例では"1")
22
+
23
+ fi
14
24
 
15
25
  ```
16
26
 
17
- # crontab -l
27
+ 上記の書き方を知りたいです。
18
28
 
19
- # この書式は修不可(不変)で。cronから実行の場合オプションeは必ず1す。
29
+ 規表現になると思いまお詳しい方ご教示いただけませんしょうか?
20
-
21
- * * * * * for i in 0 30;do (sleep ${i} ; /home/testuser/foo.sh -e 1 >> /dev/null 2>&1) & done
22
-
23
- ```
24
30
 
25
31
 
26
32
 
27
- cronとCLI両方から実行した場合(重複実行した場合)、後発のシェルスクリプトで検出します。
28
-
29
- 最古のプロセスID=自身のプロセスID($$)が一致しない場合は、重複実行(自身が後発)として、分岐します。
30
-
31
- さらに、最古のプロセスを実行した際の-eオプションパラメータ(1か2)を取得し、後発の処理に使用します。★ここが今回の問題点
32
-
33
-
34
-
35
- ### 実現したいこと
36
-
37
- 「最古のプロセスを実行した際の-eオプションパラメータを取得する処理」をしたいです。
38
-
39
- (下記★★★マーク部分が今回わからないところです)
40
-
41
-
42
-
43
- ```bash
44
-
45
- #!/bin/bash
46
-
47
- # /home/testuser/foo.sh
48
-
49
- # ---前略---
50
-
51
-
52
-
53
- # 自プロセスファイル名を取得
54
-
55
- fname=$(basename $0)
56
-
57
-
58
-
59
- # 自プロセス実行コマンド(オプション以外)を組立
60
-
61
- my_proc_cmd=$(cd $(dirname $0); pwd)/${fname} # /home/testuser/foo.sh
62
-
63
-
64
-
65
- # 実行中の同名かつ最古のプロセスを検索する(先発プロセスの検索)
66
-
67
- pgrep_result=$(pgrep -foa "${my_proc_cmd}")
68
-
69
- # (以下例)最古のプロセスがcronから実行している場合の結果
70
-
71
- # 12028 /bin/sh -c for i in 15 45;do (sleep ${i} ; /home/testuser/foo.sh -e 1 >> /dev/null 2>&1) & done
72
-
73
- # (以下例)最古のプロセスがCLIから実行している場合の結果
74
-
75
- # 12029 /home/testuser/foo.sh -e 2
76
-
77
-
78
-
79
- # 最古のプロセス情報からpidを抽出する(結果の左端要素を抽出)
80
-
81
- oldest_proc_pid=${pgrep_result%% *} # 12028 などのプロセスID
82
-
83
- if [ $oldest_proc_pid = $$]; then
84
-
85
- echo "自プロセスは最古のプロセスです。"
86
-
87
- fi
88
-
89
-
90
-
91
- # 最古のプロセス情報から、オプションで指定された引数を抽出する(結果の右端要素を抽出)
92
-
93
- oldest_proc_param=${pgrep_result##* } ★★★
94
-
95
- # ↑-eオプションの後ろの値(1か2)を取得したいが、cronから実行した結果、「done」を取得してしまう
96
-
97
- if [ oldest_proc_param = 1 ]; then
98
-
99
- echo "最古のプロセスの-eパラメータは1です。"
100
-
101
- fi
102
-
103
- # ---以下の処理は省略---
104
-
105
- ```
106
-
107
- 上記の★★★マークの箇所の書き方を知りたいです。
108
-
109
-
110
-
111
- やりたいこととしては、
112
-
113
- pgrepで最古プロセス情報を全文取得したのちパースて、
33
+ (直前私の投稿は冗長だったため、簡潔にしたに編集ました。)
114
-
115
- -eオプションパラメータ(1か2)を取得し、
116
-
117
- 変数oldest_proc_paramへ格納したいです。
118
-
119
-
120
-
121
- 難しいところは、
122
-
123
- CLIから実行している場合、pgrepの結果が「12029 /home/testuser/foo.sh -e 2」などですから、
124
-
125
- 単純に右端要素を取得すれば、「2」などのほしいパラメータが取得できます。
126
-
127
-
128
-
129
- しかし、cronから実行している場合、pgrepの結果が「12028 /bin/sh -c for i in 15 45;do (sleep ${i} ; /home/testuser/foo.sh -e 1 >> /dev/null 2>&1) & done」などですから、
130
-
131
- 単純に右端要素だけの取得では、パラメータを得られません。(doneを取得してしまう)
132
-
133
-
134
-
135
- ### 試したこと
136
-
137
- 前提になってしまいますが、cron実行でも、CLIから実行でも、
138
-
139
- 「/home/testuser/foo.sh -e 」は必ず固定文字列です。
140
-
141
- ですから「"/home/testuser/foo.sh -e "のあとの1文字を取得する」という実装がよいと思うのですが、
142
-
143
- 実際の書き方がわかりません。
144
-
145
- (ほかに良い方法があれば、そちらで$oldest_proc_paramへ-eオプションパラメータを格納してもよいのですが、思いつきませんでした。
146
-
147
- また、都合により大幅に実装を変えることはできません。)
148
-
149
-
150
-
151
- こちら`$oldest_proc_param`に格納する文字抽出の書き方について、
152
-
153
- よい書き方をご存じの方、ご教示いただけませんでしょうか?
154
-
155
- 不勉強で恐縮ですが、よろしくおねがいします。
156
-
157
-
158
-
159
-
160
-
161
- ### 補足情報
162
-
163
- CentOS7