Shell 各种符号 之 含义

#!:符号能够被内核识别成是一个脚本的开始,这一行必须位于脚本的首行

$0:当前脚本的名字

$#:输入<调用>参数(脚本或函数的位置参数) 的个数,如 NumArg=$#;echo"\$#: $#;\$NumArg: $NumArg"

$@:传递给脚本或函数的所有参数,按空格划分成不同的部分。注意: 如果一个参数中有空格,这个参数将会被从空格($IFS默认)处分尸

"$@":分隔成单个参数,如"$1”“$2”“$3”, $@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分即不会被分尸

$*:传递给脚本或函数的所有参数,按空格划分成不同的部分,与$@没有区别

"$*":扩展成一个参数,如"$1$2 $3",不论调用时传入了多少个参数,都将被按原样处理成一个整体性的参数使用。$@ $*只在被双引号包起来的时候才会有差异

$?:上个命令或函数的返回值

$n:第几个参数,n=3则$n是$3 ,注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

$$:当前shell脚本的进程ID

$!:用于保存运行的最后一个进程的PID 号。

$(command):内置命令替换操作符。Spid=$(pidof NmsServer) 或 echo $(pidof NmsServer) 等同于反引号: `pidof NmsServer`

`command`:反斜杠——同上:$(command) 

     注意:这两种命令的执行方式,是在当前shell环境中,开启了一个子进程,在这个子进程中执行命令并完成替换。所以当语句执行完回到主脚本中时,再访问子进程中定义、修改的数据,注意徒劳!

${PIDLIST[@]}:数组PIDLIST的全部值

${#PIDLIST[@]}:获取数组PIDLIST=(${Spid} ${Mpid} ${ProbePid})中的元素个数

${}:shell变量的引方式<更加明确的变量名称的界定>;匹配与替换操作;

变量引用

pid=$(pgrep-f java)

echo ${pid}

输出:3758564369 79366

echo ${pid}|awk '{print NF}'

输出结果:6

echo "${pid}"

输出:

37585

64369

79366

特殊的替换结构

${var:-string},${var:+string},${var:=string},${var:?string}

      ①${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。

      ② ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的) 

      ③${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

      补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。

匹配替换结构

${var%pattern},${var%%pattern},${var#pattern},${var##pattern}

     第一种模式:${variable%pattern},这种模式时,shell在variable中查找,看它是否一给定的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式

     第二种模式: ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给定]的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

     第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给定的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式

     第四种模式: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

     这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。

字符串提取和替换

${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

第一种模式:${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。       

第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。

第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。。        

第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。

$[] $(()) :它们功能一样,都是进行数学运算的。支持+ - * / %:分别为“加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。

$IFS : shell的内部域分隔符。当 shell处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。IFS的默认值为:空白(包括:空格,tab,和新行).

将其ASSII码用十六进制打印出来:

$ echo$IFS

 

$ echo"$IFS" | od -b

0000000040 011 012 012

0000004

直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符"\n"。最后一个 012 是因为 echo 默认是会换行的

将其ASSII码用十六进制打印出来:echo -n "$IFS"|xxd -g 1|awk -F":" '{print $2}'|awk -F" " '{print $1, $2, $3}'    输出结果:20 09 0a    https://blog.csdn.net/whuslei/article/details/7187639

expr : 命令对算术表达式求值  如:c=`expr $a + $b`

0 表示标准输入

1 表示stdout标准输出

2 表示stderr标准错误

& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

> :将执行结果输出到文件、设备上

> /dev/null:不可回收垃圾箱  ,命令等同于1>/dev/null

                       Example: ./yunNanAlertTransferTest.sh 1>/dev/null 2>yunNanAlertTransferTest.log &

>>:将执行结果追加到文件、设备上

<:从文件、设备、输入点读入内容

<<:从文件、设备、输入点追加读入内容

|:一个命令的输出传递给另一个命令当做输入

test命令,等价于[  ]:内置test命令常用操作符号,将表达式写在[]中, 如:[ expression ]#注意:expression首尾都有个空格。表达式结果为真,则test返回值为0,否则为非0 

==:两个值的比较,如A1是否与A2相等,真:返回0,非:返回非0 [ string1 == sting2 ]

!=:两个值的比较,如A1是否与A2不相等。  注:[ string1 ]——string1是否是个空串。

=~:用于匹配或侧表达式,即左侧是否包含右侧。if [[ $1 =~ stop || $1 =~ 'status' ]];  [] 这种结构不支持该操作。

XXX():表示这是一个函数

{ command1;command2;command3; }:表示这个主体中的内容是个执行体,这个执行体不开子进程,在当前脚本进程中按序执行。开关与结尾的空格,最后一个命令必须有“;”

./:表示当前目录——fork调用,在当前父进程中新起一个子进程执行

../:  表示当前目录的上级目录

\:用作转义字符,或称逃脱字符,echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号 。另一作用,反斜杠用于一行的最后一个字符时,把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。

'':单引号——表示纯情字符串;引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;引号字串中不能出现单引号(对单引号使用转义符后也不行)。

                      单引号将剥夺其中的所有字符的特殊含义,阻止对所有字符的转义, 将所有的字符看做其字面的意思。

"":双引号——表示纯情字符串或变量的值。如果变量需多行呈现,需要双引号,否则单行呈现。见下图示。双引号里可以有变量,双引号里可以出现转义字符。 

                      双引号会处理字符串中的'$'(参数替换),'``' or '()'(命令替换),'\' 转义字符 和算数等。

     两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`(我不是单引号)。

sync:刷新内存缓存

exit:Shell内置命令,用来退出当前 Shell进程,并返回一个退出状态;使用$?可以接收这个退出状态(0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败)    注意,exit 表示退出当前 Shell 进程,我们必须在新进程中运行test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法看到输出结果了。为了脚本执行完不会退出终端,脚本的执行需要使用 fork 方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx的11个执行流程

1 Nginx简介 Web服务器市场份额 Nginx [engine x] 最初由 Lgor Sysoev 编写。根据 Netcraft 的数据&#xff0c;到2020年9月&#xff0c;Nginx 服务或代理了25.76&#xff05;站点&#xff0c;市场份额占到了约34.03&#xff05;。 Nginx 被广泛用作&#xff1a; HTTP服务器…

Nginx的执行阶段详解

在了解nginx的执行阶段前&#xff0c;先看一个例子 对echo不熟悉的&#xff0c;可以先看文章Nginx调试必备了解下echo扩展 回到上面这个例子&#xff0c;在server块中配置这样的location&#xff0c;你觉得输出是什么样子&#xff1f; 按照正常的逻辑&#xff0c;输出应该是32 …

Docker挂了,数据如何找回

docker在实际使用中&#xff0c;让运维人员诟病的&#xff0c;除了安全问题外&#xff0c;大概就是数据的问题了 很多人在初用docker的时候&#xff0c;很多时候都忘记或不知道docker中需要保留的数据需要挂载到宿主机文件夹到容器内部对应目录&#xff08;当然除了挂载宿主机目…

TCP总结

TCP这些东西&#xff0c;基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处&#xff0c;但&#xff0c;面试他要问啊 而最近大家伙过完年&#xff0c;也都在准备春招&#xff0c;我也一样。阅读了一些okHttp源码之后&#xff0c;又屁颠屁颠地跑回来重…

Shell 中各种括号的作用

一、小括号&#xff0c;圆括号&#xff08;&#xff09; 1、单小括号 () ①命令组。括号中的命令将会新开一个子shell顺序执行&#xff0c;所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开&#xff0c;最后一个命令可以没有分号&#xff0c;各命令和…

linux基线核查脚本

#!/bin/bash #version 2.0cat <<EOF ************************************************************************************* ***** linux基线检查脚本 ***** ************************************************************************************* *…

LDAP命令介绍---dsreplication

可以使用此实用程序来配置服务器之间的复制, 以使服务器数据保持同步。要正确进行复制, 必须先使用 enable 子命令启用复制, 然后再使用 initialize 子命令将一个服务器的内容初始化为另一个服务器的内容用法: dsreplication {子命令} {选项}可用子命令:disable对指定服务器中…

LDAP命令介绍---dsconfig

此实用程序可用于定义目录服务器的基本配置 用法: dsconfig {子命令} {选项} 获取子命令用法列表: --help-distribution 显示与 分发 相关的子命令 --help-general-configuration 显示与 一般配置 相关的子命令 --help-integration 显示与 集成 相关的子命令 --…

LDAP命令介绍---dsconfig子命令----help-distribution显示与分发相关的子命令

此实用程序可用于定义目录服务器的基本配置用法: dsconfig {子命令} {选项}可用子命令:create-distribution-algorithm创建分发算法create-distribution-partition创建分发分区create-workflow-element --type distribution创建分发工作流元素create-global-index创建全局索引…

LDAP命令介绍---ldappasswordmodify口令修改操作

此实用程序可用于在目录服务器中执行 LDAP 口令修改操作用法: ldappasswordmodify {选项}其中 {选项} 包括:-a, --authzID {authzID}应更改口令的用户条目的授权 ID -A, --provideDNForAuthzID将绑定 DN 用作口令修改操作的授权 ID -n, --newPassword {newPassword}为目标用户…

LDAP命令介绍---dstune

此实用程序可用于帮助您优化 OUD 目录服务器。 您可以选择自动或基于其他标准 (例如, 内存限制或服务器将包含的数据) 优化服务器用法: dstune {子命令} {选项}可用子命令:data-based使用描述目录服务器将包含的数据的信息优化服务器。使用 --ldifFile 可基于 LDIF 文件的内容…

LDAP命令介绍---dsreplication--initialize

initialize 将目标服务器中指定基础 DN 下的数据内容初始化为源服务器的内容。要正确进行复制, 在启用复制后必须执行该操作 (也可以使用 initialize-all 达到该目的) initialize-all 对于正在复制其内容的所有服务器, 将它们指定基础 DN 下的数据内容初始化为指定…

LDAP命令介绍---dsreplication--enable:DISABLE

enable 用法: dsreplication enable {选项} 更新服务器的配置以复制指定基础 DN 下的数据。如果某个指定的服务器正在复制其他服务器中基础 DN 下的数据, 执行此子命令将会更新所有服务器的配置 (因此, 对于每个添加到复制拓扑中的服务器, 将都能执行一次命令行)全局选项:请参…

LDAP命令介绍---import-ldif

[oracleoud bin]$ ./import-ldif --help 此实用程序可用于将 LDIF 数据导入目录服务器后端用法: import-ldif {选项}其中 {选项} 包括:-l, --ldifFile {ldifFile}要导入的 LDIF 文件的路径 -A, --templateFile {templateFile}用于生成导入数据的 MakeLDIF 模板的路径 -a, --ap…

LDAP命令介绍---verify-index--验证索引

[oraclelocalhost bin]$ ./verify-index -b "DCCOM" telephoneNumber 在解析命令行参数时出现错误: 参数 "telephoneNumber" 没有以一个或两个破折号开头, 并且不允许未命名的结尾参数 此实用程序可用于确保基于 Berkeley DB Java Edition 的后端中的索引…

LDAP----manage-account

[oraclelocalhost bin]$ ./manage-account -D "cndirectory manager" -j pwd-file get-all \ > > --targetDN uidkvaughan,ouPeople,dcexample,dccom 在解析命令行参数时出现错误: 无法接受为参数 -j 提供的值 "pwd-file": 为参数 bindpwfile 指定…

LDAP组的概念以及命令

Oracle统一目录支持组&#xff0c;组是作为单个对象管理的条目集合。通常&#xff0c;目录管理员配置打印机组、软件应用程序组、员工组等。在为一组用户分配特殊访问权限时&#xff0c;组尤其有用。例如&#xff0c;您可以配置一组访问管理器&#xff0c;并分配权限&#xff0…

oracle中修改process

可以用如下命令查看数据库连接的消耗情况 select b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a, v$session b where a.ADDR b.PADDR and b.USERNAME is not null group by b.MACHINE, b.PROGRAM, b.USERNAME order by count(*) desc 在 oracle中&…

V$LICENSE表结构

V$LICENSE V$LICENSE 显示有关许可限制的信息。 列名 数据类型 描述 SESSIONS_MAX NUMBER 实例允许的最大并发用户会话数 SESSIONS_WARNING NUMBER 实例的并发用户会话的警告限制 SESSIONS_CURRENT NUMBER 当前并发用户会话数 SESSIONS_HIGHWATER NUMBER 自实…

升级ssl和ssh

#/bin/bash#需要手动修改的变量 version"ssh_8.6p1" #定义版本号 soft_dir$(cd "$(dirname "$0")"; pwd) # 上传安装包的目录 ssl_media"openssl-1.1.1k.tar.gz" #ssl软件包名 ssh_media"openssh-8.6p1.tar.gz" # ssh软件…