Linux-03shell语法复习与习题

这篇具有很好参考价值的文章主要介绍了Linux-03shell语法复习与习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

习题要求


创建好作业后,先进入文件夹/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.sh

homework 3 create
cd /home/acs/homework/lesson_3/homework_0
ls -a
vim helper.sh :wq
ls -l helper.sh
chmod +x helper.sh
vim helper.sh

# helper.sh内容如下:
#! /bin/bash
# 不能加空格
homework1_dir=/home/acs/homework/lesson_1/homework_

homework 1 create 0
# ${}是变量替换,$()是返回stdout
cd ${homework1_dir}0
for i in dir_a dir_b dir_c
do
	mkdir $i
done

homework 1 create 1
cd ${homework1_dir}1
for i in a.txt b.txt c.txt
do
	cp $i ${i}.bak
done

homework 1 create 2
cd ${homework1_dir}2
for i in a b c
do
	mv ${i}.txt ${i}_new.txt
done

homework 1 create 3
cd ${homework1_dir}3
for i in a.txt b.txt c.txt
do
	mv dir_a/${i} dir_b
done

homework 1 create 4
cd ${homework1_dir}4
for i in a.txt b.txt c.txt
do
	rm ${i}
done

homework 1 create 5
cd ${homework1_dir}5
for i in dir_a dir_b dir_c
do
#	echo $(pwd)/${i}
	rm ${i} -r
done

homework 1 create 6
cd ${homework1_dir}6
# done是关键字要使用双引号,否则会找do去匹配
# mv task.txt dir_a/done.txt
mkdir dir_a
mv task.txt "dir_a/done.txt"

homework 1 create 7
cd ${homework1_dir}7
for ((i=0;i<3;i++))
do
	mkdir 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
#	done
	for j in a b c
	do
		cp ${j}.txt dir_${i}/${j}${i}.txt
	done
done

homework 1 create 8
cd ${homework1_dir}8
rm dir_a/a.txt
mv dir_b/b.txt dir_b/b_new.txt
cp dir_c/c.txt dir_c/c.txt.bak

homework 1 create 9
cd ${homework1_dir}9
rm *.txt

# 每次执行完之后调用一下
# homework 1 test
# helper.sh内容结束

# 注意事项
1. 开头的 `#! /bin/bash` 如果不加的话会导致for循环报错
2. 要保证目录里只有一个文件:关掉vim
3. 粘贴时要开启粘贴模式隐藏行号 :set paste :set nonu

# 如何将服务器中的文件整体复制出来
1. 退出tmux
2. `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_1
ls -a
vim check_file.sh :wq
ls -l check_file.sh
chmod +x check_file.sh
vim check_file.sh
# ./check_file.sh file

#! /bin/bash

if [ $# -ne 1]
then
	echo arguments not valid
	exit 1
fi

# 中间带空格的字符串要加双引号
if [ ! -e "$i" ]
then
	echo not exist
	exit 2
fi

if [ -f "$1" ]
then
	echo regular file
	#exit 0 # 默认就是返回0,不写也行
fi

if [ -d "$1" ]
then
	echo directory
fi

if [ -r "$1" ]
then
	echo readable
fi

if [ -w "$1" ]
then
	echo writable
fi

if [ -x "$1" ]
then
	echo executable
fi

第二题


(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_2
ls -a
vim main.sh :wq
ls -l main.sh
chmod +x main.sh
vim main.sh

#! /bin/bash

read n
# 等号两边不能加空格
a[0]=1
a[1]=1

for ((i=2;i<=n;i++))
do
	x=$(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]
done

echo ${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_3
ls -a
vim main.sh :wq
ls -l main.sh
chmod +x main.sh

# 先用c++进行编写
#include<iostream>
using 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;i++){
		if(!st[i]){
			path[u] = i;
			st[i] = true;
			if(dfs(u+1))
				return true;
			// 恢复现场
			st[i] = false;
		}
	}
	return false;
}

int main(){
	cin >> n >> m;
	dfs(0);	//从第0位开始
	return 0;
}

vim main.sh

#! /bin/bash

read n
read m

# 初始化数组
for((i=1;i<=n;i++))
do
	st[$i]=0 # 0表示false
done

# dfs流程
dfs(){
	if [ $1 -eq $n ]
	then
		m=`expr $m - 1`
		if [ $m -eq 0 ]
		then
			echo ${path[@]}
			return 0 # 正常结束
		fi
		return 1
	fi
	
	local j=0 # 其他层递归的dfs会改变原来循环中的j
	for((j=1;j<=n;j++))
	do
		if [ ${st[$j]} -eq 0 ]
		then
			path[$1]=$j
			st[$j]=1
			
			if dfs `expr $1 + 1`
			then
				return 0
			fi
			
			st[$j]=0
		fi
	done
	
	return 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_4
ls -a
vim main.sh :wq
ls -l main.sh
chmod +x main.sh

input_file=$1
output_file=$2

read n < $input_file

sum = 0

for ((i=1;i<=n;i++))
do
	sqr=`expr $i \* $i`
	sum=`expr $sum + $sqr`
done

echo $sum > $output_file

echo 10 > input.txt
./main.sh input.txt output.txt

文章来源地址https://www.toymoban.com/news/detail-760519.html

到了这里,关于Linux-03shell语法复习与习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux shell操作- 03 用户切换及shell案例

    linux是多用户的、多进程的操作系统,通常多个用户之间需要来回切换; su,switch user 命令 参数 - , 切换用户,同时切换工作目录(为目标用户的家目录) 参数 -c cmd,切换到目标用户,执行一条指令,然后切回原用户; 参数 -m -p ,保持原用户的环境变量; 参数 -l,重新登

    2024年02月06日
    浏览(40)
  • Shell语法揭秘:深入探讨常见Linux Shell之间的语法转换

    博主简介 💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。 👉 🎖️ CSDN实力新星、

    2024年02月11日
    浏览(38)
  • Linux网络操作系统期末系统复习题

    一 、填空题 1. GUN 的含义是 一个自由的操作系统 。 2. Linux 一般有 3 个主要部分: 内核 、 命令解释层 、 实用工具  。 3. 目前被称为纯种的UNIX指的就是 System V 以及 BSD 这两套操作系统 。 4. Linux是基于 Copyleft 的软件模式进行发布的,它是GNU项目制定的通用公共许可证,英文

    2023年04月23日
    浏览(52)
  • Linux编程基础:第4章Shell编程 课后习题

    《Linux编程基础》黑马程序员/编著 清华大学出版社 目录 一、填空题 二、判断题 三、单选题 四、简答题 1、分析以下脚本代码: 2、写出shell脚本中while循环与until循环的基本格式,并简述这两种循环结构的区别。 五、编程题 1、编写shell脚本实现如下菜单界面: 2、编写she

    2024年02月07日
    浏览(37)
  • linux笔记shell脚本基础语法

    vim aaa.sh 输入以下内容,按esc退出 输入:wq保存 输入chmod 777 aaa.sh赋权限 输入./aaa执行看效果 #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。 echo 命令用于向窗口输出文本。 echo 命令 -e 代表开启换行,如果有n就会换行。c代表关闭换行

    2024年02月07日
    浏览(48)
  • 【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)

    语法格式 参数说明 : path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。 expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。 1. 常用expression 以下列出

    2024年02月09日
    浏览(51)
  • Linux shell练习题——grep、|、ln、chmod、vim

    1. 打开终端窗⼝, 使⽤ pwd 命令查看⾃⼰所在⽬录. 2. 使⽤ cd 命令通过相对路径切换到根(/)⽬录 3. 使⽤ cd - 切换到上次所在的⽬录 4. 使⽤ ls 命令以列表的形式查看当前⽬录下所有的⽂件(包括隐藏⽂件),并将输出结果重定向到桌⾯的 my.txt ⽂件中. 5. 在当前⽬录中使⽤ cat 命令

    2024年02月11日
    浏览(37)
  • 【Linux】shell脚本: 基本语法 和 高级特性

    Shell脚本是一种用Shell语言编写的程序,它可以实现自动化的任务,如批量处理文件、监控系统状态、定时备份等。本文包括: Shell脚本的定义和作用:介绍什么是Shell脚本,它有哪些优点和缺点,它可以用来做什么。 Shell脚本的基本语法:介绍Shell脚本的结构、变量、运算符

    2024年02月12日
    浏览(44)
  • Linux shell练习题——cd、ls、mkdir、mv、rm

    1. 使⽤ cd 切换到桌⾯ 2. 使⽤ touch 在桌⾯创建 a.txt b.txt c.txt 三个⽂件 3. 使⽤ mkdir 在桌⾯创建 hello ⽬录. 4. 使⽤ mv命令 b.txt c.txt 两个⽂件移动到 hello ⽬录下 5. 双击打开 a.txt, 在⽂件中填写内容 hello world. 6. 使⽤ cp 命令拷⻉ a.txt 到 abc.txt 中. 7. 使⽤ tree 查看下当前⽬录的⽬录

    2024年02月11日
    浏览(50)
  • SQL 复习 03

    用法 说明 round(x, n) 四舍五入,x为浮点数,n为保留的位数 ceil(x) 向上取整 floor(x) 向下取整 truncate(x, n) 截断x,n为保留的位,该位之后的数值置零,位数表示示例:321.123,其中小数点前用负值表示,小数点位数为0,即 truncate(x, 0) 等同于舍弃小数部分取整 mod(a, b) 返回 a 除以

    2024年02月12日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包