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脚本中用#表示注释,相当于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
算术代换:$(())(用于算术计算,$(())中的Shell变量取值将转换成整数。注:$(())中只能用+-*/和()运算符,并且只能做整数运算)
$ VAR=45 //上边提到VAR位初始化前是字符串 $ echo $(($VAR+3))
运算结果:48
转义字符
如果创建$ $的文件(中间有空格)
$ touch \$\ \$
转移字符\:第一个针对符号$,第二个针对空格,第三个针对$
单引号
单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外, 但是字符串中不能出现单引号
echo ‘`date`‘
双引号
双引号用于保持引号内所有字符的字面值(回车也不例外),但以下例子除外(即具有解释的意思)
$加变量名可以取变量的值
反引号仍表示命令替换
\$表示$的字面值
\`表示`的字面值(反引号)
\"表示"的字面值
\\表示\的字面值 除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值:
echo "`date`"
总结 :由结果可以看出双引号具有解释的作用,单引号不解释,只是输出内容。
原文地址:http://10798301.blog.51cto.com/10788301/1836324