bash:繰り返し文字が機能しません

bash:繰り返し文字が機能しません

文字列にスペースとハッシュ文字( "#")のみが含まれていることを確認するこのコードがあります。そうであれば「はい」をエコーし​​、そうでなければ「いいえ」をエコーし​​ます。

string="###############
        #             #
        # #############
        #             #
        # ######### # #
        #         # # #
        # ### ##### # #
        #   #     # # #
        # # ###########
        # #            
        ###############"
                       
 confirm_variable="Yes"
 for (( i=0; i<${#string}; i++ )); do
    str="${string:$i:1}"
    if [ "$str" == "#" ] || [ "$str" == " " ] || [ "$str" == "\n" ] ; 
        then
            continue
        else
            confirm_variable="No"
            break
    fi

done
echo $confirm_variable

なぜこれがうまくいかないのかわかりません。文字列を次のようにするのと同じです。

string="## #### # #  #" 

とてもうまくいくようです。

ベストアンサー1

"\n"2文字のバックスラッシュと小文字のn。

一部のシェルではecho "\n"改行文字(実際には2つ)を印刷し、すべてのシェルではを印刷しますprintf "\n"。しかし、これはバックスラッシュが特別に扱われるからですechoprintfこれは、バックスラッシュエスケープが常に(二重引用符で囲まれた)文字列で特別に扱われるC、Perl、Pythonなどの言語とは異なります。

多くのシェルでは、$'\n'これは改行文字のみを含む文字列です。 (しかし、純粋なPOSIX shでは、引用符の中にリテラル改行文字を追加する必要があります。)

つまり、Bash/Ksh/Zsh では手動で繰り返すのではなく、正規表現の文字列をテストできます。

re=$'^[# \n]*$'
if [[ $string =~ $re ]]; then
    echo "string contains only #, space and newline"
fi

(これは標準のPOSIX機能ではなくfor (( .. ))${string:i:j}UbuntuのDashなどでは機能しません/bin/sh。)

おすすめ記事