习题要求
创建好作业后,先进入文件夹/home/acs/homework/lesson_3/,然后:(0) 进入homework_0文件夹,编写自动完成lesson_1作业的脚本helper.sh。要求: [1] 当前目录下仅包含helper.sh [2] helper.sh具有可执行权限 [3] 在任意路径依次执行下列命令后,lesson_1的作业可以得到满分: 1) homework 1 create 2) /home/acs/homework/lesson_3/homework_0/helper.sh(1) 进入homework_1文件夹,编写脚本check_file.sh。要求: [1] 当前目录下仅包含check_file.sh。 [2] check_file.sh具有可执行权限。 [3] check_file.sh接收一个传入参数。格式为 ./check_file.sh file [4] 判断传递参数,分别在标准输出中输出如下内容(不包括双引号): 1) 如果传入参数个数不是1,则输出一行:"arguments not valid",然后退出,退出状态等于1。 2) 如果file文件不存在,则输出一行:"not exist",然后退出,退出状态等于2。 3) 如果file文件存在,则输出分别进行如下5个判断,然后退出,退出状态等于0。 1] 如果file为普通文件,则输出一行:"regular file" 2] 如果file为目录(文件夹),则输出一行:"directory" 3] 如果file具有可读权限,则输出一行:"readable" 4] 如果file具有可写权限,则输出一行:"writable" 5] 如果file具有可执行权限,则输出一行:"executable"(2) 进入homework_2文件夹,编写脚本main.sh。要求: [1] 当前目录下仅包含main.sh [2] main.sh具有可执行权限 [3] 该文件从stdin(标准输入)中读取一个整数n [4] 在stdout(标准输出)输出斐波那契数列的第n项。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。 [5] 数据保证 0 <= n <= 20,脚本不需要判断n的合法性。(3) 进入homework_3文件夹,编写脚本main.sh。要求: [1] 当前目录下仅包含main.sh [2] main.sh具有可执行权限 [3] 该文件从stdin(标准输入)中读取两行整数n和m [4] 在stdout(标准输出)中输出1~n的按字典序从小到大的顺序数第m个全排列,输出一行,用空格隔开所有数,行末可以有多余空格。 [5] 数据保证 1 <= n <= 10, 1 <= m <= min(100, n!),脚本不需要判断数据的合法性。(4) 进入homework_4文件夹,编写脚本main.sh。要求: [1] 当前目录下仅包含main.sh [2] main.sh具有可执行权限 [3] main.sh接收两个传入参数。格式为 ./main.sh input_file output_file [4] 从input_file中读取一个正整数n,然后将前n个正整数的平方和写入output_file中 [5] 数据保证 1 <= n <= 100,脚本不需要判断所有数据的合法性。
第零题
创建好作业后,先进入文件夹/home/acs/homework/lesson_3/,然后:(0) 进入homework_0文件夹,编写自动完成lesson_1作业的脚本helper.sh。要求: [1] 当前目录下仅包含helper.sh [2] helper.sh具有可执行权限 [3] 在任意路径依次执行下列命令后,lesson_1的作业可以得到满分: 1) homework 1 create 2) /home/acs/homework/lesson_3/homework_0/helper.shhomework 3 createcd /home/acs/homework/lesson_3/homework_0ls -avim helper.sh :wqls -l helper.shchmod +x helper.shvim helper.sh# helper.sh内容如下:#! /bin/bash# 不能加空格homework1_dir=/home/acs/homework/lesson_1/homework_homework 1 create 0# ${}是变量替换,$()是返回stdoutcd ${homework1_dir}0for i in dir_a dir_b dir_cdomkdir $idonehomework 1 create 1cd ${homework1_dir}1for i in a.txt b.txt c.txtdocp $i ${i}.bakdonehomework 1 create 2cd ${homework1_dir}2for i in a b cdomv ${i}.txt ${i}_new.txtdonehomework 1 create 3cd ${homework1_dir}3for i in a.txt b.txt c.txtdomv dir_a/${i} dir_bdonehomework 1 create 4cd ${homework1_dir}4for i in a.txt b.txt c.txtdorm ${i}donehomework 1 create 5cd ${homework1_dir}5for i in dir_a dir_b dir_cdo#echo $(pwd)/${i}rm ${i} -rdonehomework 1 create 6cd ${homework1_dir}6# done是关键字要使用双引号,否则会找do去匹配# mv task.txt dir_a/done.txtmkdir dir_amv task.txt "dir_a/done.txt"homework 1 create 7cd ${homework1_dir}7for ((i=0;i<3;i++))domkdir dir_${i}#for ((j=0;j<3;j++))#do## 会操作3x3x3条#cp a.txt dir_${i}/a${j}.txt#cp b.txt dir_${i}/b${j}.txt#cp c.txt dir_${i}/c${j}.txt#donefor j in a b cdocp ${j}.txt dir_${i}/${j}${i}.txtdonedonehomework 1 create 8cd ${homework1_dir}8rm dir_a/a.txtmv dir_b/b.txt dir_b/b_new.txtcp dir_c/c.txt dir_c/c.txt.bakhomework 1 create 9cd ${homework1_dir}9rm *.txt# 每次执行完之后调用一下# homework 1 test# helper.sh内容结束# 注意事项1. 开头的 `#! /bin/bash` 如果不加的话会导致for循环报错2. 要保证目录里只有一个文件:关掉vim3. 粘贴时要开启粘贴模式隐藏行号 :set paste :set nonu# 如何将服务器中的文件整体复制出来1. 退出tmux2. `cat filename`:展示filename的文件内容3. 鼠标选中文本开头的若干字符4. 用滚轮滑到文件结尾5. 按住Shift,同时鼠标点击文件结尾,此时会选中文件所有内容6. Windows/Linux下,按Ctrl + insert可以复制全文;Mac下,按Command + c可以复制全文。
第一题
(1) 进入homework_1文件夹,编写脚本check_file.sh。要求: [1] 当前目录下仅包含check_file.sh。 [2] check_file.sh具有可执行权限。 [3] check_file.sh接收一个传入参数。格式为 ./check_file.sh file [4] 判断传递参数,分别在标准输出中输出如下内容(不包括双引号): 1) 如果传入参数个数不是1,则输出一行:"arguments not valid",然后退出,退出状态等于1。 2) 如果file文件不存在,则输出一行:"not exist",然后退出,退出状态等于2。 3) 如果file文件存在,则输出分别进行如下5个判断,然后退出,退出状态等于0。 1] 如果file为普通文件,则输出一行:"regular file" 2] 如果file为目录(文件夹),则输出一行:"directory" 3] 如果file具有可读权限,则输出一行:"readable" 4] 如果file具有可写权限,则输出一行:"writable" 5] 如果file具有可执行权限,则输出一行:"executable"cd /home/acs/homework/lesson_3/homework_1ls -avim check_file.sh :wqls -l check_file.shchmod +x check_file.shvim check_file.sh# ./check_file.sh file#! /bin/bashif [ $# -ne 1]thenecho arguments not validexit 1fi# 中间带空格的字符串要加双引号if [ ! -e "$i" ]thenecho not existexit 2fiif [ -f "$1" ]thenecho regular file#exit 0 # 默认就是返回0,不写也行fiif [ -d "$1" ]thenecho directoryfiif [ -r "$1" ]thenecho readablefiif [ -w "$1" ]thenecho writablefiif [ -x "$1" ]thenecho executablefi
第二题
(2) 进入homework_2文件夹,编写脚本main.sh。要求: [1] 当前目录下仅包含main.sh [2] main.sh具有可执行权限 [3] 该文件从stdin(标准输入)中读取一个整数n [4] 在stdout(标准输出)输出斐波那契数列的第n项。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。 [5] 数据保证 0 <= n <= 20,脚本不需要判断n的合法性。cd /home/acs/homework/lesson_3/homework_2ls -avim main.sh :wqls -l main.shchmod +x main.shvim main.sh#! /bin/bashread n# 等号两边不能加空格a[0]=1a[1]=1for ((i=2;i<=n;i++))dox=$(expr &i - 1) # x = a[i-1]y=$(expr &i - 2)a[$i]=$(expr ${a[$x]} + ${a[$y]}) # a[i] = a[i-1] + a[i-2]doneecho ${a[$n]}
第三题
(3) 进入homework_3文件夹,编写脚本main.sh。要求: [1] 当前目录下仅包含main.sh [2] main.sh具有可执行权限 [3] 该文件从stdin(标准输入)中读取两行整数n和m [4] 在stdout(标准输出)中输出1~n的按字典序从小到大的顺序数第m个全排列,输出一行,用空格隔开所有数,行末可以有多余空格。 [5] 数据保证 1 <= n <= 10, 1 <= m <= min(100, n!),脚本不需要判断数据的合法性。cd /home/acs/homework/lesson_3/homework_3ls -avim main.sh :wqls -l main.shchmod +x main.sh# 先用c++进行编写#includeusing namespace std;const int N = 110;int n,m;// n个数找第m个全排列int path[N];// 路径数组bool st[N];// 状态数组,看第i个数是否被用过bool dfs(int u){if(u==n){m--;if(!m){for(int i=0;i<n;i++)cout << path[i] << '';cout << endl;return true;}return false;}for(int i=1;i> n >> m;dfs(0);//从第0位开始return 0;}vim main.sh#! /bin/bashread nread m# 初始化数组for((i=1;i<=n;i++))dost[$i]=0 # 0表示falsedone# dfs流程dfs(){if [ $1 -eq $n ]thenm=`expr $m - 1`if [ $m -eq 0 ]thenecho ${path[@]}return 0 # 正常结束fireturn 1filocal j=0 # 其他层递归的dfs会改变原来循环中的jfor((j=1;j<=n;j++))doif [ ${st[$j]} -eq 0 ]thenpath[$1]=$jst[$j]=1if dfs `expr $1 + 1`thenreturn 0fist[$j]=0fidonereturn 1}# 执行dfs,从第0位开始dfs 0
第四题
(4) 进入homework_4文件夹,编写脚本main.sh。要求: [1] 当前目录下仅包含main.sh [2] main.sh具有可执行权限 [3] main.sh接收两个传入参数。格式为 ./main.sh input_file output_file [4] 从input_file中读取一个正整数n,然后将前n个正整数的平方和写入output_file中 [5] 数据保证 1 <= n <= 100,脚本不需要判断所有数据的合法性。cd /home/acs/homework/lesson_3/homework_4ls -avim main.sh :wqls -l main.shchmod +x main.shinput_file=$1output_file=$2read n < $input_filesum = 0for ((i=1;i $output_fileecho 10 > input.txt./main.sh input.txt output.txt