shell 编程

本文详细介绍了Shell编程的基础知识,包括Shell脚本的理解、Linux下命令的解析过程、Shell脚本的编写与执行步骤,以及变量定义、字符串处理和基本的字符串操作。文中通过实例演示了如何创建和运行Shell脚本,以及如何处理命令行参数。此外,还讲解了变量的定义规则、特殊字符的使用,以及字符串长度计算和截取等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值