shell编程中的单/双 小括号, 中括号, 大括号

linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html

不分!
shell编程中 不分数据类型, 所有的变量都 是字符串. 要进行 数值 / 数字的 整数运算, 就要用let, expr, (( ))等方式进行!
另外, shell中 只能处理整数, 不能处理 浮点数. 要用浮点运算, 需要用bc 程序

双小括号的使用

[foo@localhost ~]$ myfunc () {
> local i=0
> (( i++ ))
> echo $i
> }
[foo@localhost ~]$ myfunc
1
[foo@localhost ~]$ myfunc () { local i=0; (( ++i )); echo $i; }
[foo@localhost ~]$ myfunc
1
[foo@localhost ~]$ myfunc () { local i=0; (( --i )); echo $i; }
[foo@localhost ~]$ myfunc
-1
[foo@localhost ~]$ myfunc () { local i=0; ((--i)); echo $i; }
[foo@localhost ~]$ myfunc
-1
[foo@localhost ~]$ 


miscellaneous杂项

  1. \(! 和!\)的区别, 只要搞清楚, 以\(开头的表示 是变量, 是特殊变量, 而以! 开头的是 "历史命令 designator指示器" 就能够分清楚了,所以\)! 是 显示 上一次"后台运行的"命令的pid进程id,注意是后台运行的进程id, 如果不是后台运行的,则是当前shell进程中执行命令, 所以 echo $! 就是显示为空的. 那么用 echo $$ 就可以显示当前进程的pid:

    而!$ 则是表示上一次命令的参数.

  2. print和 printf的区别?
    shell中没有print这个命令!
    只有printf这个命令,格式是: printf <format> [args], 格式中 \n是换行, 默认的printf是不换行的. %s是输出字符串. %d其实也没有用.

  3. let是返回 被赋值的 变量的内容, 如果没有变量被赋值, 则返回的是 多个表达式中, 最后一个表达式的值. 而expr才是返回 表达式的值.

  4. 定义函数/ 执行多个命令序列的时候, 如果写在 同一行中, 一定要 在每条命令的最后 加上 分号, 否则会出错.

  5. eval命令?
    eval主要是用在"复杂变量" "间接引用变量"的解析上, 会对命令行进行 两次扫描, "两次解析", 第一次进行变量的值替换, 第二次是对替换后的 内容进行解析"执行", 如果替换后的内容,是可以执行的命令, 则执行该命令; 如果是可以显示的变量, 则输出该变量的值.
    eval后要不要 echo?
    注意, 如果是替换后的"字符串内容"是可以执行的命令, 则不要echo, 否则还是显示字符串, 而不是执行命令
    如果替换后的内容是 变量, 通常是: "$\(x", 前一个\)是转义表示本义的\(, 后面的\)x则是要替换的变量. 这时则要用 echo.

#!/bin/bash要加空格吗?

在.sh脚本中, 第一行是 #!/bin/bash. 通常在#! 和/bin/bash之间不要加空格. 你所看到的基本都没有的.虽然加上空格也没有什么区别, 但是显得不正规.


在双引号(( i=0; i<$j; i++ )) 中, 最后一个语句 i++ 一定不能加 分号, 否则会报错, 而其中的变量引用 \(j可以 可以不加\). 但是 i<\(j中, i不能加\), 否则会出错

下面是一个打印三角形的小片段:

#!/bin/bash

# print reverse triangle stars

read -p 'enter star lines: '  line


for (( i=1; i<$line; i++ ))  //i++ 后面不能加分号, 否则会出错, 里面的$line,$可以省略; i=1, 这里i要从1 开始, 以免在下面打印星号的时候, 第一行会打印出空行
do

	# print spances before stars

		for (( nspace=line-i; nspace>0; nspace-- ))
		do
		echo -n ' '
		done

	# print stars

		for (( j=2*i-1; j>0; j-- ))
		do
		echo -n '*'
		done

	echo  // 这里的echo是为了换行

done

注意, 在C 语言中, 每个语句后面都要加分号, 必须的! 但是, shell语句, 如果单独一行的话, 是可以/不必加分号的, 但是如果多个语句在一行, 则必须要加分号.


bash中的双中括号 [[ ]] 用法 参考: http://www.cnblogs.com/xkfz007/archive/2011/10/13/2209563.html https://www.dwhd.org/20150708_211624.html http://www.jb51.net/article/60326.htm

  1. 双中括号, 仅仅是: 单中括号的扩展. 两个方面的内容
    一是: 可以用于字符串的比较, (像1, 2, 10, 20)等, 只要不是在 let expr中, 都是字符串, 可以叫 "数字字符串", 数字字符串的比较 跟 "数值比较, 数学比较" 是一样的. 用于条件判断. 可以使用于 关系比较和逻辑运算.


shell中的变量其实还是分 数据类型的, 根据你的操作命令,和 操作方式, 共有三种: 整数变量, 字符串变量, 文件变量.

shell中双小括号的用法, 有了双小括号, [[, [, test逻辑运算和let express等都 可以抛到一边了.


shell中的大括号的使用

第一, 作为"模板变量替换"使用 参考: https://www.dwhd.org/20150708_211624.html
大括号用来表示替换, 有点类似于php等脚本语言中的模板变量替换, 这种变量替换, 必须在大括号前面加上\(符号(加上\)符号, 这样才算是一个变量!), 才能替换, 否则,不会替换,而只是把整个大括号的内容作为一个整体的命令来解析.
注意, 整个${var:C string}, 只是替换, 最后 这个整体得到的是, 只是替换后的一个 字符串! 注意只是一个字符串, 因此, 你要用另外的命令, 来操作这个字符串, 否则, 只有字符串, shell会提示: "stirng is not a command! "
注意, 后面的替换字符串, 如果只是一个单词, 则可能会执行, 但是, 如果是带有 参数的 多个单词 的命令, 则可能不会执行!


${var: C string }, 这个表示的是 替换. 意思是当条件C 满足时,才用string替换, 否则就不 替换(还是为\(var的值) 其中: -: 表示var为空的时候, 替换, +: 表示var不为空的时候替换 =: 表示var为空的时候, 替换, 而且var 被替换为string. ? : 表示判断var是否为空, 如果不为空, 就等于\)var的值, 如果为空, 就从标准错误输出string的值, 然后退出.


${var:C string}, 的string, 不一定只是变量 , 还可以是 $var, 也可以是 一个命令的输出.
比如:
echo ${var:-$foo} echo ${var:-$(date +%F)} 其中%F, 表示, full date, 完全/全部日期, %F = %Y-%m-%d.

但是需要注意的是, 在替换表达式中, 各个符号之间不能由空格, 否则,就返回 空字符串:

第二, 大括号表示模式删除, 模式去除. 其中 %表示去掉以模式结尾的部分; # 表示去除以模式开始的部分. 两个符号%%, ## 则是贪婪(最大化)匹配.

第三, 大括号表示"分配律", 分别多次多项匹配:
{1,2,3,a,b} =1, 2, 3, a,b {1, 2, 3}.txt= 1.txt 2.txt 3.txt
{1..5}.txt=1.txt 一直到 5.txt.
中括号表示多个中的一个, 而大括号表示所有的大括号中的项目都有效.
注意的是, 表示分配绿的各项之间不能有空格, 否则大括号表示的意义就没有了. 表示范围的.., 前后的两项要是单个的数字或字母, 不能是双个的字母,因为双个的字母没有办法排序.

posted @ 2017-05-16 07:17  noitanym  阅读(5676)  评论(0编辑  收藏  举报