GUI(图形用户界面)
定义与特点:
GUI全称为Graphical User Interface,即图形用户界面。
它是一种采用图形方式显示的计算机操作用户界面,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。
GUI由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成。
功能与优势:
GUI实现了人与计算机等电子设备的人机交互,是用户与操作系统之间进行数据传递和互动操控的工具。
相比传统的字符界面,GUI具有直观、易用、美观等优点,能够显著提高用户的使用效率和满意度。
它综合了人机工程学、认知心理学、设计艺术学、语言学、社会学、传播学等众多学科领域的知识,已经成为现代电子产品不可或缺的一部分。
cmdline(命令行界面)
定义与特点:
cmdline即命令行界面,是一种基于文本的界面,用户通过输入命令来与计算机进行交互。
在命令行界面中,用户不能直接使用鼠标进行操作,而是需要通过键盘输入命令来完成各种任务。
命令行界面具有高度的灵活性和可定制性,用户可以通过编写脚本来自动化完成复杂的任务。
应用场景:
命令行界面在Linux等操作系统中得到了广泛应用,尤其是在服务器管理、程序开发等领域。
对于专业人士来说,熟练掌握命令行界面是提高工作效率的重要手段之一。
什么是shell
Shell 是一种命令行界面(CLI),它允许用户与操作系统(如 Linux 或 Unix)进行交互。Shell 充当了用户与操作系统内核之间的桥梁,接收用户输入的命令,并将其转换为内核能理解的形式执行。执行完毕后,Shell 会将结果返回给用户。简单来说,Shell 是用户与操作系统之间的接口。
Shell 的功能非常强大,它不仅可以执行系统命令,还可以编写复杂的脚本,以自动化执行一系列的任务。这些脚本可以包含条件判断、循环、函数调用等高级编程特性,使得 Shell 编程在系统管理、自动化部署、批处理任务等方面具有广泛的应用。
Shell 有多种类型,每种类型都有其独特的特点和用法。在 Unix 和类 Unix 系统(如 Linux)中,最常见的 Shell 包括以下几种:
Bourne Shell (sh): 这是最初的 Unix Shell,由 Stephen Bourne 在 1970 年代编写。它奠定了后续 Shell 的基础。
Bourne Again SHell (bash): bash 是 Bourne Shell 的一个增强版,由 Brian Fox 和 Chet Ramey 开发。它增加了很多新的特性,比如命令和文件名的补全、作业控制、命令行编辑等。bash 是目前大多数 Linux 发行版的默认 Shell。
C Shell (csh) 和 TENEX C Shell (tcsh): 这些 Shell 类似于 C 语言的语法,提供了更强大的编程能力。它们特别适合那些熟悉 C 语言的用户。
Korn Shell (ksh): 由 David Korn 开发,旨在成为 sh 和 csh 的超集,同时提供了一些新的特性,如命令别名、数组变量等。
Z Shell (zsh): zsh 是一个功能强大的 Shell,它提供了比 bash 更多的特性,比如改进的自动补全、更灵活的命令别名等。
shell实战1-从零写最简单shell
使用printf和scanf做输入回显
#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 256
int main(void)
{
char str[MAX_LINE_LENGTH];//存放用户输入的命令内容
while (1)
{
//打印命令行提示符,注意不能加换行
printf("aston#");
//清除str数组的内容
memset(str,0,sizeof(str));
//shell第一步 获取用户输入的命令
scanf("%s",str);
//shell第二步 解析用户命令
//shell第三步 出来用户命令
printf("%s\n",str);
}
return 0;
}
定义简单命令集
#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 256 //命令长度限制
#define MAX_CMD_NUM 100 //最多支持的命令数目
//定义一些标准命令
#define led "led"
#define lcd "lcd"
#define pwm "pwm"
#define MAX_CMD_NUM_TMP 3 //当前最多支持的命令数目
static void init_cmd_set(void);
char g_cmdset[MAX_CMD_NUM_TMP][MAX_LINE_LENGTH];
int main(void)
{
int i = 0;
char str[MAX_LINE_LENGTH];//存放用户输入的命令内容
init_cmd_set();
while (1)
{
//打印命令行提示符,注意不能加换行
printf("aston#");
//清除str数组的内容
memset(str,0,sizeof(str));
//shell第一步 获取用户输入的命令
scanf("%s",str);
//shell第二步 解析用户命令
//shell第三步 出来用户命令
for (i = 0; i<MAX_CMD_NUM_TMP; i++)
{
if(!strcmp(str,g_cmdset[i])){//相等 找到了命令
printf("输入的 %s 是合法的\n",str);
break;
}
}
if(i>=MAX_CMD_NUM_TMP)
{//找遍了 都没有找到
printf("%s 不是合法命令\n",str);
}
}
return 0;
}
//初始化命令列表
static void init_cmd_set(void)
{
memset(g_cmdset,0,sizeof(g_cmdset));
strcpy(g_cmdset[0],led);
strcpy(g_cmdset[1],lcd);
strcpy(g_cmdset[2],pwm);
}
shell脚本的运行机制:解释运行
(1)C语言(C++)这种编写过程是:编写出源代码(源代码是不能直接运行的)然后编译链接形成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行(没有编译链接过程)
(2)shell程序是解释运行的,所谓解释运行就是说当我们执行一个shell程序时,shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。(顺序结构)
(3)CPU实际只认识二进制代码,根本不认识源代码。脚本程序源代码其实也不是二进制代码,CPU也不认识,也不能直接执行。只不过脚本程序的编译链接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行的解释执行时才去完成脚本程序源代码转成二进制的过程(不一定是编译链接,因为这行脚本程序可能早就编译连接好了,这里我们只是调用它)的。
编辑器、编译器、运行方法(脚本的3种执行方法)
(1)shell程序是文本格式的,只要是文本编辑器都可以。但是因为我们的shell是要在linux系统下运行的,所以换行符必须是’\n’,而windows下的换行符是"\r\n",因此windows中的编辑器写的shell不能在linux下运行。所以我们整个课程都是在linux下使用vi编辑器(实际上是vim)进行编写调试的。
(2)编译器 不涉及,因为shell是解释性语言,直接编辑完就可以运行。
(3)shell程序运行的运行有多种方法,这里介绍三种方法:
第一种:./xx.sh,和运行二进制可执行程序方法一样。这样运行shell要求shell程序必须具有可执行权限。chmod a+x xx.sh来添加可执行权限。
第二种:source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限。
第三种:bash xx.sh,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash程序,然后把xx.sh作为argv[1]传给他运行。
#!/bin/sh
# 注释
string="hello" # 定义 初始化
echo $string # 使用
echo "${string}world" # 使用
shell中无引用、单引号和双引号的区别
(1)shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出"或者其他转义字符。
(2)shell中也可以使用单引号来表示字符串,也是直接使用的,不能输出转义字符。
(3)单引号中:完全字面替换(不可包含单引号本身)
(4)双引号中:
$加变量名可以取变量的值
反引号仍表示命令替换
表示
表示
表示的字面值 输出$符号
表示
的字面值
"表示"的字面值
\表示\的字面值
除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。
shell中调用linux命令
(1)直接执行
(2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。
结构
# 读取用户输入
echo "请输入一个数字(1, 2, 或 3):"
read num
# 使用 if-elif-else 结构根据输入执行不同的操作
if [ "$num" -eq 1 ]; then
echo "你输入了 1"
elif [ "$num" -eq 2 ]; then
echo "你输入了 2"
else
if [ "$num" -eq 3 ]; then
echo "你输入了 3,但是这部分本来可以通过 elif 来简化。"
else
echo "你输入的不是 1、2 或 3。"
fi
fi
(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
判断目录是否存在 (-d)
判断字符串是否相等("str1" = "str2"),注意用一个等号而不是两个
打印出从1到5的数字
for i in {1..5}
do
echo "Number $i"
done
while循环在给定条件为真时重复执行一系列命令
譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),i++的写法中有两层括号。
counter=4
while [ $counter -le 5 ]
do
echo "Counter is $counter"
let counter++
done
判断文件是否存在
# 定义文件路径
file_path="/path/to/your/file.txt"
# 使用if语句和-f选项判断文件是否存在
if [ -f "$file_path" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
echo的创建和追加输入文件
(1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。
(2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。
会创建(或覆盖)file.txt 文件,并写入文本“这是第一行文本。”。
echo "这是第一行文本。" > file.txt
将文本追加到文件的末尾,而不是覆盖文件内容,可以使用 >> 重定向操作符。
echo "这是追加的一行文本。" >> file.txt
逻辑与(AND)
if [ -f file1.txt ] && [ -f file2.txt ]; then
echo "两个文件都存在"
else
echo "至少有一个文件不存在"
fi
[ -f file1.txt ] && [ -f file2.txt ] && echo "两个文件都存在" || echo "至少有一个文件不存在"
逻辑或(OR)
if [ ! -f file1.txt ] || [ ! -f file2.txt ]; then
echo "至少有一个文件不存在"
else
echo "两个文件都存在"
fi
[ ! -f file1.txt ] || [ ! -f file2.txt ] && echo "至少有一个文件不存在"
字符串是否相等
# 定义两个字符串变量
str1="Hello, World!"
str2="Hello, World!"
str3="Goodbye, World!"
# 使用if语句和单个等号(=)来比较字符串
if [ "$str1" = "$str2" ]; then
echo "str1 和 str2 相等"
else
echo "str1 和 str2 不相等"
fi
# 另一个比较示例
if [ "$str1" = "$str3" ]; then
echo "str1 和 str3 相等"
else
echo "str1 和 str3 不相等"
fi
if [ -z "$str3" ]; then
echo "str3 为空"
else
echo "str3 不为空"
fi
case
#!/bin/sh
# 读取用户输入
echo -n "请输入一个数字(1-3): "
read num
# 使用case语句根据输入的数字执行不同的操作
case $num in
1)
echo "你输入了 1"
;;
2)
echo "你输入了 2"
;;
3)
echo "你输入了 3"
;;
*)
echo "无效输入,请输入1、2或3"
;;
esac
echo "脚本执行完毕"
case 和while
#!/bin/bash
echo -n "请输入一个数字(1-3): "
read num
count=1
# 使用while循环,当count小于或等于num时执行循环体
while [ $count -le $num ]; do
# 使用case语句根据count的值执行不同的操作
case $count in
1)
echo "这是第 $count 次循环"
;;
2)
echo "已经循环到第 $count 次了"
;;
3)
echo "这是最后一次循环,count=$count"
;;
*)
# 这个分支通常不会执行,因为count的值被严格控制在1到3之间
echo "不可能执行到这里,除非count的值不是1, 2, 或 3"
;;
esac
# 计数器加1
((count++))
done
echo "循环结束"
传参
#!/bin/sh
# 显示脚本名称
echo "脚本名称: $0"
# 显示传递给脚本的参数个数
echo "参数个数: $#"
# 显示所有传递给脚本的参数
echo "所有参数: $*"
echo "所有参数(独立): $@"
# 显示第一个参数
echo "第一个参数: $1"
# 显示第二个参数(如果存在)
if [ "$#" -ge 2 ]; then
echo "第二个参数: $2"
else
echo "没有第二个参数"
fi
# 你可以继续以这种方式访问更多的参数
执行source hello.sh Hello World
学习记录,侵权联系删除。
来源:朱老师物联网大课堂