まず、以下に私が作成したコードを残しておきますが、以前に経験した問題について申し上げたいと思います。
問題1:文字を入力してスペースを残した後に文字を再入力すると、「パラメータが多すぎます」というエラーが発生します。この問題をどのように解決できますか? 「たとえば;」何でも書いてください: "ab cd この場所に問題があります。
質問2:「私が書いたテキストに対応する文字を並べて印刷するにはどうすればよいですか?」
私を助けることができる人に感謝します。
write_exs_from_user() {
read -p "Write Anything: " str
for (( i = 0; i < ${#str}; ++i ));
do
if [ ${str:$i:1} = "a" -o ${str:$i:1} = "A" ]
then
echo "
*
* *
* * *
* *
* *
"
elif [ ${str:$i:1} = "b" -o ${str:$i:1} = "B" ]
then
echo "
* * * *
* *
* * * *
* *
* * * *
"
elif [ ${str:$i:1} = "c" -o ${str:$i:1} = "C" ]
then
echo "
* * * * *
*
*
*
* * * * *
"
elif [ ${str:$i:1} = "d" -o ${str:$i:1} = "D" ]
then
echo "
* * * *
* *
* *
* *
* * * *
"
elif [ ${str:$i:1} = "e" -o ${str:$i:1} = "E" ]
then
echo "
* * * * *
*
* * * * *
*
* * * * *
"
elif [ ${str:$i:1} = "f" -o ${str:$i:1} = "F" ]
then
echo "
* * * * *
*
* * * * *
*
*
"
elif [ ${str:$i:1} = "g" -o ${str:$i:1} = "G" ]
then
echo "
* * * *
* *
*
* * * *
* *
* * * * *
"
elif [ ${str:$i:1} = "h" -o ${str:$i:1} = "H" ]
then
echo "
* *
* *
* * * *
* *
* *
"
elif [ ${str:$i:1} = "i" -o ${str:$i:1} = "I" ]
then
echo "
*
* *
*
* *
* *
* *
* *
"
elif [ ${str:$i:1} = "j" -o ${str:$i:1} = "J" ]
then
echo "
*
*
*
*
* *
* * *
"
elif [ ${str:$i:1} = "k" -o ${str:$i:1} = "K" ]
then
echo "
* *
* *
* *
* *
* *
"
elif [ ${str:$i:1} = "l" -o ${str:$i:1} = "L" ]
then
echo "
*
*
*
*
*
* * * * *
"
elif [ ${str:$i:1} = "m" -o ${str:$i:1} = "M" ]
then
echo "
* *
* * * *
* * * *
* * *
* *
"
elif [ ${str:$i:1} = "n" -o ${str:$i:1} = "N" ]
then
echo "
* *
* * *
* * *
* * *
* *
"
elif [ ${str:$i:1} = "o" -o ${str:$i:1} = "O" ]
then
echo "
* * *
* *
* *
* *
* *
* *
* *
* * *
"
elif [ ${str:$i:1} = "p" -o ${str:$i:1} = "P" ]
then
echo "
* * * * *
* *
* * * * *
*
*
"
elif [ ${str:$i:1} = "q" -o ${str:$i:1} = "Q" ]
then
echo "
* * *
* *
* *
* *
* *
* * *
* *
* * * **
"
elif [ ${str:$i:1} = "r" -o ${str:$i:1} = "R" ]
then
echo "
* * * *
* *
* *
* ** *
* *
* *
* *
"
elif [ ${str:$i:1} = "s" -o ${str:$i:1} = "S" ]
then
echo "
* * * *
* *
*
* * * *
*
* *
* * *
"
elif [ ${str:$i:1} = "t" -o ${str:$i:1} = "T" ]
then
echo "
* * * * *
*
*
*
*
"
elif [ ${str:$i:1} = "u" -o ${str:$i:1} = "U" ]
then
echo "
* *
* *
* *
* *
* * * * *
"
elif [ ${str:$i:1} = "V" -o ${str:$i:1} = "v" ]
then
echo "
* *
* *
* *
* *
*
"
elif [ ${str:$i:1} = "w" -o ${str:$i:1} = "W" ]
then
echo "
* *
* *
* * *
* * * *
* *
"
elif [ ${str:$i:1} = "x" -o ${str:$i:1} = "X" ]
then
echo "
* *
* *
*
* *
* *
"
elif [ ${str:$i:1} = "y" -o ${str:$i:1} = "Y" ]
then
echo "
* *
* *
* * * *
*
* * * *
"
elif [ ${str:$i:1} = "z" -o ${str:$i:1} = "Z" ]
then
echo "
* * * * *
*
*
*
*
* * * * *
"
else
echo "Please Write String !"
fi
done
}
write_exs_from_user
答え1
UnixとLinuxのスタック交換へようこそ!
最初の質問
最初の質問の場合、問題はbashが[
間にスペースがあるかどうかを確認できないことです=
。 Bashは、すべてのコマンド呼び出し(これは別のコマンドであることに注意[
してください)を空白で囲まれた一連の引数(たとえば、引数[ a = A ]
リスト[
、、、および)として評価します。 bashは文字列を評価し、インポート後に文字列がコマンドに書き込まれたかのようにコマンドを評価します。たとえば、where is a(space)asを読みます。他の空間と区別される空間がないので無視される。直観とは対照的に、引数が空白のセットであっても、 bash にその内容を引数として扱うように二重引用符 ( ) で囲むことができます。したがって、解決策はこれを二重引用符で囲むことです。これは、bashがこれを引数リスト、、、およびとして読むことを意味します。これは、コマンドが左のオペランドが空白であることを正しく認識することを意味します。a
=
A
]
${str:$i:1}
[ $x = "a" ]
x
[ = "a" ]
$x
$x
"$x"
${str:$1:1}
[
=
"a"
]
[
興味深いことに、[
ここでは誤ったエラーが発生する可能性があるため、これをエクスポートする必要がありますunary operator expected
。
二重引用符のしくみの詳細については、以下を確認してください。この問題。
2番目の質問
2番目の質問については、おそらくこのタイプの問題を処理する最善の方法は、forループの前に期待される出力の各行の変数を作成することです。その後、echo
ASCII文字の各行に文字のASCIIアート(たとえば)を使用する代わりに、その行変数に関連付けることができますline1="$line1 * * * * *"
。その後、ループ後に各行でprintfを使用できますprintf '%s' "$line1"
。
今後は、1つの投稿に2つの質問をするのではなく、各質問に対して2つの異なる投稿を作成する必要があることに注意してください。