C高级 脚本相关练习

练习1:第一个shell脚本

#!/bin/bash
#   #!---->shebang 
# 指明脚本运行使用的shell解析器


#这是一行注释
echo "第一个shell脚本"

练习2:定义一个数组,使用外部参数给数组赋值,通过数组求外部参数的个数

  1. 定义一个数组,使用外部参数给数组赋值,通过数组求外部参数的个数
  2. 把家目录的下的所有文件名放到数组中,并记录家目录下文件的个数
#!/bin/bash
arr=($*)    #把所有的外部参数赋值给数组arr
echo ${#arr[*]}


arr2=(`ls ~`)   #把家目录的所有文件名赋值给数组arr1
echo ${#arr2[*]}
echo ${arr2[@]}

练习3:尝试把read除了-a以外的参数结合起来使用

#!/bin/bash
#read -p "请输入一个变量"  var
#read -n 3 var
#read -t 3 var
#read -a arr
read -sp "请输入一个变量" -n 3 -t 4 var
#echo ${#arr[*]}
echo $var

练习4:终端输入两个三位数,将其中一个自增,把两个变量赋值给第二个变量相加并输出

#!/bin/bash
read -p "请输入两个变量" var1 var2   #如果同一行获取两个变量,变量中间放空格
((var1++))   #自增
((var2=var1+var2))
echo $var1
echo $var2
((var1=var1**3))     #对var1进行幂运算
echo $var1

练习5:求root用户的uid和ubuntu/linux用户gid相加的结果,比较这两个数的大小关系

#!/bin/bash
num1=`id -u root`
num2=`id -g`
echo $((num1+num2))
#比较num1和num2的大小关系
echo $((num1

练习6:计算当前目录下文件个数和家目录下文件个数的总和、计算家目录下.c和.sh文件的和

#!/bin/bash
arr=(`ls`)
arr1=(`ls ~`)
brr=(`ls` `ls ~`)  #把两个路径下的文件,放到同一个数组中 
crr=(${arr[*]} ${arr1[*]})   #先把两个路径下的文件分别存在不同数组中,再拼接两个数组
num1=${#arr[*]}
num2=${#arr1[*]}
echo $[num1+num2]
echo ${#brr[*]}
echo ${#crr[*]}


arr3=(`ls ~/*.c`)
arr4=(`ls ~/*.sh`)
#对前两行的数组计数
num3=${#arr3[*]}
num4=${#arr4[*]}
echo $[num3+num4]

练习7:终端读入两个数据,使用expr比较大小关系、

计算/etc/group中,第20行组用户gid和第10行组用户gid的和

#!/bin/bash
read -p "请输入两个变量" var1 var2
expr $var1 \>= $var2

#获取/etc/group中第20行用户的gid
num1=`head -20 /etc/group | tail -1 | cut -d : -f 3`
#获取/etc/group中第10行用户的gid
num2=$(head -10 /etc/group | tail -1 | cut -d : -f 3)
expr $num1 + $num2

练习8:终端输入网址,如:www.hqyj.com,要求:接触网址每个部分,并放入数组中,不能使用cut,使用expr解决

#!/bin/bash
read -p "请输入一个网址" net
len=`expr length $net`    #网址的长度
#找第一个.的位置
pos1=`expr index $net .`
#截取第一个.前面的所有子串
arr[0]=`expr substr $net 1 $((pos1-1))`

#为了找第二个.需要把后面的所有子串都截取出来
str2=`expr substr $net $((pos1+1))  $len`

#找到第二个.的位置
pos2=`expr index $str2 .`
arr[1]=`expr substr $str2 1 $((pos2-1))`

arr[2]=`expr substr $str2 $((pos2+1)) $len`
echo ${arr[*]}

练习9:创建一个文件,给组用户可读权限,所属用户可写权限,其他用户可执行权限,使用if判断文件有哪些权限

#!/bin/bash
touch 1
chmod 241 1
if [ -r 1 ]
then
    echo "文件1有可读权限"
fi
if [ -w 1 ]
then
    echo "文件1有可写权限"
fi
if [ -x 1 ]
then
    echo "文件1有可可执行权限"
fi

练习10:终端输入年份,判断闰平年(四年一闰,百年不闰,四百年再闰)

#!/bin/bash
read -p "请输入一个年份" year

#对年份的判断
#year对4\100和400取余都是算术运算,需要借助于(())\$[]\let\expr
#test指令内不能使用&&和||进行运算,test提供了-a进行逻辑与,-o进行逻辑或
if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]
#if [ $((year%4)) -eq 0 ] && [ $((year%100)) -ne 0 ]  || [ $((year%400)) -eq 0 ]
#if [ $((year%4==0&&year%100!=0||year%400==0)) -eq 1 ]
then
    echo "$year是一个闰年"
else
    echo "$year不是一个闰年"
fi

练习11:终端输入一个.sh文件名,判断文件是否存在,如果存在判断文件是否有可执行权限,如果有执行脚本,如果没有添加可执行权限,如果文件不存在,创建脚本文件

#!/bin/bash
read -p "请输入.sh文件" var
if [ -e "$var" ]
then
    echo "文件存在"
     if [ -x "$var" ]
     then
      bash $var
else 
         chmod 777 $var
fi
else
    echo"文件不存在"
    touch $var
fi

练习12:终端输入一个.c文件名,判断文件中是否有内容,如果有内容编译该文件,如果没有内容删除文件

#!/bin/bash
read -p "请输入一个.c文件" filename
if [ -s $filename ]   #判断文件是否存在且有内容
then
    gcc $filename
else
    if [ -e $filename ]   #如果文件存在
    then
        rm $filename
        echo "$filename已删除"
    else 
        echo "$filename不存在"
    fi
fi

练习13:终端输入两个文件名,判断文件的时间戳哪一个更新

#!/bin/bash
read -p "请输入两个文件名"  filename1 filename2
if [ $filename1 -nt $filename2 ]
    #如果条件成立,-nt参数表示前面文件的时间戳更新
then
    echo "$filename1更新"
else
    echo "$filename2更新"
fi

练习14:终端输入学生成绩,判断等级100-90A,90-80B,80-70C,70-60D,其他不及格

#!/bin/bash
read -p "请输入成绩" score
ret=$((score/10))
: 'case $score in
    1??|9?)
        echo "A"
        ;;
    8?)
        echo "B"
        ;;
    7?)
        echo "C"
        ;;
    6?)
        echo "D"
        ;;
    *)
        echo "不及格"
esac'

case $ret in
    10|9)
        echo "A"
        ;;
    8)
        echo B
        ;;
    7)
        echo C
        ;;
    6)
        echo D
        ;;
    *)
        echo "不及格"
esac

练习15:终端输入一个字符,判断是字母还是数字字符

read -p "请输入一个字符" var
case $var in
    [0-9])
        echo "是一个数字"
        ;;
    [A-Z]|[a-z])
        echo "是一个字母"
        ;;
    *)
        echo 不是数字也不是字母
esac    

练习16:求1-100的和,5050

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ] # le 第一个数小于等于第二个数
do
    ((sum += $i))

    ((i++))
done
echo $sum

练习17:终端输入数组,使用while循环,实现数组中元素的求和

#!/bin/bash
read -p "请输入数组" -a arr
i=0
sum=0
while [ $i -lt ${#arr[*]} ]
do
    ((sum += ${arr[i]}))
    ((i++))
done
echo $sum                           

练习18:终端输入行数,打印直角三角形

#!/bin/bash
read -p "请输入行数" line
i=1
j=1
while [ $i -le $line ]
do
    j=1    #每一次进入内层循环前j都从1开始
    while [ $j -le $i ]
    do
        echo -n "*"
        ((j++))
    done
    echo ""   #每行输出结束需要换行
    ((i++))
done

练习19:求100-1000内的水仙花数

#!/bin/bash
#for i in `seq 100 999`
for i in {100..999}   #{1..3}展开1-3内的每一个数
do
    x=$((i%10))  #求个位
    y=$((i/10%10)) #求十位
    z=$((i/100)) #求百位
    if [ $((x**3+y**3+z**3)) -eq $i ]
    then
        echo $i是一个水仙花数
    fi
done

练习20:终端输入行数,打印直角三角形

#!/bin/bash
read -p "请输入行数" line
i=1
j=1
while [ $i -le $line ]
do
    j=1
    while [ $j -le $i ]
    do
        echo -n "*"
        ((j++))
    done
    echo -e "\n"
    ((i++))
done                       

练习21:定义一个稀疏数组,求数组中元素的和

arr=([0]=12 [5]=78 [7]=23)
sum=0
for j in ${arr[*]}
do
    ((sum+=j))
done
echo $sum

练习22:求家目录下目录文件和普通文件个数的和

#!/bin/bash
fnum=0
dnum=0
for i in `ls ~`
do
    if [ -d ~/$i ]
    then
        ((dnum++))
    fi
    if [ -f ~/$i ]
    then
        ((fnum++))
    fi
done
echo $((dnum+fnum))
  
#!/bin/bash
#var1和var2都是软连接文件
var1=2
var2=test1
#对软连接文件判断是,实际是在判断源文件
if [ -f $var1 ]
then
    echo "$var1是一个普通文件"
fi

if [ -d  $var2 ]
then
    echo "$var2是一个目录文件"
fi   

练习23:终端输入一个游戏名,让用户选择是否下载,如果用户选择的是Y|YES|y|yes就下载该游戏,N|NO|n|no就不下载该游戏

#!/bin/bash
read -p "请输入游戏名" gname

select i in Y YES y yes N NO n NO
do
    case $i in 
        Y|YES|y|yes)
            echo "下载$gname"
            ;;
        N|NO|n|no)
            echo "不下载$gname"
            exit
    esac
done

你可能感兴趣的:(C高级,linux,ubuntu,开发语言)