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}"

运行脚本:

wKioL1dpLmqws9nsAAAbQ0g7cUQ310.png


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

#!/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}"

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

运行程序:

wKiom1dpL2TDsdTRAAAOAz2doQg510.png


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"


运行程序:

wKioL1dpMCOgKMMxAAAJrNtGHEA737.png

wKiom1dpMCTx30_UAAAPspzJvRw539.png


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

运行程序:

wKiom1dpMXfxvGetAAAezW2bZt4973.png


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"


运行程序:

wKiom1dpMuuQ8DLhAAAwOY0eKJs526.png


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

#!/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"


运行程序:

wKioL1dpM7fRCGctAAAmGG6j8s0301.png


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


运行程序:

wKiom1dpNNDi2ZZEAAAqHISykgE818.png



《完》