源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅析shell脚本知识之符号篇

  • 时间:2020-01-26 15:16 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅析shell脚本知识之符号篇
[b]shell[/b] Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲 命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,包括循环和分支。但Shell脚本是解释执行的,不需 要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一 行敲到Shell提示符下执行。作为程序设计语言,它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。 Unix系统中常见的shell有:[code]sh[/code]、[code]csh[/code]、[code]ksh[/code]、[code]tcsh[/code]、[code]bash[/code]   使用命令: [code]vim   /etc/shells  [/code]可以查看当前系统支持的bash [img]http://files.jb51.net/file_images/article/201608/201608160858135.png[/img]    [b]shell执行脚本[/b] shell执行脚本是一门解释性语言、批量化处理语言,大大的节省了工作成本 shell脚本第一行必须以 [code]#![/code]开头,它表示该脚本使用后面的解释器解释执行。 举个栗子:
//script.sh  注:这是一个文本文件

#!/bin/bash
echo "this is a test"
ls
ls -l
echo "there are all files"
[b]执行方式:[/b]
//第一种执行方式:
[admin@localhost Shell]$ chmod +x script.sh
[admin@localhost Shell]$ ./script.sh
 
//第二种执行方式:
[admin@localhost Shell]$ /bin/bash script.sh
   [img]http://files.jb51.net/file_images/article/201608/201608160858136.png[/img]   [b]执行过程:[/b] Shell会fork一个子进程并调用exec执行[code]./script.sh[/code]这个程序,exec系统调用应该把子进程的代码段替换成[code]./script.sh[/code]程序的代码段,并从它的[code]_start[/code]开始执行。然而[code]script.sh[/code]是个文本文件,根 本没有代码段和[code]_start[/code]函数,怎么办呢?其实[code]exec[/code]还有另外一种机制,如果要执行的是一个文本文件,并且第一行 指定了解释器,则用解释器程序的代码段替换当前进程,并且从解释器 的[code]_start[/code]开始执行,而这个文本文件被当作命令行参数传给解释器。因此,执行上述脚本相当于执行程序! [b]输入命令执行shell脚本后:[/b]      1、交互式进程(父进程)创建一个子进程用于执行脚本,父进程等待子进程终止      2、子进程程序替换bash解释器      3、读取shell脚本的命令,将其以参数传递的方式传递给bash解释器      4、子bash对shell脚本传入的参数进行读取,读一行识别到它是一个命令,则再创建一个子进程,子bash等待该新进程终止      5、新进程执行该命令,执行完后将结果交给子进程      6、子进程继续读取命令,创建新进程,新进程执行该命令,将结果返回给子进程,直到执行完最后一条命令      7、子进程终止,将结果返回给交互式父进程 [b]注意:[/b]像[code]export[/code]、[code]cd[/code]、[code]env[/code]、[code]set [/code]这些内置命令,在键入命令行后,交互式进程不会创建子进程,而是调用bash内部的函数执行这些命令,改变的是交互式进程。 如果在命令行下,将多个命令用括号括起来,并用分号隔开来执行,交互式进程依然会创建一个子shell执行括号中的命令: [img]http://files.jb51.net/file_images/article/201608/201608160858137.png[/img] 如果不加括号则是另一种情况,[code]cd .. [/code]命令会直接在交互式shell下执行: [img]http://files.jb51.net/file_images/article/201608/201608160858138.png[/img] [code]. [/code]或者 [code]source[/code]这两个命令是Shell的内建命令,这种方式不会创建子Shell,而是直接在交互式Shell下逐行 执行脚本中的命令。 例证:
script.sh

#!/bin/bash
ls
echo "#################"
cd ..
ls
[img]http://files.jb51.net/file_images/article/201608/201608160858139.png[/img] [img]http://files.jb51.net/file_images/article/201608/2016081608581310.png[/img] [img]http://files.jb51.net/file_images/article/201608/2016081608581311.png[/img] [b]shell变量[/b]  shell变量不需要进行任何声明,直接定义即可,因为shell变量的值实际上都是字符串(对于没有定义的变量默认是一个空串)。定义的时候shell变量由大写字母加下划线组成,并且定义的时候等号两边不能存在空格,否则会被认为是命令! [b]shell变量的种类:[/b]      1、环境变量:shell进程的环境变量可以从当前shell进程传给fork出来的子进程。      2、本地变量:只存在于当前shell进程 利用printenv可以显示当前shell进程的环境变量;利用[code]set[/code]命令可以显示当前shell进程中的定义的所有变量(包括环境变量和本地变量)和函数。 一个shell变量定义后仅存在于当前Shell进程,是一个本地变量。用[code]export[/code]命令可以把本地变量导出为环境变量。用[code]unset[/code]命令可以删除已定义的环境变量或本地变量。 例如:
//分步 先定义后导出
COUNT=5
export COUNT
 
//一步完成定义和导出环境变量
export COUNT=5 
 
//删除已经定义的环境变量
unset COUNT
[b] 变量引用:[/b]  引用shell变量要用到[code]$[/code]符号,加[code]{}[/code]可以防止歧义。 例如:
COUNT=5
echo $COUNT
echo ${COUNT}911
  
[img]http://files.jb51.net/file_images/article/201608/2016081608581312.png[/img] [b]通配符 Globbing、命令代换、单引号、双引号[/b] [b]1.常见的通配符:[/b] [b]     * :[/b] 匹配0个或多个任意字符 [b]     ? : [/b]匹配一个任意字符 [b]     [若干字符] :[/b] 匹配方括号中任意一个字符的一次出现 [b]2.命令代换: [/b] 反引号[code]``[/code][b] [/b] 或者[b] [/b][code] $()[/code] script.sh : [img]http://files.jb51.net/file_images/article/201608/2016081608581313.png[/img] shell会先执行[code]反引号[/code]或[code]$()[/code]中的命令,将结果代换到当前命令行中! [b]反引号和$()的区别:[/b]     反引号本身就对\进行了转义,保留了本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。     反引号中:[code] \\ = \[/code]     $()中:[code]\ = \[/code]     注意:反引号是老的用法,()是新的用法,不管是在学习测试中,还是在实际工作中,()是新的用法,不管是在学习测试中,还是在实际工作中,()的用法都是被推荐的。 算数代换:[code]$(())[/code] 例如:将2-1的结果赋给SUB,并显示本地变量SUB
SUB=$((2-1))
echo $SUB
[b]3.单引号和双引号[/b] Shell脚本中的单引号和双引号一样都是字符串的界定符,单引号用于保持引号内所有字符的字面值,而双引号有些情况则特殊。如果字符串中有特殊字符需要处理时就用双引号。 注:单引号标注的字符中不能再出现单引号。 举个栗子:
#!/bin/bash
 
echo '\\'
echo "\\"
echo '`date`'
echo "`date`"
[img]http://files.jb51.net/file_images/article/201608/2016081608581314.png[/img] 以上就是关于shell脚本知识之符号篇的全部内容,希望本文的内容对大家的学习工作能有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部