shell编程

本文介绍了 Linux 系统中的 shell 编程基础知识,包括 shell 的概念、内部与外部命令的区别、shell 脚本的编写方法及应用场景,以及变量、特殊符号等核心元素的使用技巧。

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

linux命令有内部命令和外部命令之分。内部命令实际上是shell程序的一部分,其中包含的是一些比较简练的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以它们包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调进内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell 程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。

 

1、什么是shell?

shell其实就是一个命令的解析器。

有很多不同版本的命令的解析器。bash、 SHELL=/bin/bash,这里就说明了,我们终端这个命令的解析器是这个:/bin/bash

sh-->dash , busybox--->sh。

在shell脚本第一行要加上

#!/bin/bash 加上这个是指定用哪一个命令解析器来解析我们这个脚本。

 

2、shell编程?

 

通过shell编程的一些语法规则,把这些命令写到一个文件里面,这个文件就是一个shell脚本,它可以实现一些自动的处理,无人值守的操作。

方便我们对系统进行配置和管理。

 

例如应用场景:

1、自动烧写系统。

2、sh.sh编译程序。//   vi test.sh//脚本文件

3、比如系统的配置、环境变量的配置、开机就启动一些程序。

 

 

3、如何写一个shell脚本,怎么样实现shell编程?

 

shell脚本和C语言有什么区别?

 

1、对应变量的声明来说,C语言,是一种强类型的语言,在使用变量之前需要先声明这个变量的类型。

对于shell脚本来说,它是一种弱类型的语言,不需要事先声明。

2、这个脚本是一个解析性的程序,只需要把命令写进去就可以执行了,shell命令解析器会去解析这些命令,然后执行。//不用编译

对于c语言来说,写完之后,需要 预处理,编译,汇编,链接,才能变成可执行的程序。

 

 

shell编程里面,变量的使用和定义:

 

(1)、自定义的变量,不需要先声明变量,直接使用就可以了。只有字符串的类型,支持整型数据的运算。

 

 

unset:取消这个变量

readonly:说明这个变量是只读

export:指定为全局变量。

declare  -i a=5  (这种声明不通用,有的命令解析器不支持) //变量声明为数值型

特别注意:等号前后不能有空格!!!!!!!

 

 

 

不支持其他类型,比如不支持浮点型的变量。

 

(2)、命令行的变量(特殊变量)。就是我们在运行这个脚本的时候,在命令上面输入的参数。

 

$0  表示命令行第一个参数,就是这个脚本的名字

$1  表示命令行第二个参数。

$2  表示命令行第三个参数。

$*  表示命令行的所有参数,除了这个脚本的名字

$#  表示命令行参数的个数(不包含这个脚本的名字)

$? 表示上一条命令执行的结果(如果前面一条命令执行成功返回0,如果执行失败,就返回非零)

$$  表示这个脚本运行起来之后的PID

 

如果说要输出特殊的变量,需要在前面加一个反斜杠 \$0,这样输出的就是$0

.sh文本内容:

#!/bin/bash

path="caobo"

echo $0

echo $1

echo $2

echo $*

echo $#

echo $?

echo $$

echo \path: $path

 

运行结果:

gec@ubuntu:/mnt/hgfs/share$ ./test2.sh caobo chensu

./test2.sh

caobo

chensu

caobo chensu

2

0//表示没有出错

3375//脚本PID号

path: caobo//格式化显示

 

 

(3)、shell环境变量。使用命令:env可以查看得到,会有很多东西打印出来,这些就是环境变量)

HOME: 表示用户的家目录。

PATH:命令和可执行程序所在的路径。

LD_LIBRARY_PATH: 动态库的搜索路径。 -L/home/gec/jpeg-8a/install/lib/  -ljpeg

export LD_LIBRARY_PATH=/home/gec/jpeg-8a/install/lib/:$LD_LIBRARY_PATH

 

 

shell种的一些特殊符号:

 

(1):双引号( " "      ) 双引号内部,可以嵌套一些命令,这个命令需要用反引号引起来

(2):单引号( ' '      ) 在单引号内部一律保存为字符串。

(3):反引号( ` `      ) 反引号可以用于双引号内部去执行一些命令,如果单独使用,会将命令的结果作为命令去执行。

程序:

#!/bin/bash

echo  "`cal`"

echo '`cal`'

 echo `cal`

 

 

运行结果:

 

  August 2018       

Su Mo Tu We Th Fr Sa  

          1  2  3  4  

 5  6  7  8  9 10 11  

12 13 14 15 16 17 18  

19 20 21 22 23 24 25  

26 27 28 29 30 31     

                      

`cal`

August 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5  6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31//将cal的结果当命令去执行了

 

 

 

 

  1. :竖杠  (  |       ) 管道,将竖杠前面的输出,作为后面命令的输入,或者作为后面命令的参数。

gec@ubuntu:/mnt/hgfs/share$ ls | wc -w

427

wc -w计算单词个数

Ctrl+d退出

 

grep -R 字符串

筛选哪些文件里面有这些字符串;

gec@ubuntu:/mnt/hgfs/share$ grep -R "caobo"

1.c: printf("caobo nihao\n");

匹配到二进制文件 1.txt

a.txt:caobo

a.txt:caobo.mp4

find1.c: jpeg_display("caobo/1.jpg");

find1.c: jpeg_display("caobo/2.jpg");

匹配到二进制文件 fread.c

fread1.c:kk2caobojkjkj

mp4player.c: head=dirsize("caobo",head);

mp5player.c: head=dirsize("caobo",head);

匹配到二进制文件 ss.c

test.sh:myname="caobo"

匹配到二进制文件 text11

text11.c: char *buf="caobo";

text14.c: strcpy(p,"caobo");

text5.c: char a[20]="caobo";


从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行

find / -type f -name "*.log" | xargs grep "ERROR"

例子:从当前目录开始查找所有扩展名为.in的文本文件,并找出包含”thermcontact”的行

find . -name "*.in" | xargs grep "thermcontact"

 

 

find . -name "*.c"|xargs grep "caobo"

 

 

(5)重定向( <  >  >> ) 要将默认输出或者输入的来源修改, > 就是输出重定向 ,< 输入重定向  >> 输出重定向,但是是追加的方式   //>会清空原目录里面的文件

  默认输入和输出前面的数字可以不用加,但是出错的时候,需要在前面加上2.  2>表示标准出错输出到一个文件。

三种应用:

Ls 1>a.txt//ls的结果会保存到a.txt里面

Wc _w 0<a.txt//a.txt里面的单词个数会显示在终端上

Ls qwe 2>error.txt//错误信会保存到error.txt文件里面

 

 

 输出重定向,可以应用在我们编译一些大工程的时候,编译输出的信息太多了,如果我们需要查找一些出错的 信息就比较困难,然后我们可以用标准出错重定向到一个文件里面去。然后编译结束之后,我们查看这个文件 查找出错发送在什么地方

 

应用:

gec@ubuntu:/mnt/hgfs/share$ make uuu 2>error.txt

cc     uuu.c   -o uuu

gec@ubuntu:/mnt/hgfs/share$ cat error.txt

uuu.c: In function ‘main’:

uuu.c:11:9: warning: missing terminating " character [enabled by default]

  printf("lklklk);

         ^

uuu.c:11:2: error: missing terminating " character

  printf("lklklk);

  ^

uuu.c:12:2: error: expected expression before ‘return’

  return 0;

  ^

uuu.c:13:1: error: expected ‘;’ before ‘}’ token

 }

 ^

make: *** [uuu] 错误 1

 

黑洞:/dev/null   

 ls  >   /dev/null 这个黑洞,把东西丢在这里,就会被吃掉。

什么都不会显示

 

如何区分是内部命令还是外部命令:用type

  1.  

打开终端。

在终端中输入 type 可以查看命令是内部命令还是外部命令。格式为:

  1.  

    type  要查看的命令

  1.  

例如,我们要查看 cd 命令是否为内部命令,可以键入 type cd。从返回的结果可以看出, cd 是一个内部命令。 

  1.  

  1.  

我们再来看一个命令 shutdown。键入 type shutdown 可以看到,它是一个外部命令。该命令的路径为 /sbin/shoutdown。

  1.  

  1.  
  2.  

5

  1.  

最后,我们可以检测一下 type 命令本身到底是内部还是外部命令,键入 type type。由结果可知,type 是一个内部命令。

  1.  

  1.  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值