1.windows系统有shell吗
有,Command Prompt 即命令提示符
2.shell的两大功能
- 命令解释器 shell负责解释用户输入的命令,并将其发送给操作系统执行
- 脚本编程
3.给abc文件的所有用户添加读的权限
u 是user r 是read
chmod u+r abc
如果用数字呢 ?读权限是4
chmod 444 abc
4.快速切换到自己的主目录下 用 ()
返回到上层目录 用()
快速切换自己的主目录是~
返回上级是cd ..
5.使用su命令实现账户切换时,
1、超级用户切换到普通用户,需不需要输入密码?
通常需要输入密码,
2、普通用户切换到超级用户,需不需要输入密码?
通常需要输入超级用户的密码
3、普通用户切换到另一个普通用户,需不需要输入密码?
通常需要输入密码 ,su命令的默认为切换到相同用户名的用户时不需要无需密码
6.编写一个shell脚本,利用位置参数携带一个文件名,判断该文件在当前目录下是否存在且是一个普通文件。
if test -f "$1" #检查脚本的第一个参数是否是一个普通文件
then echo "$1 is an ordinary file"
else echo "$1 is not an ordinary file"
fi
7.编写一个shell脚本,输入(1-10)之间的一个数,并判断它是否小于5。
echo 'key in a number (1 - 10 ) :'#显示注释提示
read a #将输入存到a中
if [ "$a"−lt 1−o " $a" -gt 10 ] #如果变量a的值小于1或者大于10,lt是less than
then echo " Error Number . "
exit
elif [ "$a" -gt 5 ] #如果a值大于5 gt 是gather than
then echo " It's not less 5 . "
else echo " It's less 5 . "
fi
8.用case语句来判断输入的位置参数所携带的字符串是否是匹配一个文件名的字符串。
read Country
case "$Country" in
"China") echo "Ni Hao.";;
"Japan") echo "Konnichiha.";;
"England") echo "Hello.";;
*) echo "???.";;
esac
用户输入一个国家名称,然后case语句会根据输入的国家名称输出相应的问候语。如果输入的国家名称不在列表中,会输出"???"。
9.将当前目录下的所有*.c文件用for循环依次输出。
for i in *.c
do
cat $i | pr #将文件 $i的内容通过cat输出,然后通过pr用于对文本进行格式化输出
done
10.用while和break输出1-10之间的整数。
x=1
while true
do
echo $x #输出当前x的值
x=expr $x + 1 #将x的值递增+1
if [ "$x" -gt 10 ] #如果x的值大于10
then break
fi
done
11.输入一组数,输出除了值为3的所有数。
for i in 1 2 3 4 5 遍历数字1到5
do
if [ " $i" –eq 3 ] #如果i的值等于3
then continue #跳出当前迭代
else echo " $i " #输出i的值
fi
done
12.Shell脚本的执行都有哪些方法,有何不同?
在终端中直接执行,用bash或者sh命令执行脚本
先使用chmod +x script.sh添加执行权限,然后直接运行脚本
在脚本文件的第一行添加 #!/bin/bash然后给予权限就可以直接执行脚本
使用source 或点操作符 这会在当前shell环境中执行脚本,
13.在给定的目录列表中查找并删除所有.txt文件,然后检查目录是否为空,如果为空则删除该目录
#!/bin/bash
for i in "$@"; do #遍历当前输入目录
find "$i" -name "*.txt" -exec rm -rf {} ; #查找并删除所有txt文件
[ -z "i")" ] && rmdir "$i" # 如果目录为空,则删除该目录
done
find “$i" -name "*.txt"
rm -rf{}递归删除文件或者目录,不显示提示信息
14.编写一个Shell脚本,完成如下字符图形的输出。
x=0 # 初始化外层循环的计数器 x 为 0
while [ $x -lt 10 ] # 外层循环,当 x 小于 10 时执行
do
y=" $x" # 初始化内层循环的计数器 y 为 x 的值(左侧添加空格以保持格式)
while [ "$y" -ge 0 ] # 内层循环,当 y 大于等于 0 时执行
do
echo -n "$y " # 输出当前 y 的值并保持在同一行
y=expr $y - 1
# 将 y 减 1
done
echo # 换行,以便开始新的一行
x=expr $x + 1
# 外层循环计数器 x 增加 1
done
15.编写一个Shell脚本,完成如下字符图形(1-5组成的等腰三角形)的输出。
16.为什么需要自行生成交叉编译器?
针对特定的嵌入式体系结构,并一定有现成的交叉编译器,因而,我们不得不使用现有的GCC代码来 生成交叉编译器!
17.宿主机平台如何进行选择?
仿真环境
真机环境
18.交叉编译器的生成过程
- 制作交叉的binutils二进制工具
制作不带库的gcc交叉编译器
用制作好的gcc交叉编译器,生成所需要的C库(glibc、newlib、uclibc等)
重新编译带库的gcc,生成完整的交叉编译器
19.什么是bootloader的主要功能(A)
20.什么是boot loader?
bootloader是计算机系统中的一个关键程序,其主要任务是在计算机启动时加载操作系统到内存中,并启动操作系统的执行
21.bootloader启动分为哪两种模式?
自主模式和下载模式
22.列举 3 种常见的开源 bootloader。
GRUB
syslinux
Das U-Boot
23.系统的配置文件在( )目录下
在 /etc 目录下,你会找到各种子目录和配置文件,用于配置不同方面的系统和服务。例如,/etc/network 存储网络配置,/etc/apache2 存储Apache Web服务器的配置等。
24.bin和sbin目录的区别是()
bin 目录用于存放一般用户可以运行的二进制命令(可执行文件),而 sbin 目录用于存放系统管理员或超级用户(root)可以运行的二进制命令。
25.将gcc的编译过程进行描述
预处理 预处理阶段对源代码进行宏展开,头文件包含,条件编译等处理
编译 将预处理后的源代码翻译成汇编代码
汇编 将汇编代码转换成目标文件(机器代码)
链接 将目标文件与库文件等链接程可执行文件
26.解释什么是交叉编译
交叉编译(Cross-Compilation)是指在一台计算机系统上生成目标平台上可执行程序的过程。在交叉编译中,编译器和构建工具运行在一台主机(Host)上,而生成的可执行文件将在另一台不同的目标平台(Target)上运行。
27.bootloader的启动分为哪两个阶段?他们各有什么特点
28.根据要求编写Makefile文件,有5个文件分别是main.c、vs.h、sd.h、vs.c、sd.c。具体代码如下,如果上述文件在同一目录,请编写Makefile文件,用于生成可执行程序zhs。
给下列源代码做注释。
#define KERNEL
#define MODULE
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int year=2007;
MODULE_LICENSE("GPL"); // [填空1]
MODULE_PARM(year,"i");
int hello_init(void)
{
printk(KERN_ERR"Hello, world\n"); // [填空2]
return 0;}
void hello_exit(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");} // [填空3]
module_init(hello_init); // [填空4]
module_exit(hello_exit); // [填空5]
// [填空1]: 模块的许可证声明,此处表示使用GPL许可证
MODULE_LICENSE("GPL");int year = 2007;
// [填空2]: 模块初始化函数,当模块加载时执行
int hello_init(void) {
printk(KERN_ERR "Hello, world\n");
return 0;
}
// [填空3]: 模块退出函数,当模块卸载时执行
void hello_exit(void) {
printk(KERN_INFO "Goodbye, cruel world\n");
}// [填空4]: 模块初始化宏,指定模块加载时执行的函数
module_init(hello_init);// [填空5]: 模块退出宏,指定模块卸载时执行的函数
module_exit(hello_exit);
30.如果我们要做一些实验,需要创建一个临时文件,应该保存在哪里呢?()
用于存储临时文件的目录是 /tmp 或者 /var/tmp。这两个目录通常被设计为供系统或应用程序创建和使用临时文件的地方。
31.创建文件 f1,写入字符串“1234567abcdefg”;
创建文件 f2,写入字符串“ABCDEFG1234567”;
读取file1中的内容,写入file2,使file2中的字符串内容为“1234567abcdefgABCDEFG1234567”
int main(){
int fd1,fd2;
char str[14];
fd1 = [填空1] ; open("f1", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
if(fd1 < 0)
perror("open");
[填空2] ;exit(EXIT_FAILURE);
lseek(fd1,0,SEEK_SET);
fd2 = [填空3] ;open("f2", O_WRONLY | O_APPEND);
if(fd2 < 0)
perror("open");
lseek( [填空4] );lseek(fd2, 0, SEEK_SET);
[填空5] ;
read(fd1,str,14);
lseek(fd2,0,SEEK_SET);
write(fd2,str,14);
close(fd1);
close(fd2);
......
return 0;}
- [填空1]:使用open函数创建或打开文件"f1",以写入方式打开。
- [填空2]:在文件"f1"中写入字符串"1234567abcdefg"。
- [填空3]:使用open函数创建或打开文件"f2",以写入方式打开。
- [填空4]:将文件"f2"的文件指针移动到文件末尾,以便在文件末尾写入。
- [填空5]:在文件"f2"中写入字符串"1234567abcdefgABCDEFG1234567"。
32.以下哪种不是进程的状态( )
A. 运行态(Running State):进程正在执行。
B. 锁定态(Lock State)并不是标准的进程状态。通常,锁定操作更倾向于是一种同步机制,而不是描述进程状态的方式。
C. 睡眠态(Sleep State):进程由于等待某些事件而暂时停止执行,处于等待状态。
D. 停止态(Stopped State):进程被明确暂停执行。
33.fork()函数用于从已存在的进程中创建一个新进程,新进程称为 [填空1] ,其返回值为 [填空2] 而原进程称为 [填空3]。
fork()函数用于从已存在的进程中创建一个新进程,新进程称为子进程,其返回值为0,而原进程称为父进程。
34.当waitpid函数的pid参数设置为()表示等待任一子进程终止。
当waitpid函数的pid参数设置为-1时,表示等待任一子进程终止。这时,waitpid会等待任一子进程结束,并返回第一个终止子进程的信息。这种设置通常用于父进程不关心具体子进程ID的情况,只想等待任意一个子进程的结束。
35.fork()函数在父进程中的返回值是()
对于父进程来说,fork()返回子进程的PID,而对于子进程来说,fork()返回0。
36.阅读以下代码,若execlp调用成功的话,“Done!”会打印输出吗?为什么?
#include<stdio.h>
int main()
{
printf(“Running+ps+with+execlp\n”);
execlp(“ps”,”ps”,”-af”,NULL);
printf(“Done!\n”);
exit(0);
}
在给定的代码中,如果execlp调用成功,那么“Done!”不会打印输出。这是因为execlp函数会将当前进程替换为一个新的进程,如果替换成功,那么在execlp后面的代码将不再执行。
37.常用来进行多任务同步的机制是( )
信号量是一种用于多任务同步的机制,它常用于协调不同进程或线程之间的访问和操作,以防止竞态条件和数据不一致性。信号量通常用于实现互斥锁和条件变量等同步原语。
1)将/home下的test文件复制到/tmp目录下
cp /home/test /tmp
2)将/home目录下的test文件更名为test1
mv test test1
3)创建/home/dir1/dir2,如果dir1不存在,先创建 dir1
mkdir -p /home/dir1/dir2
-p是递归的创建目录,如果中间的目录不存在,会自动创建所有中间目录
4)显示/home目录下的所有文件于目录(包含隐藏文件)
ls -a /home
-a列出目录下的所有文件,包括以点开头的隐藏文件和目录
5)将文件hello.c的访问权限改为 文件所有者可读可写可执行、文件所有者同组的用户可读可写、其他用户可执行
chmod 761 hello.c
6)将/home/dir1目录下所有文件和目录打包并压缩成一个dir1.tar.gz文件
tar cvzf dir1.tar.gz /home/dir1
7)在test文件中查找grep字符串,查找过程中忽略大小写,输出时添加行数
grep -ni "grep" test
-n表示显示匹配行的行号
-i表示执行大小写不敏感的匹配
8)查看/etc/passwd文件后5行内容
tail -5 /etc/passwd
9)将/etc目录中所有以“.d”结尾的文件复制到/tmp/d目录下
find /etc -name "*.d" -exec cp {} /tmp ;
从/etc目录开始查找,-name "*.d"匹配所有以’.d‘结尾的文件或目录
-exec cp {} /tmp ; 对于每一个查找到的匹配项,执行cp命令将其复制到/tmp目录下
{}会被替换为找到的文件或目录的路径
10)给zhangsan用户设置密码123456
passwd zhangsan 123456
11)输出用户通过命令行参数形式提供的多个整数的平均数。具体调用格式如下
$ ./avg 12 34 56 78
Average:45
sum =0
for i in $i
do let sum +=$i
done
avg=$$sum/$#))
echo Average:$avg
$#用于获取命令行参数个数
39.以下哪个不是嵌入式系统设计的主要目标
A 低成本
B低功耗
C超高性能
D实时要求高
40.在vi编辑器中,命令“dd”用来删除当前的
A行
B变量
C字
D字符
41.按下(ctrl c)键能终止当前运行的命令
42.在使用mkdir命令创建新目录时,在其父目录不存在时先创建父目录的选项是
-p
43.如果执行命令#chmod 746 file.txt
那么该文件的权限是
u-读写执行
g-读
o-读写
rwxr--rw-
44.以下哪种不是linux的shell类型
A bash
B ksh
C script
D csh
45.你可编制一个由一系列命令组成的程序,该程序可由shell执行。这种类型的程序称作shell脚本
46.在linux系统中的脚本文件一般以什么开头
#!/bin/bash
#!/bin/sh
47.以下关于gcc选项说法错误的是
A -c只编译并生成目标文件
B -g生成调试信息
C -w生成警告信息 实际上用于关闭编译器产生的警告信息
D -o FILE 生成指定的输出文件
48.对代码文件code.c编译,生成可调式代码的命令是
A #gcc code.c -o code
B #gcc -g code.c -o code
C #gcc -g code.c code
D #gcc -g code
-g 可以生成包含调试信息的可执行文件 -o指定了生成的可执行文件名称为code
49.当前目录下有dir1、dir2文件夹,其中dir1文件夹中有文件s1.sh s2.sh t1.txt
,根据问题,写出相应的shell命令或解释
1)在当前目录下,显示dir1文件夹t1.txt的文件类型与编码格式
file dir1/t1.txt
2)在当前目录下,现把dir1包括子目录拷贝到dir2文件夹中
cp -r dir1 dir2 (-r用于递归的复制目录及内容)
3)在当前栏目录下,建立一个软连接文件link1,该链接文件指向dir1中的t1.txt文件
ls -s dir1/t1.txt link1 ()
4)在当前目录下,赋予dir1中的t1.txt文件的所有用户可读写权限
chmod a+rw dir1/t1.txt
5)在当前目录下,搜索dir1中的t1.txt文件的find字符串,同时输出行号
grep -n“find” ./dir1/t1.txt
6)在当前目录下,建立d3文件夹,并设置666的权限
mkdir -m666 d3
7)切换到user1用户
su user1
8)获取login命令的帮助信息
man login
9)在当前目录下,统计dir1中的s1.sh文件中的内容
cat dir1/s1.sh | wc
使用wc命令统计字符数
10)在当前目录下,统计dir1中的t1.txt文件中的字符个数并将结果输入到当前目录下w1.txt文件中
cat dir1/t1.txt | wc -c >w1.txt
50.阅读下面的shell脚本 ,说明其执行过程
for i in $*;
do
find "$i" -name "*.txt" -exec rm -rf {} ; 递归删除 .txt文件
[-z "ls $i"] &&{rmdir "$i"} 如果目录为空 ,那么删除目录
done
51.设计一个shell程序,实现用户可以通过命令行参数形势提供的多个整数,程序输出所有的整数
#!/bin/bash
sum = 0
for i in $*
do
let sum+=$i
done
echo "sum is $sum"