一些bash脚本练习

#!/bin/bash

read -p "输入阶数" step
for((i = 0;i<=$step;i++))
do
    for ((j = 0;j<i;j++))
    do
        echo -n "*"
    done
    echo #换行
done

#求100-1000内的水仙花数
echo "100-1000之间的水仙花数有:"
for ((num=100; num<1000; num++));
do
    # 获取百十个位
    bai=$((num / 100))
    shi=$(((num / 10) % 10))
    one=$((num % 10))
    sum=$((bai**3 + shi**3 + one**3))
    # 判断立方和是否等于原数
    if [ $sum -eq $num ]; then
        echo $num
    fi
done

#!/bin/bash

# 初始化计数器
file_count=0
dir_count=0
c_file_count=0

# 遍历家目录下的所有文件和目录
#2.统计家目录下.c文件的个数
for entry in ~/*; do
    if [ -f "$entry" ]; then
        ((file_count++))
        if [[ $entry == *.c ]]; then
            ((c_file_count++))
        fi
    elif [ -d "$entry" ]; then
        ((dir_count++))
    fi
done
# 输出结果
echo "普通文件数量: $file_count"
echo ".c 文件数量: $c_file_count"
echo "目录数量: $dir_count"
#!/bin/bash
read -p "请输入一个年份" -n 4 year

if ((year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
then
echo " $year 是闰年"
else
echo " $year 是平年"
fi
#!/bin/bash
#创建一个软连接文件
ln -s link.txt linkfile
if [ -L linkfile ] ;then 
echo "是一个软链接文件"
else
echo "不是一个软链接文件"
fi
#检查可执行权限
if [ -x link.txt ] ;then 
echo "有可执行权限"
else
echo "无可执行权限"
fi
#检测文件内容
if [ -e linkfile ];then 
echo "文件有内容"
else 
echo "文件为空"
fi
#!/bin/bash
read -p "请输入分数" score
case $score in
    9?,100)
        echo " A"
    ;;
    8?)
        echo "B"
    ;;
    7?)
        echo "C"
    ;;
    6?)
        echo "D"
    ;;
    *)
        echo "E"
    ;;
esac

read -p "请输入字母" letter
case $letter in
    [[:lower:]])
        echo "是小写字母"
    ;;
    [[:upper:]])
        echo "是大写字母"
    ;;
    *)
        echo "输入错误"
esac
#!/bin/bash
#求1-100的和
i=0
res=0
while [ $i -le 100 ]
do
    res=$[ res + i ]
    i=$[ i + 1 ]
done
echo "1加到100=$res"

#终端输入数组,求数组中元素的和
echo "输入数组"
read -a arr    
len=${#arr[*]}  # 数组长度
i=0    # 数组下标
sum=0  # 数组元素和
while [ $i -lt $len ]
do
    ((sum+=${arr[i]}))
    ((i++))
done
echo "数组和为: $sum"

#终端输入行数,打印直角三角形
read -p "请输入行数" line
i=1 
while [ $i -le $line ]
do
    j=1
    while [ $j -le $i ]
    do
        echo -n "*"
        ((j++))
    done
    echo
    ((i++))
done
#!/bin/bash

# 定义一个函数来计算稀疏数组的和
sum_sparse_array() {
    # 获取传递的数组名称
    local -n array_ref=$1  # 使用 -n 进行间接引用
    sum=0
    # 遍历传入的数组
    for index in "${!array_ref[@]}"; do
        ((sum+=array_ref[$index]))
    done
    echo $sum
}

# 从终端读取稀疏数组
echo "请输入稀疏数组,格式为 '[key1]=value1 [key2]=value2 ...':"
read  input_arr
# 解析输入并存储到关联数组中
#declare -A arr
echo "原始输入: $input_arr"  # 调试信息
# ~:用于模式匹配运算符。
# \:用于转义特殊字符。
# []:匹配方括号。
# ():创建捕获组。
# +:表示前面的字符或字符集可以出现一次或多次。
while [[ $input_arr =~ \[([0-9]+)\]=([0-9]+) ]]; do
    key=${BASH_REMATCH[1]}
    value=${BASH_REMATCH[2]}
    arr[$key]=$value
    
    # 移除已解析的部分
    # s/\[$key\]=$value//:
    # s/:表示替换操作。
    # /\[$key\]=$value/:匹配 [key]=value 形式的字符串。这里使用了反斜杠 \ 转义 [ 和 ]。
    # //:将匹配到的部分替换为空字符串,即删除这部分内容。
    input_arr=$(echo "$input_arr" | sed "s/\[$key\]=$value//; s/^ *//; s/ *$//")
    echo "解析出: [$key]=$value, 剩余输入: $input_arr"  # 调试信息
    # 如果输入为空,跳出循环
    if [[ -z $input_arr ]]; then
        break
    fi
done

# 检查是否有未解析的输入
if [[ -n $input_arr ]]; then
    echo "无效的输入格式: $input_arr"
    exit 1
fi

# 调用函数并传递数组引用
result=$(sum_sparse_array arr)
echo "稀疏数组的和为: $result"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值