shell脚本编程

本文通过多个实例展示了Shell脚本在解决实际问题中的应用,包括计算一个月的天数、购买物品的最佳策略、计数问题、数组操作、递推问题以及斐波那契数列等。这些例子涵盖了条件判断、循环控制、数组处理和数学运算,展示了Shell脚本在日常计算和自动化任务中的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell 脚本编程

例题

例题1、一个月有多少天

#!/bin/bash

read year month

if [[ $month -eq 1 ]] ||  [[ $month -eq 3 ]] || [[ $month -eq 5 ]] || [[ $month -eq 7 ]] || [[ $month -eq 8 ]] || [[ $month -eq 10 ]] || [[ $month -eq 12 ]];then
    echo 31
elif [[ $month -eq 4 ]] || [[ $month -eq 6 ]] || [[ $month -eq 9 ]] || [[ $month -eq 11 ]];then 
    echo 30
elif [ $month -eq 2 ];then
        if [ "$((year % 4))" -eq 0 -a "$((year % 100))" -ne 0  ];then
            echo 29
        elif [ "$((year % 400))" -eq 0  ];then
            echo 29
        else
            echo 28
        fi
 fi

例题2

班级里的白板笔不够了,班主任交给班长路飞一个小任务:买尽量多的白板笔。

已知一支白板笔的价格是2元6角,而班主任给路飞的钱是元角。

请你帮助路飞用程序解决这个问题。

输入

输入的数据,在一行内,包括两个整数,依次表示和,。

输出

输出一个整数,表示路飞最多能买多少只白板笔。

样例输入

10 3

样例输出

3

数据规模与约定

时间限制:3 s

100% 的数据保证

#!/bin/bash

read a b

A=`expr $a \* 10` # 注意, A和=之间不能有空格
C=`expr $A + $b`  # `expr` 和=之间没有空格
B=`expr $C / 26` # $C / 26 之间要有空格
echo $B

例题3、计数问题

试计算在区间 到 的所有整数中,数字x ()共出现了多少次?

例如,在 1到11中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。

输入

2个整数, ,之间用一个空格隔开。

输出

1个整数,表示出现的次数。

样例输入

1

11 1

样例输出**

1

4

数据规模与约定

时间限制:3 s

对于 100%的数据,

#!/bin/bash

read num target
sum=0

for ((i = 1; i <= $num; i++)) 
do
    t=$i
    ans=0
    while [ $t -ne  0 ]
    do
        A=`expr $t % 10`
        if [[ $A -eq $target ]];then
        sum=`expr $sum + 1`
        fi
        t=`expr $t / 10`
    done
    
done
echo $sum

例题4、校门口的树

#!/bin/bash

read L num
arrtarget=(0)//定义一个数组
sum=0
for ((i = 1; i <= $num; i++)) 
do
  read left right
  for ((j = $left; j < $[ $right + 1 ]; j++)) # $[]直接进行整数运算
  do
    if [[ ${arrtarget[$j]} -eq 1 ]];then
        continue
    fi
    arrtarget[$j]=1
done
done

## 下面一个for循环可以去掉
for ((k = 0; k < $[ $L + 1 ]; k++))
do
    if [[ ${arrtarget[$k]} -eq 1 ]];then
        sum=$[ $sum + 1 ]
    fi
done
A=$[ $L - $sum ]
echo $((`expr $A + 1`))
# 注意,不要使用太多expr ,容易超时



###################################修改后
#!/bin/bash

read L num
arrtarget=(0)
sum=0
for ((i = 1; i <= $num; i++)) 
do
  read left right
  for ((j = $left; j < $[ $right + 1 ]; j++))
  do
    if [[ ${arrtarget[$j]} -eq 1 ]];then
        continue
    fi
    arrtarget[$j]=1
    sum=$[ $sum + 1 ]
done
done

A=$[ $L - $sum ]
echo $ [$A + 1 ]

例题5、插队(数组)

有n个人(每个人有一个唯一的编号,用1~之间的整数表示)在一个水龙头前排队准备接水,现在第个人有特殊情况,经过协商,大家允许他插队到第个位置。输出第个人插队后的排队情况。

输入

第一行1个正整数,表示有个人,

第二行包含个正整数,之间用一个空格隔开,表示排在队伍中的第1~n第个人的编号。

第三行包含1个正整数,表示第n个人插队的位置,

输出*

一行包含个正整数,之间用一个空格隔开,表示第个人插队后的排队情况。

样例输入

7
7 2 3 4 5 6 1
3

样例输出

7 2 1 3 4 5 6

数据规模与约定**

时间限制:3 s

100% 的数据保证 ,

#!/bin/bash

arr=(0)
read n
read -a arr #直接读入一行数据到数组中

temp=${arr[$[ $n - 1 ]]}
read target

for ((j = $[ $n - 1 ]; j >= $[ $target - 1 ]; j--)) 
do
    arr[$j]=${arr[$[ $j - 1 ]]}
done
arr[$[ $target - 1 ]]=$temp
for((i = 0; i <= $[ $n - 1 ] ; i++)) 
do 
    echo -n ${arr[$i]} # echo -n 表示不换行
    echo -n " "
done

例题6、走楼梯

一个楼梯有n 级,小苏同学从下往上走,一步可以跨一级,也可以跨两级。

问:他走到第 n级楼梯有多少种走法?

输入

一行一个整数 。

输出

一行个整数,之间用一个空格隔开,表示走到第1级、第2级、……第n级分别有多少种走法。

样例输入

2

样例输出

1 2

数据规模与约定

时间限制:3 s

100% 的数据保证

#!/bin/bash

declare -a arr#声明一个数组
read n
arr[1]=1 # 斐波那契数列
arr[2]=2


for ((i=3; i <= $n; i++))
do
    arr[$i]=$[${arr[$[$i - 1]]} + ${arr[$[$i - 2]]}]
done


for ((i = 1; i <= $n; i++)); do
    echo -n ${arr[$i]}" " #不换行输出带空格
done

例题7、比身高

有n个人排成一排,假设他们的身高均为正整数,请找出其中符合以下条件的人:

排在他前面且比他高的人数与排在他后面且比他高的人数相等。

输入

第一行为一个正整数,,表示有多少个人。

下面行,每行一个正整数,表示从前往后每个人的身高,假设第 个人的身高为。

输出

一行一个整数,表示满足这个条件的人数。

样例输入*

4
1
2
1
3

样例输出

2(第三第四个符合)

数据规模与约定

时间限制:3 s

100% 的数据保证 ,第 个人的身高为。

#!/bin/bash

declare -a arr
read n
sum=0

for ((i = 1; i <= $n; i++)); do
    read num
    arr[$i]=$num
done

for ((i=1; i <= $n; i++)); do
    t1=0
    t2=0
    for ((j=1; j < $i; j++));do
        if [[ ${arr[$j]} -gt ${arr[$i]} ]];then
            t1=$[ $t1 + 1 ]
        fi
    done
    for ((k=$[ $i + 1 ]; k <= $n; k++)); do
        if [[ ${arr[$k]} -gt ${arr[$i]} ]];then
            t2=$[ $t2 + 1 ]
        fi
    done
    if [[ $t1 -eq $t2 ]];then
        sum=$[ $sum + 1 ]
    fi
done
echo $sum

例题8、走楼梯(递推)

这一节我们需要讨论的是一个递推的问题。在海贼理工学院有一个路飞君,他在爬楼梯的时候从来都是要么上 2个台阶,要么上 3个台阶。由于爬楼梯实在太无聊了,路飞君就开始尝试每天采用不同的方式上楼梯。如果路飞君回家需要爬n 阶台阶,你能告诉路飞君,他爬楼梯回家有多少种不同的方式吗?

请注意,路飞君“先爬 2个台阶后爬 个台阶”和“先爬 3个台阶后爬 个台阶”是两种不同的回家方式。

输入

测评机会反复运行你的程序。每次程序运行时,你的程序仅需输入一个符合描述的整数 , 表示总共的台阶数( )。

输出

输出为一行,输出一个整数,表示路飞君有多少种上楼梯的方式。最后结果保证在 int范围 内。

样例输入1*

5

样例输出1**

2

样例输入2

40

样例输出2

31572
#这是cd的,自己修改一下呗
#include <stdio.h>

int main() {
    int n;
    int step[51];
    scanf("%d",&n);
    step[1] = 0;
    step[2] = step[3] = 1;
    for (int i = 4; i <=n; i++){
        step[i] = step[i-2] + step[i-3] ; }
    printf("%d",step[n]);
    return 0;
}


例题9、斐波那契数列

相信小伙伴们都学过斐波那契数列,它是这样的一个数列: 0 1 1 2 3 5 8 13 21 …

用 表示斐波那契数列的第n 项,则有: 。

输入一个数, 求出斐波那契数列第n项。

输入

输入一个整数 。

输出

输出的值。

样例输入1

3

样例输出1

2

数据规模与限定

时间限制:3 s

100% 的数据保证

#!/bin/bash

#斐波那契数列后一个数字永远是前 2 个数字之和
#如:0 1 1 2 3 5 8 13 ... ...

read n
list=(0 1)
for i in `seq 2 30`
do
     list[$i]=`expr ${list[-1]} + ${list[-2]}`
 done
echo ${list[$n]}
#echo ${list[$[ $n - 1 ]]}

写于2021-07-29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值