shell练习题
  1. 使用echo $SHELL命令可以查看您的 shell 是否满足要求。
  2. 在 /tmp 下新建一个名为 missing 的文件夹。
  3. 用 man 查看程序 touch 的使用手册。
  4. 用 touch 在 missing 文件夹中新建一个叫 semester 的文件。
  5. 将以下内容一行一行地写入 semester 文件:
    #!/bin/sh
    curl --head --silent https://missing.csail.mit.edu
    第一行可能有点棘手, # 在Bash中表示注释,而 ! 即使被双引号(")包裹也具有特殊的含义。 单引号(’)则不一样,此处利用这一点解决输入问题。
  6. 尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。
  7. 查看 chmod 的手册(例如,使用 man chmod 命令)
  8. 使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。
  9. 使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中
  10. 写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。
  11. 阅读 man ls ,然后使用ls 命令进行如下操作:
    所有文件(包括隐藏文件)
    文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954)
    文件以最近访问顺序排序
    以彩色文本显示输出结果
  12. 编写两个bash函数 marco 和 polo 执行下面的操作。 每当你执行 marco 时,当前的工作目录应当以某种形式保存,当执行 polo 时,无论现在处在什么目录下,都应当 cd 回到当时执行 marco 的目录。 为了方便debug,你可以把代码写在单独的文件 marco.sh 中,并通过 source marco.sh命令,(重新)加载函数。
  13. 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段bash脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。 加分项:报告脚本在失败前共运行了多少次。
  14. 本节课我们讲解的 find 命令中的 -exec 参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个zip压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如tar 则需要从参数接受输入。这里我们可以使用xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。
    您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看 xargs的参数-d,译注:MacOS 上的 xargs没有-d,查看这个issue)
  15. (进阶) 编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?
python练习题
  1. 编写 Hello World 程序。

  2. 编写程序,生成一个包含 20 个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。

  3. 判断闰年。用户输入一个年份,判断这一年是不是闰年,是输出 True,不是则输出 False。
    当以下条件之一满足时,这一年是闰年:
    (1) 年份是 4 的倍数而不是 100 的倍数(如 2004 年是, 1900 年不是);
    (2) 年份是 400 的倍数(如 2000 年是, 1900 年不是)

  4. 阅读程序,理解字典的用法。

  5. 打印出如下菱形图案。
    在这里插入图片描述

  6. 已知 s = 2 + 4 + 6 + 8 + … + n,求使得 不大于 100 时的 最大值。请分别用 for 和while 两种循环结构来完成。

  7. 编程打印如下图所示的字符金字塔。阅读并运行程序,理解其中的算法设计与实现思路。如果最后的 print() 语句不进行缩进,会出现什么结果?为什么?
    在这里插入图片描述

  8. 微信红包的算法实现。阅读理解并运行下面程序,思考有没有其他的编程算法(这里需要导入random 库)。

  9. 使用 opencv 库读取并显示一张本地图片。你需要学习安装 opencv 库。

  10. 阅读下列归并排序算法,体会分治算法的思想。
    在这里插入图片描述

  11. 求解线性方程组
    在这里插入图片描述

shell练习题
  1. 使用echo $SHELL命令可以查看您的 shell 是否满足要求。
echo $SHELL

  1. 在 /tmp 下新建一个名为 missing 的文件夹。
cd tmp
mkdir missing

img

  1. 用 man 查看程序 touch 的使用手册。
man touch

在这里插入图片描述

  1. 用 touch 在 missing 文件夹中新建一个叫 semester 的文件。
touch semester

在这里插入图片描述

  1. 将以下内容一行一行地写入 semester 文件:
    #!/bin/sh
    curl --head --silent https://missing.csail.mit.edu
    第一行可能有点棘手, # 在Bash中表示注释,而 ! 即使被双引号(")包裹也具有特殊的含义。 单引号(’)则不一样,此处利用这一点解决输入问题。
echo '#!/bin/sh' > semester
echo curl --head --silent https://missing.csail.mit.edu >> semester
cat semester

在这里插入图片描述

  1. 尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。
./semester
ls -l

在这里插入图片描述

  1. 查看 chmod 的手册(例如,使用 man chmod 命令)
man chmod

在这里插入图片描述

  1. 使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。
chmod 777 semester
ls -l
./ semester

在这里插入图片描述

  1. 使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中
./semester | grep last-modified > ~/last-modified.txt
cat last-modified.txt

img

  1. 写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。
upower -i /org/freedesktop/UPower/devices/battery_BAT0

在这里插入图片描述
这里未成功查询到电池的状态。
之后查找网上资料,尝试使用acpi 命令来查看电池的状态。

acpi -V

在这里插入图片描述
仍然没有查询到电池状态,虚拟机中可能读取不到电池信息,接下来尝试在windows的终端查询电池状态。

powercfg /batteryreport

在这里插入图片描述
这里出现了错误,网上查询说可能是应该要用管理员身份运行,但是改为管理员身份之后仍然报错。之后尝试使用Powercfg -energy 让系统生成一份电源效率诊断报告。

Powercfg -energy

在这里插入图片描述
这次成功生成电源效率诊断报告。
在这里插入图片描述

  1. 读 man ls ,然后使用ls 命令进行如下操作:
    所有文件(包括隐藏文件)
    文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954)
    文件以最近访问顺序排序
    以彩色文本显示输出结果
ls -a
ls -h
ls -t
ls --color=auto

在这里插入图片描述

  1. 编写两个bash函数 marco 和 polo 执行下面的操作。 每当你执行 marco 时,当前的工作目录应当以某种形式保存,当执行 polo 时,无论现在处在什么目录下,都应当 cd 回到当时执行 marco 的目录。 为了方便debug,你可以把代码写在单独的文件 marco.sh 中,并通过 source marco.sh命令,(重新)加载函数。
#!/bin/bash
 marco(){
     echo "$(pwd)" > $HOME/marco_history.log
     echo "save pwd $(pwd)"
 }
 polo(){
     cd "$(cat "$HOME/marco_history.log")"
 }

在这里插入图片描述

  1. 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段bash脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。 加分项:报告脚本在失败前共运行了多少次。
#!/usr/bin/env bash

 n=$(( RANDOM % 100 ))

 if [[ n -eq 42 ]]; then
     echo "Something went wrong"
     >&2 echo "The error was using magic numbers"
     exit 1
 fi

 echo "Everything went according to plan"

 count=1

 while true
 do
     ./buggy.sh 2> out.log
     if [[ $? -ne 0 ]]; then
         echo "failed after $count times"
         cat out.log
         break
     fi
     ((count++))

 done

在这里插入图片描述

  1. 本节课我们讲解的 find 命令中的 -exec 参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个zip压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如tar 则需要从参数接受输入。这里我们可以使用xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。
    您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看 xargs的参数-d,译注:MacOS 上的 xargs没有-d,查看这个issue)
  mkdir html_root
  cd html_root
  touch {1..10}.html
  mkdir html
  cd html
  touch xxxx.html
  cd ..
  cd ..
  find . -type f -name "*.html" | xargs -d '\n'  tar -cvzf html.zip

在这里插入图片描述
在这里插入图片描述

  1. (进阶) 编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?
find . -type f -mmin -60 -print0 | xargs -0 ls -lt | head -10

在这里插入图片描述

python练习题
  1. 编写 Hello World 程序。
print('Hello World')

在这里插入图片描述

  1. 编写程序,生成一个包含 20 个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。
import random 
ls = [random.randint(1, 100) for i in range(20)] 
print('生成列表:', ls) 
ls[::2] = sorted(ls[::2], reverse=True) 
print('排序后:', ls)

在这里插入图片描述

  1. 判断闰年。用户输入一个年份,判断这一年是不是闰年,是输出 True,不是则输出 False。
    当以下条件之一满足时,这一年是闰年:
    (1) 年份是 4 的倍数而不是 100 的倍数(如 2004 年是, 1900 年不是);
    (2) 年份是 400 的倍数(如 2000 年是, 1900 年不是)
stryear = input("请输入年份:") 
year = int(stryear) 
result = year % 400 == 0 or year % 4 == 0 and year % 100 != 0 

print("闰年判断结果是:", result)

在这里插入图片描述

  1. 阅读程序,理解字典的用法。
print('''|---欢迎进入通讯录程序---| 
	     |---1、查询联系人资料---|
	     |---2、插入新的联系人---|
	     |---3、删除已有联系人---| 
	     |---4、退出通讯录程序---|''') 
addressBook = {} # 定义通讯录 
while 1:
	temp = input('请输入指令代码:') 
	if not temp.isdigit():
	    print("输入的指令错误,请按照提示输入")
	    continue
	item = int(temp) # 转换为数字 
	if item == 4: 
	    print("|---感谢使用通讯录程序---|") 
	    break 
	name = input("请输入联系人姓名:") 
	if item == 1: 
	    if name in addressBook: 
	        print(name, ':', addressBook[name]) 
	        continue 
	    else:
	        print("该联系人不存在!") 
	if item == 2:
	    if name in addressBook: 
	        print("您输入的姓名在通讯录中已存在-->>" , name, ":",
addressBook[name]) 
	        isEdit = input("是否修改联系人资料(Y/N):") 
	        if isEdit == 'Y': 
	            userphone = input("请输入联系人电话:") 
	            addressBook[name] = userphone 
	            print("联系人修改成功") 
	            continue 
	        else:
	            continue 
	    else:
	        userphone = input("请输入联系人电话:") 
	        addressBook[name] = userphone 
	        print("联系人添加成功!") 
	        continue 
	if item == 3: 
	    if name in addressBook: 
	        del addressBook[name] 
	        print("删除成功!") 
	        continue 
	    else:
	        print("联系人不存在")

在这里插入图片描述

  1. 打印出如下菱形图案。
    在这里插入图片描述
m = 4 
d = 4 
for i in range(1, 5): 
	print(" " * (m - 1), "*" * (2 * i - 1)) 
	m -= 1 
	if i == 4: 
		for y in range(1, 4): 
			print(" " * y, "*" * (2*d-3)) 
			d -= 1

在这里插入图片描述

  1. 已知 s = 2 + 4 + 6 + 8 + … + n,求使得 不大于 100 时的 最大值。请分别用 for 和while 两种循环结构来完成。
# for循环 
sum = 0 
for i in range(2, 100, 2): 
	sum += i 
	if sum >= 100:
		print(i-2) 
		break 
# while循环 
sum = 0 
i = 2 
while sum < 100: 
	sum += i 
	i += 2 
print(i-4)

在这里插入图片描述

  1. 编程打印如下图所示的字符金字塔。阅读并运行程序,理解其中的算法设计与实现思路。如果最后的 print() 语句不进行缩进,会出现什么结果?为什么?
    在这里插入图片描述
n=65 
for a in range(10): 
	print(' '*(20-a), end='') 
	for b in range(a-1, 0, -1): 
		print(chr(n+b), end='') 
	for b in range(a): 
		print(chr(n+b), end='') 
	print()

在这里插入图片描述

如果最后一行print()不进行缩进,则输出为
在这里插入图片描述
分析原因为print()在最外层for循环中,因而可以使每行的字母在一个新的一行,而不像上述图片那样,每层字母的位置比较混乱。

  1. 微信红包的算法实现。阅读理解并运行下面程序,思考有没有其他的编程算法(这里需要导入random 库)。
import random 
total = eval(input('请输入红包总金额:')) 
num = eval(input('请输入红包个数:')) 
min_money = 0.01 
print("红包总金额:{0}元,红包个数:{1}".format(total, num)) 
for i in range(1, num): 
	safe_total = round((total-(num-i)*min_money) / (num-i), 2) 
	money = round(random.uniform(min_money*100, safe_total*100)/100, 2) 
	total = round(total-money, 2) 
	print("第{0}个红包:{1}元,余额:{2}元".format(i, money, total)) 
print("第{0}个红包:{1}元,余额:0元".format(num, total))

在这里插入图片描述

  1. 使用 opencv 库读取并显示一张本地图片。你需要学习安装 opencv 库。
import cv2 

img = cv2.imread("/home/lee/cat.png") 

cv2.imshow("Imge", img) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

在这里插入图片描述

  1. 阅读下列归并排序算法,体会分治算法的思想。
    在这里插入图片描述
def mergeSort(arr): 
	import math 
	if(len(arr) < 2): 
		return arr 
	middle = math.floor(len(arr)/2) 
	left, right = arr[0:middle], arr[middle:] 
	return merge(mergeSort(left), mergeSort(right)) 

def merge(left, right): 
	result = [] 
	while left and right: 
		if left[0] <= right[0]: 
			result.append(left.pop(0)) 
		else:
			result.append(right.pop(0)) 
	while left: 
		result.append(left.pop(0)) 
	while right: 
		result.append(right.pop(0)) 
	return result 

if __name__ == '__main__': 
	arr = [0, 2, 3, 1, 5, 6, 4, 7, 9, 8] 
	result = mergeSort(arr) 
	print(result)

在这里插入图片描述

  1. 求解线性方程组
    在这里插入图片描述
import numpy as np 

a = np.array([[1, 0, 1], [2, 3, 4], [3, 5, 7]]) 
b = np.array([10, 33, 56]) 
y = np.linalg.solve(a, b) 

print("x={:.2f}, y={:.2f}, z={:.2f}".format(y[0], y[1], y[2]))

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐