关于shell脚本

首先介绍最基本的啦:吐舌头

 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),作用也是一样的啦


好啦,今天就写到这里吧,最近各种内推和校招都开始了,希望各位童鞋面试顺利啦,嘿嘿嘿












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值