質問: t44444,t55555,t44444 ``` 確認処理を実行するfooファイルの中身 ``` 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 ``` 現在のfooファイルの処理は行先頭に#がある、ないの判断だけです。 ----下記「実現させたい処理」---- 1. 先頭に#があるか、ないかの結果をbooleanで受け取る * 先頭に#があるならwarningを表示して処理を終了 2. 各グループに重複したIDかあるか、ないかをtrue,falseで出力(例として現在はcccccグループにt44444のID重複が確認できる)その結果をbooleanで受け取る * 重複がなければ(falseの場合)warningを表示して処理を終了 1.2の結果をbooleanで受け取ってwarning終了パターンがtrueになるif分岐を作る →その中で上記のwarning,exitを行う →後続処理を続けるパターンについてはここでは何もしない(処理を続けてはいけない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 * `=~`: 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. > > > ``` #!/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' ```