主要是编写shell代码部分问题:
注:for i相当于for i in $* (取全部位置参数)下文存在不在赘述
4.对教材例题4.9 (P108)进行编辑,然后执行。
#!/bin/bash
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 4
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
这个题目主要是对执行的位置参数进行的一个操作,将位置参数从0到9进行输出同时也有shift命令,移动1位和移动4位的移动后的显示但是0号位置参数是不会发生改变的!
5.对教材例题4.19 (P132)进行编辑,然后执行。
#!/bin/bash
func()
{
echo "Let's begin now."
echo $a $b $c
echo $1 $2 $3
echo "The end."
}
a="Working directory"
b="is"
c=`pwd`
func Welcome You Byby
echo "Today is `date`"
这个主要是考察了shell程序设计的函数这个功能,在函数传参数的时候可以是在程序里面的参数可以直接调用例如:a,b,c这三个参数。也可以是在 调用这个函数的时候传入的三个参数如Welcome You Byby在这里面就是作为位置参数传进去的。
6.对习题4.8 (P141)进行编辑,然后执行。
#!/bin/bash
count=$#
cmd=echo
while [ $count -gt 0 ]
do
cmd="$cmd \$$count"
count=$(($count-1))
done
eval $cmd
注意:第5版Linux教程这本书里面的这个例子是错误的!!无法正常运行需要将while循环里面的count语句进行修改,修改为count=$(($count-1))。
这个题目主要是将参数进行了一个逆序的输出
$#是特殊Shell变量,指的是参数的个数。
cmd="$cmd \$$count" $cmd为echo,\$$count表示最末一个参数,整个语句表示输出最末一个参数
count=$(($count-1))表示参数数量减一
eval $cmd表示运行cmd中的命令
7.对习题4.9进行设计,然后调试、执行。编写一个shell脚本,它把第二个位置参数及以后的各参数指定的文件复制到第一个位置参数指定的目录当中。
dir=$1
shift
for i
do
cp $i $dir
done
首先利用位置参数将第一个位置参数的目录传给dir同时移动一位留下剩下的位置参数,再利用一个for循环以及cp命令将文件复制到指定的目录当中。
8.对习题4.11进行设计,然后调试、执行。
打印指定目录下的某些文件,由第一个参数指出文件所在目录,其余参数是要打印的文件名。
dir=$1
cd $dir
shift
for i
do
pr $i
done
这个问题就是也是同样的道理先利用位置参数得到目录然后通过cd命令先转移到所在的目录然后也是shift命令移动一位利用for循环进行一个遍历在遍历的过程中进行pr命令打印。
9.对习题4.13进行设计,然后调试、执行。利用数组的形式存放10个城市的名字,然后利用for循环把他们循环打印出来。
#!/bin/bash
declare -a city
city=(北京 上海 天津 深圳 石家庄 南京 杭州 苏州 拉萨 沈阳)
for i in {0..9}
do
echo ${city[$i]}
done
这个题目考察的就是一个数组的使用。主要就是定义一个数组(在这里我定义数组实际上是多啰嗦了一句,可以直接进行数组赋值因为shell是弱类型的可以直接进行)。对数组进行赋值赋值10个城市然后利用for循环我这里是利用的采用数组下标的方式来访问数组元素。最终可以得到输出。
10.对习题4.14进行设计,然后调试、执行。编写一个shell脚本求出斐波那契数列的前10项的总和
#!/bin/bash
sum=0
declare -a feibo
feibo=(0 0 0 0 0 0 0 0 0 0)
feibo[0]=1
feibo[1]=1
for i in {2..9}
do
feibo[$i]=$((feibo[$i-1]+feibo[$i-2]))
done
for j in {0..9}
do
sum=$(($sum+${feibo[$j]}))
echo ${feibo[$j]}
done
echo "sum=$sum"
这个是个很常规的问题,首先定义一个sum和还有10个数据的数组首先全部设置为0,然后将第一第二项设置为1并利用一个for循环对数组元素进行赋值。最终进行输出即可。关于斐波那契数列的问题有很多种解法可以见我之前的一篇文章斐波那契数列两种算法实现(循环,递归)_斐波那契数列循环算法_用编程写诗的博客-CSDN博客
拓展实验
1. Shell编程实现指定输入的加法,比如输入100,计算1+2+3+…+100的和。
#!/bin/bash
#1+2+3+4+.....n等于多少?
echo -n "input: "
read n
sum=0
i=1
while [ $i -le $n ]
do
sum=$(($sum+$i))
i=$(($i+1))
done
echo the value is:$sum
首先设置一个提示输出提示用户输入数据,然后只要i的值不小于n的值就进行sum相加并且i也相应的进行加1最终可以得到结果。
2.Shell编程判断指定文件夹下文件的数量。
#!/bin/bash
cd $1
filenum=0
for i in $( ls )
do
if [ -f $i ]
then filenum=$(($filenum+1))
fi
done
echo "The num of files is $filenum"
首先传入要进入文件夹然后cd $1即可进入。最开始设置文件数量为0然后利用ls命令让i从目录中的第一个文件到最后一个文件然后进行if判断只要是文件就让filenum进行加1最终输出即可。
3.Shell编程判断给定年份是否为闰年。
#!/bin/bash
echo "请输入年份"
read year
if [ $(($year%4)) -eq 0 -a $(($year%100)) -ne 0 -o $(($year%400)) -eq 0 ]
then
echo "$year是闰年!"
else
echo "$year不是闰年!"
fi
这个核心就是一个判断语句,进行输入一个年份然后进行判断,只要它是4的倍数并且不是100的倍数或者是400的倍数即可判断是闰年,这里-a相当于&&-o相当于||。
4. Shell编程实现9×9乘法表。
#!/bin/bash
for i in {1..9}
do
for j in {1..9}
do
if [ $j -le $i ];then
echo -n "$j"
echo -n x
echo -n "$i=$[i*j] "
fi
done
echo
done
这个程序也是很简单的也就是简单的循环嵌套而已,利用两个循环一个表示行数即被乘数一个表示乘数从1到行数这样相乘即可。我在这里多了一个echo -n x是因为我想让输出是1x1=1这样而不是1*1=1这样但是x咋shell程序设计里面是比较特殊的我不能把这三句话写成一句话只能拆开。如可以写成一句话欢迎指正。
5.Shell编程实现批量修改文件扩展名,比如将.txt文件修改为.doc文件。
#!/bin/bash
cd $1
for i in `ls *.$2`
do
mv $i ${i%.*}.$3
done
这就是单纯一个mv命令即可。先cd进入需要的文件夹,利用传入的参数第二个表示源文件扩展名,第三个表示修改为的文件扩展名。直接利用ls命令找到所有的第二个位置参数的文件扩展名然后转为第三个位置参数的文件扩展名。(%表示从右向左匹配删除位于%右侧通配符匹配的字符串,即i%.*就会将.也就是扩展名和.一起删除例如1.txt就会只剩下1)