码迷,mamicode.com
首页 > 系统相关 > 详细

shell脚本练习题

时间:2016-06-21 22:47:47      阅读:409      评论:0      收藏:0      [点我收藏+]

标签:练习题   shell   

  1. 求出数字1~100的累加和:

要求数字的累加,可以使用循环来完成,如下代码:

#!/bin/bash

sum=0
str=""
#for i in {1..100}
for ((i=1 ; i<=100 ; ++i))
do
    str+="${i}+"
    let sum+=i
done

echo "${str%+}=${sum}"

运行脚本:

技术分享


另外一种可以用递归的方式:

#!/bin/bash

read num 
sum=0
str=""
function sum_fun()
{
    num1=$1
    if [ ${num1} -le 1 ];then//当数值小于等于1的时候直接返回
        echo $num1
        return
    fi  

    let --num1
    tmp=$(sum_fun $num1)//递归调用
    let sum=$1+$tmp
    echo ${sum}
}
sum=$(sum_fun $num)
echo "${sum}"

使用$()命令替换符的时候,会执行括号里面的命令,因此也就会新创建一个进程来执行该命令,也就是变量都是在一个进程内部有效的,因此使用的时候需要注意;

运行程序:

技术分享


2. 进度条

使用shell脚本编写模拟进度条:

#!/bin/bash

str=""
arr=(‘-‘ ‘\‘ ‘|‘ ‘/‘)//定义数组模拟光标转动
for (( i=1; i<=100; ++i))
do
    let tmp=${i}%4
    str+="#"
    printf "[%-100s][${i}%%] ${arr[$tmp]} \r" "${str}"//只换行不会车
    sleep 0.1 
done
printf "\n"


运行程序:

技术分享

技术分享


3. 求出一个文件中数据的最大值、最小值和平均值,精度为2

文件中的数据值一行一个数据;

#!/bin/bash

sum=0
count=0
while read line//按行读取
do
    let ++count//计算数据个数
    [ $count -eq 1 ] && min=$line && max=$line//初始化最大值最小值,使其等于第一个数据
    let sum+=$line//计算数值和

    [ $line -gt $max ] && max=$line//如果数据大于最大值,更新最大值
    [ $line -lt $min ] && min=$line//如果数据小于最小值,更新最小值
done<file//输出重定向

echo "max: ${max}"
echo "min: ${min}"
printf "argv: "
echo "base=10;scale=2;${sum}/${count}" | bc

运行程序:

技术分享


4. 求第N个斐波那契数

求第N个斐波那契数需要知道第N-1和第N-2个斐波那契数

#!/bin/bash
//使用三个变量轮流使用,效率最高
read num
val1=0//定义前两个数字
val2=1
tmp=$val1
for (( i=0; i < $num; ++i))
do
    let tmp=$val1+$val2
    val1=$val2
    val2=$tmp
done
echo "$num: $tmp"


运行程序:

技术分享


使用递归仍然可以,只是效率要低:

#!/bin/bash

read num 

function fib()
{
    num1=$1
    if [ $1 -lt 3 ];then
        echo $num1
        return
    fi  

    let --num1
    val1=$(fib $num1)
    let --num1
    val2=$(fib $num1)
    let ret=$val1+$val2
    echo $ret
}

ret=$( fib $num )
echo "$num: $ret"


运行程序:

技术分享


5. 将一个文件中每一行的字符串进行转换,例如将“123abc456”转换为“456ABC123”

while read line
do
//使用cut工具进行字符串截取
    num1=$(echo ${line} | cut -c -3)//截取从左数第3个字符往左的所有字符
    num2=$(echo ${line} | cut -c 7-)//截取从左数第7个字符往右的所有字符
    str=$(echo ${line} | cut -c 4-6)//截取第4个字符到第6个字符之间的左右字符
//另一种字符串截取方式
#   num1=${line:0:3}
#   num2=${line:6:3}
#   str=${line:3:3}
    eval echo "${num2}${str}${num1} | tr [a-z] [A-Z]"//使用tr工具进行转换
done<file


运行程序:

技术分享



《完》

本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1791499

shell脚本练习题

标签:练习题   shell   

原文地址:http://2627lounuo.blog.51cto.com/10696599/1791499

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!