shell练习题与python练习题

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. 打印出如下菱形图案。
    shell练习题与python练习题_第1张图片

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

  7. 编程打印如下图所示的字符金字塔。阅读并运行程序,理解其中的算法设计与实现思路。如果最后的 print() 语句不进行缩进,会出现什么结果?为什么?
    shell练习题与python练习题_第2张图片

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

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

  10. 阅读下列归并排序算法,体会分治算法的思想。
    shell练习题与python练习题_第3张图片

  11. 求解线性方程组
    shell练习题与python练习题_第4张图片

shell练习题

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

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

img

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

shell练习题与python练习题_第5张图片

  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

shell练习题与python练习题_第6张图片

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

shell练习题与python练习题_第7张图片

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

shell练习题与python练习题_第8张图片

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

shell练习题与python练习题_第9张图片

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

shell练习题与python练习题_第10张图片

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

shell练习题与python练习题_第11张图片
这里未成功查询到电池的状态。
之后查找网上资料,尝试使用acpi 命令来查看电池的状态。

acpi -V

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

powercfg /batteryreport

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

Powercfg -energy

shell练习题与python练习题_第12张图片
这次成功生成电源效率诊断报告。
shell练习题与python练习题_第13张图片

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

shell练习题与python练习题_第14张图片

  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")"
 }

shell练习题与python练习题_第15张图片

  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

shell练习题与python练习题_第16张图片
shell练习题与python练习题_第17张图片

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

shell练习题与python练习题_第18张图片

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)

shell练习题与python练习题_第19张图片

  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("联系人不存在")

shell练习题与python练习题_第20张图片

  1. 打印出如下菱形图案。
    shell练习题与python练习题_第21张图片
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

shell练习题与python练习题_第22张图片

  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() 语句不进行缩进,会出现什么结果?为什么?
    shell练习题与python练习题_第23张图片
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()

shell练习题与python练习题_第24张图片

如果最后一行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))

shell练习题与python练习题_第25张图片

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

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

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

shell练习题与python练习题_第26张图片

  1. 阅读下列归并排序算法,体会分治算法的思想。
    shell练习题与python练习题_第27张图片
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. 求解线性方程组
    shell练习题与python练习题_第28张图片
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]))

在这里插入图片描述

你可能感兴趣的:(bash,linux,开发语言)