首先,我将在下面留下我写的代码,但我想告诉你我之前遇到的一个问题。
问题 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 Stack Exchange!
第一个问题
对于你的第一个问题,问题是 bash 无法确定[
和之间是否有空格=
。 Bash 将任何命令调用(请注意,这只是[
另一个命令)评估为一组由任意数量的空格包围的参数,例如,[ a = A ]
评估为参数[
、a
、=
和的列表。 bash 计算并获取字符串后,它会计算命令,就像将该字符串写入命令一样,例如,它将读取, where is a (space) as 。由于没有任何东西可以将变成的空间与任何其他空间区分开来,因此它会被忽略。与直觉相反,您可以用双引号 ( ) 括起来,告诉 bash 将其内容视为参数,即使该参数是一组空格。因此,解决方案是用双引号括起来,这意味着 bash 会将其读取为参数、、、和的列表,这意味着该命令将正确识别左操作数是空格。A
]
${str:$i:1}
[ $x = "a" ]
x
[ = "a" ]
$x
$x
"$x"
${str:$1:1}
[
=
"a"
]
[
有趣的是,[
这里可能会发出错误的错误,它应该发出unary operator expected
.
有关双引号如何工作的更多信息,请查看这个问题。
第二个问题
对于第二个问题,处理此类问题的最佳方法可能是在 for 循环之前为每一行预期输出创建一个变量。然后echo
,对于 ASCII 字符的每一行,您可以连接到相应的行变量,而不是使用字符的 ASCII art,例如line1="$line1 * * * * *"
.然后,在循环之后,您可以在每一行上使用 printf,例如printf '%s' "$line1"
.
请注意,将来您不应在一篇帖子中提出两个问题,而应为每个问题创建两个不同的帖子。