shell基础知识


Shell的作

是解释执用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),

Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执完,而不必一条一条地敲命令。

历史上有很多shell(如:sh,csh,ksh,tcsh),还有bash。

shell执行脚本

#!/bin/bash
echo "this is a test"
cd ..
ls

执行结果:

shell学习第一天_第1张图片

Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执。

执行方式:chmod +x exe.sh

Shell会fork一个子进程并调用exec执行./script.sh这个程序,exec系统调用应该把子进程的代码段替换成./script.sh程序的代码段,并从它的_start开始执行。然而script.sh是个文本文件,根本没有代码段和_start函数,怎么办呢?其实exec还有另外一种机制,如果要执行的是一个文本文件,并且第行用Shebang(#) 指定了解释器,则用解释器程序的代码段替换当前进程,并且从解释器的_start开始执行,而这个文本件被当作命令行参数传给解释器。因此,执行上述脚本相当于执行程序 。

shell变量

环境变量可以从父进程传给子进程,因此Shell进程的环境变量 可以从当前Shell进程传给fork出来的子进程。用printenv命令可以显示当前Shell进程的环境变量。
本地变量只存在于当前Shell进程,用set命令可以显示当前Shell进程中定义的所有变量(包括本地变量
和环境变量)和函数。
环境变量是任何进程都有的概念,而本地变量是Shell特有的概念。

VARNAME=value

注意等号两边都不能有空格,否则会被Shell解释成命令和命令行参数

变量引用

如果一个变量叫做VARNAME,用${VARNAME}可以表示它的值

echo $SHELL
echo $SHELLab

echo ${SHELL}
echo ${SHELL}abc

注意,在定义变量时不用$,取变量值时要用$,和C语言不同的是,Shell变量不需要明确定义类 型,事实上Shell变量的值都是字符串,比如我们定义VAR=45,其实VAR的值是字符串45而非整数。Shell变量不需要先定义后使用,如果对一个没有定义的变量取值,则值为空字符串.

命令代换:`或$()

由反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。

$ DATE=`date`
$ echo $DATE

$ DATE=$(date)
$ echo $DATE

wKiom1ep6lzSkEpwAAANmebPV4A306.png-wh_50

算术代换:$(())(用于算术计算,$(())中的Shell变量取值将转换成整数。注:$(())中只能用+-*/和()运算符,并且只能做整数运算)

$ VAR=45    //上边提到VAR位初始化前是字符串
$ echo $(($VAR+3))

运算结果:48

转义字符

如果创建$ $的文件(中间有空格)

$ touch \$\ \$

转移字符\:第一个针对符号$,第二个针对空格,第三个针对$

单引号

单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外, 但是字符串中不能出现单引号

echo '`date`'

双引号

双引号用于保持引号内所有字符的字面值(回车也不例外),但以下例子除外(即具有解释的意思

$加变量名可以取变量的值
反引号仍表示命令替换
\$表示$的字面值
\`表示`的字面值(反引号)
\"表示"的字面值
\\表示\的字面值 除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值:

echo "`date`"

wKioL1ep8R7TbPBDAAAIn8UbznE633.png-wh_50

总结 :由结果可以看出双引号具有解释的作用,单引号不解释,只是输出内容。