首先介绍最基本的啦:
shell脚本中用#表示注释,相当于C语言中的//注释,但如果#位于第一行,则表示脚本使用后面指定的解释器/bin/bash解释执行
shell脚本的执行方式:(现有一个shell脚本test.sh)
(1)chmod u+x test.sh
./test.sh
(2)bash test.sh
shell脚本是文本文件,并不能被计算机直接识别,是如何不用编译直接运行的呢?
答:系统先把shell脚本的命令行解释器加载到内存中,再把shell脚本作为命令行参数传递给解释器,所以执行shell脚本就相当于执行程序
shell执行的过程:
命令行解释器收到作为参数传递过来的shell脚本之后,会创建出一个子进程,由exec程序替换到子进程的子shell(子解释器),让子进程去运行这个shell脚本,父进程在后台等待子进程结束,当子进程运行完shell脚本或者运行出错的时候,就会退出。
当子进程要运行shell脚本的时候,会一行一行读取,即一个命令一个命令读取,读取到一行后,会参照bash运行原理,会再创建一个子进程,让子进程去运行这一行的命令,当这一行命令运行结束后,就会继续读取下一行的命令,运行下一行的命令的时候,还是继续创建子进程,让子进程去运行该行的命令。如果shell脚本中有类似以下的语句:
if [ $? -eq 1 ]
then
echo "failed"
else
echo "succeed"
fi
其中then是一条命令,then后面有换行,但这条命令没写完,shell会自动续行,把下一行接在then后面当作一条命令处理
这时候可能我们就会想,难道这个shell脚本里面有几千行,就要去fork出几千个子进程嘛?
这个问题嘛,也不一定啦,如果shell脚本中有内置命令的话,就会少fork一些子进程啦
那什么是内置命令呢?和普通命令又有什么区别呢?
答:内置命令被认为是bash内部的一个函数,如果在运行的时候,识别命令是内置命令,就像执行bash内部的函数一 样,不会fork子进程。
区别:需要创建子进程的为普通命令,而不需要创建子进程的就为内置命令啦,比如我知道的内置命令有: cd export env set unset
那有没有办法可以让运行shell脚本的时候不创建子进程,让父进程来运行脚本呢?
答案当然是有啊,世界这么大,还能没几个大神解决这个小case嘛,哈哈哈
第一种方法: source test.sh
第二种方法: . ./test.sh
source和.命令是shell的内建命令,这种方式不会创建子shell,而是直接在交互式shell下逐行执行脚本中的命令
shell变量:环境变量、本地变量
环境变量:环境变量可以从父进程传给子进程,用env命令可以显示当前shell进程的环境变量
本地变量:只存在于当前shell进程,用set命令可以显示当前shell进程中定义的所有变量(包括本地变量和环境变量)和函数。
NOTE:定义变量的时候等号两边都不能有空格,否则会被shell解释成命令和命令行参数
比如:g_val=200 这样是对的
g_val = 200 这样是错的
NOTE:shell内部使用统一的类型,统一以字符串存储
通配符:通配符我了解的不多,这里只介绍*、?、[ ]这三个(? * []由shell展开)
*:匹配0个或多个任意字符
?:匹配一个任意字符
[若干字符]:匹配方括号中任意一个字符的一次出现
例子:(加入现在有文件名test0--test100的文件)
ls test?
输出:test0 test1 test2 test3 test4 test5 test6 test7 test8 test9
ls test*
输出:test0 test1 test2......test100
ls test[56]
输出:test5 test6
ls test[56][56]
输出:test55 test 56 test 65 test 66删除test0--test100
rm -f test[0-9]*
命令替换:`或$() (举例最好说明了,哈哈哈)
你们知道`这个叫什么嘛,我第一次看到的时候,很顺口的就说了句撇号,哈哈哈,不知道会不会有人和我一样呢,其实它叫反引号
在终端的上输入_time= data + %Y:%m:%d-%H:%M:%S就可以显示当前的年月日和时分秒
但是在shell脚本中,如果输入同样的是会报错的,为什么呢?因为输入的里面有空格,在shell中,空格也是一个命令,会被解释成命令或者命令行参数,当然大家都会说解决这个问题最好的办法不就是把空格去掉嘛,这是确实,但是我举这个例子不是为了去掉空格啊
在不去掉空格的情况下,怎么才能让它不报错呢,当当当当,当然是要有请我们的主角上场了
_time= `data + %Y:%m:%d-%H:%M:%S`
加反引号的作用是把反引号里面的当作一个整体执行完之后赋给_time
或者_time=$(data + %Y:%m:%d-%H:%M:%S),作用也是一样的啦
好啦,今天就写到这里吧,最近各种内推和校招都开始了,希望各位童鞋面试顺利啦,嘿嘿嘿