質問編集履歴
4
表現に誤りがあった箇所を修正
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文字列の中
|
25
|
+
key=★$tmp文字列の中の$validationStrの直後1文字を取得(上記例では"1")
|
26
|
+
|
27
|
+
else
|
28
|
+
|
29
|
+
echo "パターンが含まれていません"
|
30
|
+
|
31
|
+
fi
|
22
32
|
|
23
33
|
```
|
24
34
|
|
3
表現を簡潔にしました
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,15 +16,13 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
|
19
|
+
# ★
|
20
20
|
|
21
|
-
|
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
タイトルをわかりやすくしました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
シェルスクリプトで、
|
1
|
+
シェルスクリプトで、固定文字列とマッチする直後の1文字だけ抽出したい
|
test
CHANGED
File without changes
|
1
簡潔に書き直しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,163 +1,33 @@
|
|
1
|
-
|
1
|
+
```
|
2
2
|
|
3
|
-
|
3
|
+
#!/bin/bash -
|
4
|
-
|
5
|
-
オプション-eは必須で、パラメータには1か2のみ渡ります。
|
6
4
|
|
7
5
|
|
8
6
|
|
9
|
-
|
7
|
+
# 可変文字列
|
10
8
|
|
11
|
-
|
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
|
-
|
19
|
+
if [[ $tmpに$validationStrを含んでいる場合 ]];then
|
20
|
+
|
21
|
+
keyword=$strの直後1文字を取得(上記例では"1")
|
22
|
+
|
23
|
+
fi
|
14
24
|
|
15
25
|
```
|
16
26
|
|
17
|
-
|
27
|
+
上記の書き方を知りたいです。
|
18
28
|
|
19
|
-
|
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
|
-
|
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
|