一、shell编程的理解?
1、什么是shell编程?
shell编程通过shell语法写出来的一个文件,这个文件称之为shell脚本。例如:”~/.bashrc”,”/etc/profile”。
shell语法有自身独特的变量,循环结构,分支结构。
2、在linux下,如何解析命令?是谁在解析命令?
1)怎么理解shell?
shell在英文中被翻译为”贝壳”,在贝壳的内部叫内核,在贝壳的外部叫用户,用户与内核之间交互必须通过shell来进行解析。
例子:
用户输入 shell解析器 内核
ls ————–> ls是shell命令,需要解析 ———> 通知内核列出当前目录的所有文件名
2)解析命令必须有一个命令行,如果没有命令行,命令就无法生效。
命令行怎么来的?
-> 打开一个终端,默认执行一个程序,这个程序是/bin/bash,这个bash就是shell解析器,这个命令就是bash程序运行之后打印出来的。
3)命令行、命令、bash程序,终端之间的关系?
PID PPID
gec 9146 1669 0 00:27 ? 00:00:00 /usr/lib/gnome-terminal/gnome-terminal-server -> 终端
gec 9152 9146 0 00:27 pts/4 00:00:00 bash -> bash解析器(命令行)
gec 9190 9152 0 00:36 pts/4 00:00:00 ps -ef -> 命令
结论:
命令行是bash解析器产生的,所以命令行就等价于bash解析器
命令是bash解析器的子进程。
命令行是终端的子进程。
4)bash解析器在哪里?
gec@ubuntu:~$ which bash
/bin/bash
二、shell编程?
1、 什么是shell脚本?
其实就是shell语法组织起来的一个文件,将来运行这个文件时,就会依次运行里面的每一行命令,这个存放着命令的文件叫shell脚本。
2、 C语言程序与shell脚本的区别?
C语言程序 shell脚本
============================================================
语法 C语言 shell语法
是否需要编译 需要编译 不需要编译
文件后缀 xxxx.c xxxx.sh
3、 C语言程序与shell脚本运行步骤。
C语言:
1)创建文件: touch xxx.c
2)编辑文件: gedit xxx.c
3)编译文件: gcc xxx.c -o xxx (使用gcc生成的文件,默认都是有执行权限)
4)执行文件: ./xxx
shell:
1)创建文件: touch xxx.sh
2)编辑文件: gedit xxx.sh
3)修改权限: chmod 777 xxx.sh
4)执行文件: ./xxx.sh
三、shell脚本中helloworld程序。
shell脚本中没有main函数,不能调用C语言函数,不需要包含头文件,但是一定要指定一个内容: 解析器的路径。
1)怎么指明解析器?
只需要在shell脚本的第一行写上:#!/bin/bash
2)如何输出字符串到终端上? -> man echo
功能: echo – display a line of text
//显示一行文本内容
使用格式:
echo [SHORT-OPTION]… [STRING]…
功能描述: Echo the STRING(s) to standard output.
//将字符串显示在标准输出上
-n do not output the trailing newline
//不会再开一个新的行。
-e enable interpretation of backslash escapes
//解析字符串上的转义字符
gec@ubuntu:~$ echo helloworld
helloworld
gec@ubuntu:~$ echo -n helloworld
helloworldgec@ubuntu:~$
gec@ubuntu:~$ echo “hello\n”
hello\n
gec@ubuntu:~$ echo -e “hello\n”
hello
综上所述,helloworld程序,应该这样写:
#!/bin/bash
echo helloworld
练习1: 写一个脚本,要求输出以下的信息。
./xxx.sh
GZ2057<Tab键>guanguoyuan<Tab键>192.168.14.2
GZ2057
guanguoyuan
192.168.14.2
#!/bin/bash
echo -e “GZ2057\tguanguoyuan\t192.168.14.2”
echo -e “GZ2057\nguanguoyuan\n192.168.14.2”
四、shell脚本中变量的定义。
1、shell语法中变量定义规则与C语言一致,只能使用数字、字母,下划线组成,并不能以数字开头。
2、shell变量在定义时不需要数据类型,因为变量默认都是字符串类型。
C语言: int a / char b
shell: a -> 默认就是字符串类型。
3、shell语法中对变量的赋值时,等号两边不允许有空格。
C语言: int a = 100; / int a=100; -> OK
Makefile: CC = gcc / CC=gcc -> OK
shell: a=helloworld -> OK
a = helloworld -> error
4、shell语法变量引用,需要变量的前面添加$
C语言:
int a = 100;
printf(“a = %d\n”,a); -> 在C语言中引用变量中不需要添加任何符号。
shell:
a=helloworld
echo $a
5、变量种类
1)自定义变量 str=hello -> str就是自定义变量
2)系统环境变量 -> 通过shell命令“env”就可以查看。
PATH=/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin
3)命令行变量 -> 类似于C语言中argc与argv
C语言: ./hello aaa bbb
argc = 3
argv[0] = “./hello”
argv[1] = “aaa”
argv[2] = “bbb”
shell脚本: ./hello.sh aaa bbb ccc
$#: 命令行中额外(不算”./hello.sh”在内)的参数个数 $#=3
$1: 第一个额外的参数 $1=aaa
$2: 第二个额外的参数 $2=bbb
$3: 第三个额外的参数 $3=ccc
$*: 代表所有的参数 $*=aaa bbb ccc
$?: 最后一条shell命令执行后返回值
shell命令执行成功: 0
执行失败: 非0
练习2: 写一个命令行传参的helloworld程序,顺便验证$#,$1,$2,…$n,$?是不是对的。
#!/bin/bash
echo $#
echo $1
echo $2
echo $*
echo $?
gec@ubuntu:/mnt/hgfs/GZ2057/11 shell编程/01/code$ ./p2.sh aaa bbb
2
aaa
bbb
aaa bbb
0
五、shell编程符号。
1、双引号
作用: 将某一块东西变成一个值。
1)空格问题
当一个字符串中没有空格
str=helloworld -> 正确
str=”helloworld” -> 正确 -> 加不加双引号都无所谓。
当一个字符串有空格时
str=hello world -> 错误
str=”hello world” -> 正确 -> 必须写上双引号
2)在””里面可以引用变量?
可以
#!/bin/bash
str=world
a=”hello $str”
echo $a
3)在””能不能使用一些linux命令?
可以使用,但是要使用反引号(“)标识出来。
#!/bin/bash
echo “today is date” –> 结果: today is date
echo “today is `date`” –> 结果: today is Sat Oct 10 02:03:14 PDT 2020
2、单引号
作用: 将单引号括起来的内容看作是一个字符串。
echo ‘today is `date`’ -> 结果: today is `date`
3、反引号
作用: 把双引号中的命令标识出来。
六、字符串处理。
1、计算字符串中字符个数。
str=ashdfahsdvaysfdtfavbdstfasdfashdfahsdvaysfdtfavbdstfasdfashdfahsdvaysfdtfavbdstfasdfashdfahsdvaysfdtfavbdstfasdfashdfahsdvaysfdtfavbdstfasdfashdfahsdvaysfdtfavbdstfasdf
echo “${#str}”
2、删除字符串左边/右边一些字符
常用通配符: 通用匹配符号
*: 代表任意长度的任意字符
?: 代表一个长度的任意字符
[a-z]: 代表一个长度的a-z之间的字符
[az]: 代表一个长度,只能匹配a/z字符。
[^az]: 代表一个长度,只能匹配除了a/z之外的字符
#: 从左到右尽可能匹配少的字符。
##:从左到右尽可能匹配多的字符。
%: 从右到左尽可能匹配少的字符。
%%:从右到左尽可能匹配多的字符。
删除字符串左边一些字符,例如:
str=hello320abc20world
echo “${str#*20}” -> 从左到右尽可能少地去删除”*20″这种东西 结果: abc20world
echo “${str##*20}” -> 从左到右尽可能多地去删除”*20″这种东西 结果: world
echo “${str##*[^ac]20}” -> 从左到右尽可能多地去删除”*[^ac]20″这种东西 结果: abc20world
看到*a20 *c20不删
echo “${str##*[ac]20}” -> 从左到右尽可能多地去删除”*[ac]20″这种东西 结果: world
*a20 *c20 直接删除
删除字符串右边一些字符,例如:
echo “${str%%20*}” -> 从右到左尽可能多地去删除”20*”这种东西 结果:hello3
echo “${str%20*}” -> 从右到左尽可能少地去删除”20*”这种东西 结果:hello320abc
练习3: 有以下字符串,求:
str=hello345abcde456world321hello123world35645hello
1)字符个数? echo “${#str}” -> 47
2)echo “${str##*3[a-z]}” *3一个字母 -> orld35645hello
3)echo “${str%3[a-z]*}” 3一个字母* -> hello345abcde456world321hello12
shell的关系图
转载请注明:XAMPP中文组官网 » 嵌入式linux系统 -01-shell编程的理解