最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

嵌入式linux系统 -01-shell编程的理解

XAMPP案例 admin 990浏览 0评论
每日心灵鸡汤:除了0和1的世界,我一无所爱 -fq

 

一、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的关系图

e034

转载请注明:XAMPP中文组官网 » 嵌入式linux系统 -01-shell编程的理解

您必须 登录 才能发表评论!