servces
で使用可能な値のリストにある値のみを持つ新しい変数を作成するシナリオがありますfilex
。
$ cat filex
all_name1_db
all_name2_dm
alm_service1_ax
all_name3_du
alz_name4_dx
ali_name5_dk
alk_service2_av
alf_name6_df
alj_name7_dq
services
以下は、サービスが含まれる値のみを含む変数を作成するために使用するコードです。
for x in $filex
do
if [[ $x == *"service1"* ]] || [[ $x == *"service2"* ]];then
Services+=$x","
fi
done
最終結果は、以下に示すコンマ区切りの値になります。
$ cat $Services
alm_service1_ax,alk_service2_av
ここで問題となるのは、 のservice
値が引き続き増加し、 を追加してステートメントfilex
を拡張できないことです。たとえば、に という新しいサービスが含まれている場合、ステートメントは次のようになります。if
||
bum_service3_bk
filex
if
...
if [[ $x == *"service1"* ]] || [[ $x == *"service2"* ]] || [[ $x == *"service3"* ]] ;then
...
service
そして、これは新しいものが追加されるたびに増加し続けるでしょうfilex
if
複数の条件に対応できる単一の条件を持つステートメントを記述する方法、または問題に対処するためのより良い方法はありますか?
答え1
テキスト処理のループを避ける。 ここ:
grep 'service[123]' filex | paste -sd , -
または:
grep 'service1
service2
service3' filex | paste -sd , -
答え2
1行の回答が必要な場合は、以下を使用します。
grep "service" filex | xargs echo | sed 's/ /, /g'
または
条件付き構文が必要な場合は、次のようにします。
while read -r line
do
if [[ $line == *"service"* ]]
then
Services+=("$line")
fi
done < "/tmp/filex"
echo "${Services[@]}" | tr ' ' ,
次のような結果になります:
alm_service1_ax,alk_service2_av,alk_service5_av,alk_service3_aff,alk_service5_afds
/tmp/filex
- ファイルのパス
echo "${Services[@]}" | tr ' ' ,
- カンマ区切りの配列を印刷する