39323

[code]

    if [[ ! -o posix && -z "${BASH_COMPLETION_COMPAT_DIR:-}" ]]; then
        if [[ -f /usr/share/bash-completion/bash_completion ]]; then
            . /usr/share/bash-completion/bash_completion
        elif [[ -f /etc/bash_completion ]]; then
            . /etc/bash_completion
        fi
    fi
    
[/code]

現状では上記のように書いているのですが、同じファイル名を2回書くのは冗長に思えます。  
より良い書き方はありますでしょうか？

bashの組み込みコマンドでなければ`find PATH/TO/DIR -name FILENAME -execdir cat {}
\+`のように書けるのですが……。


CC BY-SA 3.0
2017-11-04T13:00:05.080
39291
2017-11-08T06:10:05.793
25936
question
bash
ファイルが存在したらそれをsourceする処理をスマートに書くには？


`man bash`の`[[ expression ]]`セクションに次のような記述がありました。

> そのほか、二項演算子 =~ もあります。  
>  (中略)  
>  正規表現中の括弧による部分式にマッチした部分文字列は、配列変数 BASH_REMATCH に保存されます。  
>  BASH_REMATCH のインデックス 0 の要素は、文字列のうち正規表現全体にマッチした部分になります。
[code]

    if [[ ! -o posix && -z "${BASH_COMPLETION_COMPAT_DIR:-}" ]]; then
        if [[ "/usr/share/bash-completion/bash_completion" =~ .* && -f "${BASH_REMATCH[0]}" ]]; then 
            . "${BASH_REMATCH[0]}"
        elif [[ "/etc/bash_completion" =~ .* && -f "${BASH_REMATCH[0]}" ]]; then
            . "${BASH_REMATCH[0]}"
        fi  
    fi
    
[/code]

上記のように書くことで多少すっきりしました。

(改善点)  
* shellcheckでSC2049及びSC2050の警告が出る


CC BY-SA 3.0
2017-11-04T13:00:05.080
39292
2017-11-08T06:10:05.793
2017-11-08T06:10:05.793
25936
25936
39291
answer


自分だったら、重複とか気になりだしたら、普通に変数導入したり関数挟んだりして対応すると思います。仮に、自分が重複省くとしたら、以下のようになると思います。

[code]

    #!/usr/bin/env bash
    
    try_source_first_existed() {
        for file in "$@"
        do
            if [ -f "$file" ]
            then
                . "$file"
                return $?
            fi
        done
    }
    
    if [[ ! -o posix && -z "${BASH_COMPLETION_COMPAT_DIR:-}" ]]; then
        try_source_first_existed \
            /usr/share/bash-completion/bash_completion \
            /etc/bash_completion
    fi
    
[/code]


CC BY-SA 3.0
2017-11-06T01:50:40.757
39323
2017-11-06T01:50:40.757
754
39291
answer