Linux老师布置的练习题

练习1:

  • 在自己的用户主目录下新建两个子目录subdir1 subdir2
  • 将/home/wmn/passwd文件拷贝到subdir1, 拷贝/home/wmn/group到subdir2
  • 将subdir2重命名为subdir
  • 对subdir1进行打包并且压缩成xz格式
  • 将打包后的xz格式文件拷贝到subdir目录下
  • 解压subdir目录下的压缩格式文件
  • 查看subdir目录下所有的文件
#在自己的用户主目录下新建两个子目录subdir1 subdir2
mkdir subdir1 subdir2

#将/home/wmn/passwd文件拷贝到subdir1, 拷贝/home/wmn/group到subdir2
cp subdir1 /home/wmn/passwd
cp subdir2 /home/wmn/group

#将subdir2重命名为subdir
mv subdir2 subdir

#对subdir1进行打包并且压缩成xz格式
tar -cf subdir1.tar subdir1
xz -z subdir1.tar

#将打包后的xz格式文件拷贝到subdir目录下
cp subdir1.tar.xz l /home/wmn/subdir

#解压subdir目录下的压缩格式文件
xz -d subdir1.tar.xz

#查看subdir目录下所有的文件
cd subdir
ls

练习2

  • 定义一个变量VAR1,用来保存PATH环境变量内容
  • 定义一个变量VAR2,用来保存HOME环境变量内容
  • 完成VAR1和VAR2这两个变量交换,然后输出这个变量的值
VAR1=$PATH
VAR2=$HOME
T=$VAR1
VAR=$VAR2
VAR1=$T
echo $VAR1 $VAR2

练习3

  • 将用户输入的第一个单词赋值给var1,第二个单词赋值给var2,剩下的单词赋值给var3
  • 完成var1和var2这两个变量交换,然后输出这三个变量的值
read  var1  var2  var3
t=$var1
var1=$var2
var2=$t
echo $var1 $var2 $var3 

练习4

  • 通过输入一个(已经存在的)用户名来寻找用户在/etc/passwd中的行号,并输出这一行对应/etc/passwd文件中用户信息并按照以下格式输出打印
  • Line number is: 26
  • Userinfo is as follows: NAME: UID: GID
echo -n "input username:"
read username #获取用户输入的用户名

#获取行号
line=`cat /etc/passwd | cut -d ":" -f 1 | grep -n "^$username$" | cut -d ":" -f 1` 
echo "The line number is:$line"

#获取用户名+gid+uid
user_info=`head -$line /etc/passwd | tail -1 | cut -d ":" -f 1,3,4`
echo "Userinfo is as follows: $user_info"

技术总结:

  • Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入(内心os:学了两个月linux我居然现在才知道嘤嘤嘤)
  • cat /etc/passwd     获取到/etc/passwd里面全部的内容
  • cut是一个选取命令,就是将一段数据经过分析,取出我们想要的东东
  • cut 的参数 -d :自定义分隔符; -f  :与-d一起使用,指定显示哪个区域。
  • cut -d ":" -f 1    意思就是以自定义分隔符:分割,分割后的第一个列的内容
  • grep -n "^$username$"    就是为了找到满足条件的行,-n会显示其行数,这一行的内容要包含username
  • "^$username$"   是一个正则表达式,^表示匹配首字符,所以满足要求就需要以username变量值开头
  • cut -d ":" -f 1`    再次出现,不赘述啦,就是为了获得行号~
  • head -$line /etc/passwd    在指定文件下,获得前某行的内容
  • tail -1    获取最后一行的内容
  • cut -d ":" -f 1,3,4`     以:为分隔符切切切,获取第一1,3,4列的内容

练习5

  • 输入一个成绩,用if-else语句判断成绩的等级
  • [80-100] A
  • [60-80)  B
  • [0-60)   C
  • 如果成绩非法不是[0-100],则提示用户输入的成绩是非法的成绩
echo -n "Input a  score : "
read score
if [ $score -lt 0 -o $score -gt 100 ]
then
	echo "Invalid score:$score"
else
	if [ $score -ge 80 -a $score -le 100 ]
	then
		echo "A"
	elif [ $score -ge 60 -a $score -lt 80 ]
	then
		echo "B"
	else
		echo "C"
	fi
fi

练习6

  • 输入一个成绩,用case语句判断成绩的等级 (思想:将成绩/10)
  • [80-100] A   8,9,10
  • [60-80 ) B   6,7
  • [0-60  ) C   0,1,2,3,4,5
  • 如果成绩非法不是[0-100],则提示用户输入的成绩是非法的成绩
echo -n "input a score: "
read score
if [ $score -lt 0 -o $score -gt 100 ]
then
        echo "invalid score:$score!"
else
        score=$((score/10))
fi


case $score in
        8|9|10)
                echo "A"
                ;;
        6|7)
                echo "B"
                ;;
        0|1|2|3|4|5)
                echo "C"
                ;;
esac

练习6

  • 输入一个路径,并判断该路径是否合法(是否存在该路径)
  • 如果合法,则输出该路径下的普通文件以及其它文件的个数。
echo -n "input a pathname:"
read pathname
if [ ! -d $pathname ]
then
        echo "Invalid path!"
        exit
fi

flist=`ls $pathname`
echo "flistlist: $flist"

var1=0  #记录普通文件个数
var2=0  #记录其他文件个数

cd $pathnameecho -n "input a pathname:"
read pathname
if [ ! -d $pathname ]
then
        echo "Invalid path!"
        exit
fi

flist=`ls $pathname`
echo "flistlist: $flist"

var1=0  #记录普通文件个数
var2=0  #记录其他文件个数

cd $pathname
for file in $flist
do
        if [ -f $file ]
        then
                echo "i'm in"
                ((var1++))
        else
                ((var2++))
        fi
done

echo "filenum:$var1   otherfilenum:$var2"
for file in $flist
do
        if [ -f $file ]
        then
                echo "i'm in"
                ((var1++))
        else
                ((var2++))
        fi
done

echo "filenum:$var1   otherfilenum:$var2"

练习7

  • 设计一个函数,通过传递的用户名来寻找用户在/etc/passwd中的行号(存在:返回行号,不存在:返回0) (提示:如果行号为空字符串,则表明未找到该用户)
  • 设计一个函数,通过传递的行号,输出这一行对应/etc/passwd文件中用户信息如下  The user: NAME:UID:GID
  • 循环读取用户输入的用户名,然后分别调用设计的函数,输出用户的信息,如果用户不存在,则告诉输入者这个用户在系统中不存在,如果输入的是"quit",则结束。
function check_username(){   #输入用户名,如果用户存在,返回其行号,否则返回0
        username=$1    #获取用户名
        line=`grep -n ^$username /etc/passwd | cut -d : -f 1`   #获取行号
        if [ -z $line ]
        then
                return 0
        else
                return $line
        fi
}

function get_userinfo(){    #根据行号获得用户信息
        line=$1
        info=`head -$line /etc/passwd | tail -1 | cut -d : -f 1,3,4`   #方法1
        #info=`sed -n ${line}"p" /etc/passwd | cut -d : -f 1,3,4`   #方法2

        echo $info
}

while true   #不quit就一直循环
do
        echo -n "Input a username:"  
        read username   #获取用户的输入

        if [ "$username" = "quit" ]   #quit了就退出
        then
                break
        fi

        check_username "$username"    
        line=$?   #获取返回的行号

        if [ $line -eq 0 ]
        then
                echo "$username is not existed!!"
                continue
        fi

        info=`get_userinfo $line`
        echo "the user is in line: $line"
        echo "the userinfo is $info"
done

技术总结:

  • if - then - fi 要配套使用!!经常忘了then,这样要不得啊!!
  • while - do - done 也要配套使用!!经常忘了do - done,不可以!!
  • if 的条件是放在[ ]里面,且中括号左右留一个空格,细心细心!!
  • 判断一个变量是不是为空可以用: if [ -z $var ]
  • 还要再熟悉一下两种调用函数的方法哦!!
  • break和continue的用法和其他编程语言一样,灵活运用
  • get了一种字符串拼接的方法,例如:${value1}"=",就实现了变量value1和=的拼接~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值