SHELL被忽略的常识

往往被shell奇异的外表和不厌其烦的管道所吸引,拿起来就像直接解决某个问题或者实现某项功能,而一些基本内容容易被忽略

1:交互式程序

python的交互十分简易,命令行输入python就进入了交互模式,十分方便;一般shell要么命令行输入某个命令,要么直接写入到shell脚本文件当中执行,其实假如是测试小段代码,可以将shell脚本以交互的形式写入命令行

[lihui@localhost ~]$ for myfile in *
> do
> if grep -l stdio $myfile
> then
> more $myfile
> fi
> done
lihui.c
#include <stdio.h>

void main(){
    printf(“Hello World!\n”);
}

这个例子就是搜索当前目录包含stdio内容的文件;当shell期待进一步输入的时候,shell提示符就会变成>,然后可以一直输入下去,直到shell来判断你输入完毕,进而执行该段程序

2:变量都会当作字符串

shell里,虽然变量使用不需要先声明,可以直接赋值创建他们,但是在默认情况下,所有变量都会当作是字符串来进行储存,就算被赋值为其它类型也是如此,假如是数值类型,shell在需要的时候,会将数值型字符串转换成对应的数值来进行操作

shell里可以通过变量名前加一个$符号来访问它的内容,但在为变量赋值时,只需要使用变量名,变量就会根据需要自动创建

3:算术运算

刚用shell的时候,时常感到郁闷,有时候赋值的地方出错,还有就是下面这种问题

[lihui@localhost ~]$ a=1+2
[lihui@localhost ~]$ echo $a
1+2

原因?就是上面说的,当成是字符串来存储,假如想获取算术运算的结果呢?下面有四种方法:

[lihui@localhost ~]$ a=`expr 1 + 2`
[lihui@localhost ~]$ echo $a
3
[lihui@localhost ~]$ a=$[1+2]
[lihui@localhost ~]$ echo $a
3
[lihui@localhost ~]$ a=$((1+2))
[lihui@localhost ~]$ echo $a
3
[lihui@localhost ~]$ let a=1+2
[lihui@localhost ~]$ echo $a
3

第一种方法+两边空格不能去掉,否则还是会输出字符串,具体可以去查阅expr用法

[lihui@localhost ~]$ a=`expr 1+2`
[lihui@localhost ~]$ echo $a
1+2

4:shell的识别

(1)shell里自带的,内建命令

(2)函数,通常写在脚本文件中用来执行的

(3)外部命令,通常是调用其它新的进程执行的命令,比如管道调用,系统调用等,通常分为几步:

a.建立一个新的进程

b.在新的进程中,通过系统PATH路径下,寻找特定命令,或者系统调用

c.找到了特定命令或者系统调用后代替shell脚本运行

d.新的进程调用的执行完毕之后,才会回到原本的shell命令或者脚本,继续下一句

发表回复