C高级day4(shell脚本)

一、Xmind整理:

二、上课笔记整理:

1.创建一个文件,给组用户可读权限,所属用户可写权限,其他用户可执行权限,使用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

2.终端输入年份,判断闰平年(四年一闰,百年不闰,四百年再闰) 

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

3.终端输入一个.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

4.终端输入一个.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

5.终端输入两个文件名,判断文件的时间戳哪一个更新 

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

6.终端输入学生成绩,判断等级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

 7.终端输入一个字符,判断是字母还是数字字符

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

8.求1-100的和,5050 

#!/bin/bash
read -p "please input a num:" num
i=1
sum=0
while [ $i -le $num ]
do
	sum=$((sum+i))
	i=$((i+1))
done

9.终端输入数组,使用while循环,实现数组中元素的求和 

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

10.终端输入行数,打印直角三角形 

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

 11.求100-1000内的水仙花数

#!/bin/bash
for i in {100..999}
do
    bai=$(($i/100))
    shi=$(($i/10%10))
    ge=$(($i%10))
    if test $(($[$bai**3] + $[$shi**3] + $[$ge**3])) -eq $i
    then 
        echo  $i
    fi
done

12.定义一个稀疏数组,求数组中元素的和

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

13.求家目录下目录文件和普通文件个数的和

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

14.select···in和case···in结合

#!/bin/bash 

#select```in和case ```in结合
#可以通过用户的不同选择执行不同的指令
select i in linux wins macos q Q
do
    case $i in
        linux)
            echo "打开的是Linux系统"
            ;;
        wins)
            echo "打开的是wins系统"
            ;;
        macos)
            echo "打开的是macos系统"
            ;;
        q)
            break
            ;;
        Q)
            exit
            ;;
        *)
            echo "选择错误"
    esac
done

echo hello world

15.终端输入一个游戏名,让用户选择是否下载,如果用户选择的是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

 16.辅助控制关键字

#!/bin/bash
for((i=1;i<3;i++))
do
    echo "进入第一层循环 i=$i*******************"
    echo 
    for j in `seq 1 1 2`
    do
        echo "进入第二层循环 j=$j------------------"
        echo 

        for k in {1..3}
        do
            echo "进入第三层循环 k=$k /"
            echo 

            if [ $k -eq 2 ]
            then
                echo "准备跳出循环"
                #break 3 
                continue 3  
            fi

            echo "退出第三层循环 k=$k/"
            echo 
        done
        echo "退出第二层循环 j=$j------------------"
        echo 
    done
    echo "退出第一层循环 i=$i*******************"
    echo 
done

 17.获取函数的返回值

#!/bin/bash
function fun()
{
    echo hello world
}

function add()
{
    echo $(($1+$2))
    echo $0
    a=258
    return $a   #返回值只能返回0-255之中的数
}
add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a

 18.没有返回值的函数怎么接收结果

#!/bin/bash
function fun()
{
    echo hello world
}

a=90
function add()
{
    #echo $(($1+$2))
    #echo $0
    a=258
    return $a   #返回值只能返回0-255之中的数
}
: 'add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a  #可以访问a的值,a是一个全局变量
'
#如何接受fun函数的结果
ret=`fun`
echo $ret   #代码只有1行输出,fun中的输出已经被命令置换符接收了
add 
echo $a     #258,因为a在函数内被改变了

 19.local在函数中的使用

#!/bin/bash
function fun()
{
    echo hello world
}

a=90
function add()
{
    #echo $(($1+$2))
    #echo $0
    a=258
    local b=80   #被定义成了一个局部变量
    echo $b
    unset b     #unset是可以清空局部变量
    echo $b

    return $a   #返回值只能返回0-255之中的数
}
: 'add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a  #可以访问a的值,a是一个全局变量
'
#如何接受fun函数的结果
ret=`fun`
echo $ret   #代码只有1行输出,fun中的输出已经被命令置换符接收了
add 
echo $a     #258,因为a在函数内被改变了
echo $b     #空行,因为b在函数内是一个loacl类型的变量,局部变量

三、课后作业:

1.实现一个对数组求和的函数,数组通过实参传递给函数

num=0
read -p "请输入一组数据:" -a arr
function add()
{
	for ((i=0; i<${#arr[*]}; i++))
	do 
		((num+=arr[i]))
	done
	return $num
}
add ${arr[*]}
echo $?

2.写一个函数,输出当前用户的uid和gid,并使用变量接收结果

function fun()
{
	echo "uid:"`id -u`
	echo "gid:"`id -g`
	uid=`id -u`
	gid=`id -g`
}
fun
echo $uid
echo $gid
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值