Shell编程—根据用户输入来输出符号正方形

这是我在学习Linux Shell编程的时候偶然遇到的一个小题目,想就其中的问题和大家分享讨论一下,题目是这样的:

脚本执行时接受2-10范围内的一个整数作为输入参数,在屏幕上用+号,@号和&号画出以给定参数为边长的正方形。例如:脚本运行时输入4并回车,则在屏幕上会绘制如下的正方形:

Shell编程—根据用户输入来输出符号正方形_第1张图片

其中2、3行的&之间有两个空格

弄明白这个逻辑之后,我用几分钟写出了它的C语言版本,代码如下

#include<stdio.h>
int main()
{
	int n,i,j;
	printf("input a number between 2 and 10\n");
	scanf("%d",&n);
	if(n==2)
		printf("@@\n@@");
	else
	{
		printf("@");
		for(i=0;i<n-2;i++)
		{
			printf("+");
		}
		printf("@\n");

		for(j=0;j<n-2;j++)
		{
			printf("&");
			for(i=0;i<n-2;i++)
			{
				printf(" ");
			}
			printf("&\n");
		}

		printf("@");
		for(i=0;i<n-2;i++)
		{
			printf("+");
		}
		printf("@\n");
		
	}
	return 0;
}
然而在写它的Shell版本时,我遇到了不少的麻烦,总结如下:

1.变量类型的麻烦

Shell是弱变量类型语言,这里我想要输入一个数字并将它作为数字来带入计算和比较等都涉及到类型的问题,想要系统能够帮你解释执行就必须按照它规定的写法来写,比如我要将读入的数减2之后与0相比较,就要用到Shell中算术运算的写法,如下:

read n
num=$((n-2)

2.字符串比较的麻烦

在这里我要进行的是将运算得到结果num与0进行比较,若等于0,则输出默认图案,若不等于0,再进行下一步的操作,比较的命令如下:
if test $num = 0
与其它编程语言不同的是,这个需要加test命令,而且判等符号不是双等于符号,当然这里你写双等于符号也不会出错

3.循环变量的麻烦

这是花了我最多时间解决的一个麻烦,一开始我是这样写的:
for((i=0;i<$num;i=i+1))
运行的时候系统就提示:
Syntax error : Bad for loop variable——从字面意思来看就是指循环变量错误,因为这个for语句同样也涉及到了我上面所说的变量算术运算的问题,所以我就想是不是要将运算放在$(())这个符号中进行的问题,于是我就按这个想法改了一下脚本,运行的时候同样报的也是这个错误,然后我就有点懵,不对啊,我明明按照格式在写了,为什么系统还是不认呢,没办法,百度,在我查看了网友的相同提示的各种错误解决方案之后,我确定了答案,原来是因为从ubuntu 6.10开始,ubuntu就将默认的bash shell改成了bash shell;其表现为默认链接到的/bin/bash/变成了/bin/dash/。如何解决这个问题呢,就要在终端运行一个命令:sudo dpkg-reconfigure dash 然后在弹出的选择框中选择no.这样操作之后,再按照我第一种写法执行,果然就没有报错了,那就证明这样写这个循环是正确的

4.输出换行和不换行的麻烦

在Shell中输出一般都是用的echo 语句,有的可以在echo中直接加\n表示换行,后来我发现在ubuntu中它是直接将\n这个字符输出了,然后同样网上一搜,方法就出来了,再经过了自己的数次实践,原来echo是默认换行的,要想它输出不换行,就必须使用-e参数以及\c相结合,也就是要在你不想换行的字符后面加一个\c告诉echo这个字符后面不用输出换行

以上就是我在编写这个脚本中的收获和体验,希望能让看到这边文章的人也有所收获,附上Shell完整代码如下:
#!/bin/bash
read n
num=$((n-2))

if test $num = 0
then
	echo -e "@@\n@@"
else 
	echo -e  "@\c"
	for((i=0;i<$num;i=i+1))
	do
		echo -e "+\c"
	done
	echo  "@"

	for((j=0;j<$num;j=j+1))
	do
		echo -e "&\c"
		for((i=0;i<$num;i=i+1))
		do
			echo -e " \c"
		done
		echo "&"
	done
	echo -e "@\c"
	for((i=0;i<$num;i=i+1))
	do
		echo -e "+\c"
	done
	echo -e "@\n"
fi


你可能感兴趣的:(linux,shell,shell,操作系统,ubuntu)