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的结果当命令去执行了
- :竖杠 ( | ) 管道,将竖杠前面的输出,作为后面命令的输入,或者作为后面命令的参数。
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
打开终端。
在终端中输入 type 可以查看命令是内部命令还是外部命令。格式为:
type 要查看的命令
例如,我们要查看 cd 命令是否为内部命令,可以键入 type cd。从返回的结果可以看出, cd 是一个内部命令。
我们再来看一个命令 shutdown。键入 type shutdown 可以看到,它是一个外部命令。该命令的路径为 /sbin/shoutdown。
5
最后,我们可以检测一下 type 命令本身到底是内部还是外部命令,键入 type type。由结果可知,type 是一个内部命令。