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

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

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

双小括号的使用

[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:
    821299-20170518112349603-99768685.png
    而!$ 则是表示上一次命令的参数.

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

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

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

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

#!/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

821299-20170521205518728-687678036.png

注意, 在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中, 都是字符串, 可以叫 "数字字符串", 数字字符串的比较 跟 "数值比较, 数学比较" 是一样的. 用于条件判断. 可以使用于 关系比较和逻辑运算.

821299-20170522163552320-587337286.png


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

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


shell中的大括号的使用

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


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


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

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

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

821299-20170531090158399-2019341072.png

第三, 大括号表示"分配律", 分别多次多项匹配:
{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.
中括号表示多个中的一个, 而大括号表示所有的大括号中的项目都有效.
注意的是, 表示分配绿的各项之间不能有空格, 否则大括号表示的意义就没有了. 表示范围的.., 前后的两项要是单个的数字或字母, 不能是双个的字母,因为双个的字母没有办法排序.
821299-20170531093738774-310540620.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值