Shell脚本符号篇

一:shell运行原理:

前面#! 表示shebang
第一种:
shell脚本中#表示注释,这个和C语言的//类似,但是在#位于第一行开头,并且是个例外,它表示该脚本
使用后面指定是解释器/bin/bash解释执行
我们知道shell是命令行解释器,那么它又是如何运行程序的呢?
shell会fork一个子进程并调用exec执行./1.sh这个程序,exec系统调用应该吧子进程的代码段替换成./1.sh程序的代码段,并且从它的_start执行,然而1.sh只是个文本文件,根本没有代码段和_start函数,怎么办呢?其实exec还有另外一种机制,如果要执行的是一个文本文件,并且第一行用shebang指定了解释器,则用哪个解释器程序的代码段替换当前进程,并且从解释器的_start开始执行,而这个文本文件被当作命令行参数传给解释器,因此,执行上述脚本相当于执行程序.
第二种:
shell执行过程:

1:交互Shell(bash)fork/exec一个子Shell用于执行脚本,父进程bash等待子进程sh终止
2:sh读取脚本找那个的cd ..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录
3:sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作木库下的文件,sh等待ls终止
4:ls终止后,sh继续执行,读到脚本文件末尾,sh终止
5:sh终止后,bash继续执行,打印提示符等待用户输入.
二:shell变量:
1:环境变量:
换将变量可以从父进程传给子进程,因此shell进程的环境变量可以从当前shell进程传给fork出来的子进程,用printenv命令可以显示当前shell进程的环境变量
2:本地变量:
只存在与当前shell进程,用set命令可以显示当前shell进程找那个定义的所有变量和函数

注意:环境变量时任何进程都有的概念,而本地变量时shell特有的概念,在shell中,环境变量和本地变量的定义和用法相似
定义一个变量或者赋值


VALUE=value
注意等号两边不能由空格,否则会被解释称为命令或者命令参数

3:变量引用:
如果有一个变量叫做VALUE,用 VALUE, VALUE表示它的值
echo SHELLecho SHELL123
对比:
echo SHELLecho {SHELL}abc

注意:在定义变量的时不用 , ,和C语言不通的是,Shell变量不需要明确定义类型,事实上,Shell变量的值都是字符串.Shell变量不需要先定义后使用,如果对一个没有定义的变量值取值,则值为空串.

三:文件名代换::*?[]
这些用于匹配的字符称为通配符,具体如下
创建100个空文件

通配符*:匹配0个或者多个字符
?匹配任意一个字符

file *[1..9]匹配任意一个

四:命令带换:’或$()
由反引号括起来也是一条命令,Shell先执行该命令,然后将该命令输出结果立刻带换到当前命令行中

DATE=date echo DATE ()表示
DATE=$(date)

算术带换: (()), (())中的Shell变量取值将转换成整数
如:
VAR=3 echo (( VAL+3))

$(())中只能用+-*/以及()运算符,并且只能做整数运算.
五:转义字符
1:和C语言类似,\在shell中被用作转义字符,用于取出紧跟其后的单个字符的特殊意义,紧跟其后的字符取字面值.
如:创建一个文件名” ”(中间欧空格)的文件可以这样发送

2:还有一个字符虽然不具有特殊含义,但是要用它左文件名也很麻烦,就是-号,如果要创建-号开头的文件,按照前面的方法是不行的,为什么呢?因为各种UNIX命令都把-号开头的命令行参数当做命令的选项,而不是文件名.这时我们可以用下面的方法:

touch./test touch – -test
有一种用法,在\后敲回车表示续行,Shell并不会立刻执行,而是把光标移到下一行,给出一个续行提示符>,等待用户继续输入,最后把所有的续行命令当做一个命令执行

六:单引号和双引号
1:单引号
和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符,但是单引号用于保持引号内所有字符的字面值,即使引号内的\回车也不例外,但是字符串中不能出现单引号.

如果单引号,没有匹配对,就输入回车,Shell会给出续行提示符,要求用户吧引号配对上.

2:双引号
双引号用于保持引号内所有字符的字面值( 回车也不例外),但以下情况例外
$ 的字面值

\’表示’的字面值
\”表示”的字面值
\表示\字面值,除以上情况外,在其他字符前面的\无特殊含义,只表示字面值

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER