1、shell变量

shell变量赋值语句为”name=[value]“,等号两边不能有空格,可以给shell变量追加内容”name+=value“,取消shell变量的设置使用”unset name”,例子如下。

$ var=1
$ echo $var
1
$ var=123
$ echo $var
123
$ var+=100
$ echo $var
123100
$ var=a
$ echo $var
a
$ var=abc
$ echo $var
abc
$ var+=xxx
$ echo $var
abcxxx
$ unset var
$ echo $var

2、shell扩展

命令行被拆分成符号以后要进行扩展,扩展有多种方式,且有一定的顺序:大括号扩展,波浪号扩展、参数、变量和算术扩展以及命令替换(从左到右),单词拆分,以及文件名扩展,如果系统支持,则还有另外一种扩展,即进程替换,它与参数、变量和算术扩展以及命令替换是同时进行的。只有大括号扩展,单词扩展以及文件名扩展在扩展时能够改变单词的数目,其它的扩展都是单个单词扩展成单个单词,唯一例外的是对"$@""${array[@]}"的扩展,所有扩展完成后再进行引用去除。下面对这些shell扩展逐个介绍。

3、大括号扩展

大括号扩展是一种能够生成任意字符串的机制,基本形式为“prefix{var,var2,var3…}suffix”或者“prefix{x..y[..increment]}suffix”。大括号扩展的前缀prefix、后缀suffix是可选的,大括号内的内容为以逗号分隔的字符串或者一个序列表达式,从左到右进行扩展。对于字符串来说,它们以逗号分隔,如果只有一个字符串,在这个字符串的后面有无逗号的效果是不同的。对于序列表达式来说,x和y是一个整数或者单个字符,类型必须相同,后面的增量increment是个可选的整数值,默认为1或者-1,根据x和y的大小进行选择,当x和y为整数时,整数的前面可添加一个0,用以限定整数的宽度,高位不足时用0补齐,最终扩展为包括x和y的从较小值到较大值之间的一系列值。

$ foo() { echo a{foo, bar}z; }
$ foo
afooz abarz
$ foo() { echo a{01..10..2}z; }
$ foo
a01z a03z a05z a07z a09z

格式正确的大括号扩展必须包含没有被引用的起始和结束大括号,还有至少一个未被引用的逗号或者序列表达式。大括号扩展在其它所有扩展之前进行,为了避免与参数扩展冲突,大括号扩展不会识别字符串中的“${”,为了防止被认为是大括号扩展的一部分,大括号和逗号可以使用反斜杠转义。

4、波浪号扩展

如果一个单词以未被引用的波浪号“~”开头,则其后的所有字符,直到第一个未被引用的斜杠(如果有的话),都被看作是波浪号前缀。如果波浪号前缀中的字符都没有被引用,则其中波浪号后面的所有字符就被当作一个可能存在的登录用户名,如果这个登录名是个空字符串,波浪号就被替换成shell特殊变量HOME的值,如果没有设置HOME,则替换成执行该命令的那个用户的主目录,否则,替换成其中指定的那个登录名的主目录。

~    扩展为"$HOME"
~/foo 扩展为"$HOME/foo"
~username/foo 扩展为用户username的主目录中的子目录foo

在波浪号前缀中,可以有加号、减号。

~+    扩展为"$PWD"
~- 扩展为"$OLDPWD"

在波浪号前缀中,还可以使用整数进行目录栈(对应的内建命令为pushd、popd、dirs)扩展。

~N    命令"dirs +N"显示的字符串
~+N 命令"dirs +N"显示的字符串
~-N 命令"dirs -N"显示的字符串

5、参数(变量)扩展

参数扩展使用美元符号“$”进行引导,参数一般放在一对未被引用的大括号内,基本格式为:

${parameter}

使用了冒号“:”的几种情形:

${parameter:-word}    如果parameter没有设置或者为空,替换为word;否则替换为parameter的值。
${parameter:+word} 如果parameter没有设置或者为空,不进行任何替换;否则替换为word。
${parameter:=word} 如果parameter没有设置或者为空,把word赋值给parameter。最终替换为parameter的值。
${parameter:?word} 如果parameter没有设置或者为空,把word输出到stderr,否则替换为parameter的值。
${parameter:offset} 扩展为parameter中从offset开始的子字符串。
${parameter:offset:length} 扩展为parameter中从offset开始的长度不超过length的字符。

使用了叹号“!”的几种情形(间接扩展):

${!prefix*}    扩展为变量名中含有prefix的一些变量。
${!prefix@} 扩展为变量名中含有prefix的一些变量。
${!name[*]} 如果name为数组,扩展为name的索引;否则结果为0。如果name未定义,结果为空。
${!name[@]} 如果name为数组,扩展为name的索引;否则结果为0。如果name未定义,结果为空。

使用了井号“#”的几种情形:

${#parameter}    结果为parameter所包含的字符数。
${parameter#word} word与parameter从最左边开始进行模式匹配,结果为从parameter最左边删除匹配到的最短字符串后剩下的内容。
${parameter##word} word与parameter从最左边开始进行模式匹配,结果为从parameter最左边删除匹配到的最长字符串后剩下的内容。

使用了百分号“%”的几种情形(与“#”相反):

${parameter%word}    word与parameter从最右边开始进行模式匹配,结果为从parameter最右边删除匹配到的最短字符串后剩下的内容。
${parameter%%word} word与parameter从最右边开始进行模式匹配,结果为从parameter最右边删除匹配到的最长字符串后剩下的内容。

字符串替换:

${parameter/pattern/string}    pattern为一种模式,把parameter中与之匹配的最长字符串用string替换。若pattern以#开头,只匹配parameter的开头;若pattern以%开头,只匹配parameter的结尾;若pattern以/开头,会替换所有匹配到的内容,否则只替换第一个匹配到的内容;若string为空,可省略pattern后面的/,表示删除匹配到的内容。

字符大小写转换(pattern省略时表示可以匹配每个字符的?):

${parameter^pattern}    把parameter中与pattern匹配的第一个字符转为大写字母。
${parameter^^pattern} 把parameter中与pattern匹配的所有字符转为大写字母。
${parameter,pattern} 把parameter中与pattern匹配的第一个字符转为小写字母。
${parameter,,pattern} 把parameter中与pattern匹配的所有字符转为小写字母。

6、算术扩展

算术扩展可以完成一个真正的数学运算,格式为:

$((expression))

例如:

$ foo=1
$ var=$((foo+=10))
$ echo $var
11

7、命令替换

命令替换把命令执行的标准输出取代命令本身,格式为:

$(command)
`command`

例如:

$ uname -p
x86_64
$ foo=$(uname -p)
$ echo $foo
x86_64

8、进程替换

如果系统支持命名管道”fifo“或者能够以”/dev/fd“方式来命名打开的文件,那么也就支持进程替换,格式为:

<(command)
>(command)

进程替换中的尖括号与左边的圆括号之间不能留有空格。执行命令时,其输入和输出与命名管道fifo或者/dev/fd目录下的某个文件相关联,就好像是command的输入、输出与另一个进程的输入输出流绑到了一起。 
例如:

$ echo "hello" > test.sh
$ echo "world" >> test.sh
$ cat test.sh
hello
world
$ grep hello <(cat test.sh)
hello
$ echo aa bb cc dd >(awk '{print $1}')
aa bb cc dd /dev/fd/63
$ echo aa bb cc dd > /dev/fd/63 >(awk '{print $1}')
$ aa
$ echo aa bb cc dd > /dev/fd/63 >(awk '{print $2}')
$ bb
$ echo aa bb cc dd > /dev/fd/63 >(awk '{print $3}')
$ cc
$ echo aa bb cc dd > /dev/fd/63 >(awk '{print $4}')
$ dd

9、单词拆分

单词拆分发生在shell扩展中,相关的系统变量为IFS,即Internal Field Separator,默认值为<space><tab><newline>,这些分隔符出现在shell扩展结果的行首或行尾将被忽略,其它地方则作为分隔符把单词分隔开来。

10、文件名扩展

单词拆分以后,Bash会在每个单词中搜索“*”、“?”、“[”,如果找到其中一个,则进行模式匹配,内建命令shopt与模式匹配相关,下面说明模式匹配中的几个特殊符号。

*    匹配任何字符串,包括空字符串。
? 匹配任意单个字符。
[...] 匹配方括号中的任一字符。可以是一个范围表达式,由连字符连接一对字符,这个范围受当前语言环境的影响。如果方括号后面的第一个字符是“!”或“^”,则匹配任一没有出现在方括号中的字符。如果要匹配字符“-”,可以把它放在方括号中的第一个或最后一个位置,如果要匹配字符“]”,可以把它放在方括号中的第一个位置。
[[:class:]] 通过class指定字符类别,class可以是POSIX标准中的下列关键字:alnum、alpha、ascii、blank、cntrl、digit、graph、lower、print、punct、space、upper、word、xdigit,其中word表示大小写字母、数字和下划线。
[[=c=]] 匹配所有的字符c。
[[.symbol.]] 匹配所有的符号symbol。
?(pattern-list) 匹配pattern-list零次或一次。
*(pattern-list) 匹配pattern-list零次或多次。
+(pattern-list) 匹配pattern-list一次或多次。
@(pattern-list) 匹配pattern-list中的某个模式。
!(pattern-list) 与pattern-list中的所有模式都不匹配的其它情形。

11、引用删除

经过上面提到的shell扩展以后,对于所有没有被引用的字符,包括反斜线“\”、单引号“’”和双引号“””,若不是由shell扩展产生的,就会被删除,最终产生真正的结果。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iEearth/article/details/52548525

(转)shell变量及扩展的更多相关文章

  1. shell变量替换扩展 字符串计数截取

  2. shell变量替换扩展 变量测试

  3. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用

    一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境       2> 练习命令历史.命令别名       3 ...

  4. 《Linux shell变量总结回顾》RHEL6(转)

    文章版权:http://www.cnblogs.com/linux-super-meng/ 环境变量路径: [root@localhost ~]# set   //查看到的是局部变量和全局变量2种 [ ...

  5. (转载)linux中shell变量

    (转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存 ...

  6. $ cd `dirname $0` 和PWD%/* shell变量的一些特殊用法

    在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的".". $0:当前Shell程序的文件名dirname $0,获取当前Shell程序 ...

  7. 管道符和作业控制、shell变量、环境变量配置文件 使用介绍

    第6周第1次课(4月23日) 课程内容: 8.6 管道符和作业控制 8.7/8.8 shell变量8.9 环境变量配置文件扩展bashrc和bash_profile的区别 http://ask.ape ...

  8. shell 学习笔记1-什么是shell,shell变量

    一.介绍 1.什么是shell Shell 既是一种命令语言,又是一种程序设计语言,他在操作系统得最外层,负责直接与用户对话,把用户得输入解释个OS,并处理各类操作系统得输出结果,输出到屏幕返回个i用 ...

  9. 5.Shell变量

    5.Shell变量本章介绍 shell 中所使用的变量.Bash 会自动给其中一些变量赋默认值.5.1 波恩Shell的变量Bash 使用一些和波恩 shell 同样的变量.有时,Bash 会给它赋默 ...

随机推荐

  1. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  2. MVC4 路由解析 同名Controller的解决方案

    通常我们在MVC中通过Area建立子站的时候会有 controller名称重复的情况,这是后如何区分路由优先级, 我们知道 在Route对象中存在RouteValueDictionary 类型的Dat ...

  3. [LeetCode 题解]:Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  4. SqlServer:CTE函数处理递归(WITH语法)

    原文地址:http://www.cnblogs.com/xbf321/archive/2009/04/30/1446833.html 我们在做分类处理的时候,总会遇到递归的处理,比如说地区就是一个例子 ...

  5. Django 标签过滤器

    django内置标签 autoescape 控制当前的自动转义行为.这个标记可以作为参数打开或关闭,它决定自动转义是否在块内有效.块使用endautoescape结束标记关闭. 当自动转义生效时,所有 ...

  6. Luckily general gradient for spherical harmonics is defined

    http://web4.cs.ucl.ac.uk/staff/j.kautz/publications/gradientSH_RS04.pdf

  7. 虚拟机ping 不通主机,主机可ping 虚拟机解决方法

    在VMware虚拟机里安装了CentOS的系统发现桥接模式Ping不通外网,Ping主机也ping 不通,但是主机可以ping 虚拟机. 百度了以下,原因是w10防火墙搞的鬼,解决办法有两种: 1.关 ...

  8. [转]解读Unity中的CG编写Shader系列9——镜面反射

    讨论完漫反射之后,接下来肯定就是镜面反射了在开始镜面反射shader的coding之前,要扩充一下前面提到的知识,加深理解镜面反射与漫反射的区别.注:这篇文章实现的镜面反射是逐顶点着色(per-ver ...

  9. boost::string 例题1

    如果有一个语法正确的shader源文件,其包括若干关于uniform变量的定义.请写一个程序从某个shader源文件里提取其全部定义的uniform变量.要求记录其名称.数据类型和初始值(如果有定义) ...

  10. Centos系统优化

    系统优化脚本 #!/bin/bash #author junxi by #this script is only for CentOS 7.x #check the OS platform=`unam ...