文字列にスペースとハッシュ文字( "#")のみが含まれていることを確認するこのコードがあります。そうであれば「はい」をエコーし、そうでなければ「いいえ」をエコーします。
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"
。しかし、これはバックスラッシュが特別に扱われるからですecho
。printf
これは、バックスラッシュエスケープが常に(二重引用符で囲まれた)文字列で特別に扱われる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
。)