shell练习题与python练习题
软件技术先导实践shell课后题python练习题
shell练习题
- 使用echo $SHELL命令可以查看您的 shell 是否满足要求。
- 在 /tmp 下新建一个名为 missing 的文件夹。
- 用 man 查看程序 touch 的使用手册。
- 用 touch 在 missing 文件夹中新建一个叫 semester 的文件。
- 将以下内容一行一行地写入 semester 文件:
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
第一行可能有点棘手, # 在Bash中表示注释,而 ! 即使被双引号(")包裹也具有特殊的含义。 单引号(’)则不一样,此处利用这一点解决输入问题。 - 尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。
- 查看 chmod 的手册(例如,使用 man chmod 命令)
- 使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。
- 使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中
- 写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。
- 阅读 man ls ,然后使用ls 命令进行如下操作:
所有文件(包括隐藏文件)
文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954)
文件以最近访问顺序排序
以彩色文本显示输出结果 - 编写两个bash函数 marco 和 polo 执行下面的操作。 每当你执行 marco 时,当前的工作目录应当以某种形式保存,当执行 polo 时,无论现在处在什么目录下,都应当 cd 回到当时执行 marco 的目录。 为了方便debug,你可以把代码写在单独的文件 marco.sh 中,并通过 source marco.sh命令,(重新)加载函数。
- 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段bash脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。 加分项:报告脚本在失败前共运行了多少次。
- 本节课我们讲解的 find 命令中的 -exec 参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个zip压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如tar 则需要从参数接受输入。这里我们可以使用xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。
您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看 xargs的参数-d,译注:MacOS 上的 xargs没有-d,查看这个issue) - (进阶) 编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?
python练习题
-
编写 Hello World 程序。
-
编写程序,生成一个包含 20 个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。
-
判断闰年。用户输入一个年份,判断这一年是不是闰年,是输出 True,不是则输出 False。
当以下条件之一满足时,这一年是闰年:
(1) 年份是 4 的倍数而不是 100 的倍数(如 2004 年是, 1900 年不是);
(2) 年份是 400 的倍数(如 2000 年是, 1900 年不是) -
阅读程序,理解字典的用法。
-
打印出如下菱形图案。
-
已知 s = 2 + 4 + 6 + 8 + … + n,求使得 不大于 100 时的 最大值。请分别用 for 和while 两种循环结构来完成。
-
编程打印如下图所示的字符金字塔。阅读并运行程序,理解其中的算法设计与实现思路。如果最后的 print() 语句不进行缩进,会出现什么结果?为什么?
-
微信红包的算法实现。阅读理解并运行下面程序,思考有没有其他的编程算法(这里需要导入random 库)。
-
使用 opencv 库读取并显示一张本地图片。你需要学习安装 opencv 库。
-
阅读下列归并排序算法,体会分治算法的思想。
-
求解线性方程组
shell练习题
- 使用echo $SHELL命令可以查看您的 shell 是否满足要求。
echo $SHELL
- 在 /tmp 下新建一个名为 missing 的文件夹。
cd tmp
mkdir missing
- 用 man 查看程序 touch 的使用手册。
man touch
- 用 touch 在 missing 文件夹中新建一个叫 semester 的文件。
touch semester
- 将以下内容一行一行地写入 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
- 尝试执行这个文件。例如,将该脚本的路径(./semester)输入到您的shell中并回车。如果程序无法执行,请使用 ls 命令来获取信息并理解其不能执行的原因。
./semester
ls -l
- 查看 chmod 的手册(例如,使用 man chmod 命令)
man chmod
- 使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。
chmod 777 semester
ls -l
./ semester
- 使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中
./semester | grep last-modified > ~/last-modified.txt
cat last-modified.txt
- 写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。
upower -i /org/freedesktop/UPower/devices/battery_BAT0
这里未成功查询到电池的状态。
之后查找网上资料,尝试使用acpi 命令来查看电池的状态。
acpi -V
仍然没有查询到电池状态,虚拟机中可能读取不到电池信息,接下来尝试在windows的终端查询电池状态。
powercfg /batteryreport
这里出现了错误,网上查询说可能是应该要用管理员身份运行,但是改为管理员身份之后仍然报错。之后尝试使用Powercfg -energy 让系统生成一份电源效率诊断报告。
Powercfg -energy
这次成功生成电源效率诊断报告。
- 读 man ls ,然后使用ls 命令进行如下操作:
所有文件(包括隐藏文件)
文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954)
文件以最近访问顺序排序
以彩色文本显示输出结果
ls -a
ls -h
ls -t
ls --color=auto
- 编写两个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")"
}
- 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段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
- 本节课我们讲解的 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
- (进阶) 编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?
find . -type f -mmin -60 -print0 | xargs -0 ls -lt | head -10
python练习题
- 编写 Hello World 程序。
print('Hello World')
- 编写程序,生成一个包含 20 个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。
import random
ls = [random.randint(1, 100) for i in range(20)]
print('生成列表:', ls)
ls[::2] = sorted(ls[::2], reverse=True)
print('排序后:', ls)
- 判断闰年。用户输入一个年份,判断这一年是不是闰年,是输出 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)
- 阅读程序,理解字典的用法。
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("联系人不存在")
- 打印出如下菱形图案。
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
- 已知 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)
- 编程打印如下图所示的字符金字塔。阅读并运行程序,理解其中的算法设计与实现思路。如果最后的 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循环中,因而可以使每行的字母在一个新的一行,而不像上述图片那样,每层字母的位置比较混乱。
- 微信红包的算法实现。阅读理解并运行下面程序,思考有没有其他的编程算法(这里需要导入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))
- 使用 opencv 库读取并显示一张本地图片。你需要学习安装 opencv 库。
import cv2
img = cv2.imread("/home/lee/cat.png")
cv2.imshow("Imge", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 阅读下列归并排序算法,体会分治算法的思想。
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)
- 求解线性方程组
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]))
更多推荐
所有评论(0)