

hogeファイルの中身に対して確認処理をおこない、処理を終了するかしないかの判断をしたいです。

・作成したい確認処理の手順

  1. hogeファイルの22-24行目の先頭行に#が先頭についているかいないかの判断

    * 先頭に#がある場合はtrue
    * #がなければfalse（この場合は手順2へ進む）
  2. 次に各グループのIDに重複があるかの確認（下記のhogeの24行目にあるcccccグループにt44444の重複がある）

    * 追加するIDがあればtrue なければfalse
    * 重複しているIDあればtrue なければfalse

手順1.2でfalseだった場合の終了処理をfooファイルに作りたい。  
fooファイルは手順1の確認処理しかできていない状態です。  
1.2の結果をbooleanで受け取って warning終了になるif分岐を作成したいです。  
合わせて手順２の処理のアドバイスもいただけると幸いです！！

対象のhogeファイルの中身

[code]

    #グループ名 = ID,ID,ID.....とみなします
    22行目# aaaaa = txxxxx,txxxxx
    23行目bbbbb = t11111,t22222
    24行目cccccc = t44444,t55555,t44444
    
    
[/code]

確認処理を実行するfooファイルの中身

[code]

    aaaaa=$(cat hoge | head -22 | tail-1)
    bbbbb=$(cat hoge | head -23 | tail-1)
    ccccc=$(cat hoge | head -24 | tail-1)
    
    #行の先頭に#があるか、ないかの判断
    if ["`echo $aaaaa | grep ^#`"]; then
      echo 'ある'
    else
      echo 'ない'
    fi
    
    if ["`echo $bbbbb | grep ^#`"]; then
      echo 'ある'
    else
      echo 'ない'
    fi
    
    if ["`echo $ccccc | grep ^#`"]; then
      echo 'ある'
    else
      echo 'ない'
    fi
    
    
[/code]

現在のfooファイルの処理は行先頭に#がある、ないの判断だけです。

\----下記「実現させたい処理」----

  1. 先頭に＃があるか、ないかの結果をbooleanで受け取る 
    * 先頭に＃があるならwarningを表示して処理を終了
  2. 各グループに重複したIDかあるか、ないかをtrue,falseで出力(例として現在はcccccグループにt44444のID重複が確認できる)その結果をbooleanで受け取る 
    * 重複がなければ(falseの場合)warningを表示して処理を終了

1.2の結果をbooleanで受け取ってwarning終了パターンがtrueになるif分岐を作る  
→その中で上記のwarning,exitを行う  
→後続処理を続けるパターンについてはここでは何もしない(処理を続けてはいけないwarningパターンをキャッチするだけ)

以上となります。  
アドバイスいただけますと幸いです！  
よろしくお願い致します。


CC BY-SA 4.0
2020-11-04T13:22:36.873
71726
2020-11-04T16:30:19.243
2020-11-04T15:00:22.387
32986
42602
question
shellscript
シェルスクリプト　if分岐でtrueを受け取った場合warning表示して終了する処理の作成


> \----下記「実現させたい処理」----
>
>   1. 先頭に＃があるか、ないかの結果をbooleanで受け取る
>     * 先頭に＃があるならwarningを表示して処理を終了
>   2.
> 各グループに重複したIDかあるか、ないかをtrue,falseで出力(例として現在はcccccグループにt44444のID重複が確認できる)その結果をbooleanで受け取る
>     * 重複がなければ(falseの場合)warningを表示して処理を終了
>

以下のスクリプトでは bash 特有の機能を利用しています。

  * mapfile: read lines from the standard input into the indexed array  
[Bash mapfile builtin command help and
examples](https://www.computerhope.com/unix/bash/mapfile.htm)

  * `=~`: pattern matching

> An additional binary operator, =~, is available, with the same precedence as
> == and !=. When it is used, the string to the right of the operator is
> considered a POSIX extended regular expression and matched accordingly (as
> in regex(3)). The return value is 0 if the string matches the pattern, and 1
> otherwise.

  * `${l/#*=/}`: pattern substitution

> `${parameter/pattern/string}`. The pattern is expanded to produce a pattern
> just as in pathname expansion, Parameter is expanded and the longest match
> of pattern against its value is replaced with string.
[code]

    #!/bin/bash
    
    mapfile -t arr < <(sed -n '22,24p' data.txt)
    
    for l in "${arr[@]}"
    do
      [[ "$l" =~ ^# ]] &&
        {
          printf "'#' is found at beginning of '$l'\n" >&2
          continue
        }
    
      echo ${l/#*=/} | tr , '\n' | sort | uniq -d 2>/dev/null | grep -Eq '.' ||
        {
          printf "None duplication in '$l'.\n" >&2
          continue
        }
    
      printf "Passed: '$l'\n"
    
    done
    
    # 実行結果
    '#' is found at beginning of '# aaaaa = txxxxx,txxxxx'
    None duplication in 'bbbbb = t11111,t22222'.
    Passed: 'cccccc = t44444,t55555,t44444'
    
[/code]


CC BY-SA 4.0
2020-11-04T15:49:41.287
71731
2020-11-04T16:30:19.243
2020-11-04T16:30:19.243
3060
71726
answer