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.

中括号表示多个中的一个, 而大括号表示所有的大括号中的项目都有效.

注意的是, 表示分配绿的各项之间不能有空格, 否则大括号表示的意义就没有了. 表示范围的.., 前后的两项要是单个的数字或字母, 不能是双个的字母,因为双个的字母没有办法排序.

shell编程中的单/双 小括号, 中括号, 大括号的更多相关文章

  1. shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法

    shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...

  2. Linux Shell基础 单引号、双引号、反引号、小括号和大括号

    单引号和双引号 单引号和双引号用于变量值出现空格时将字符用引号括起来. 二者的主要区别在于, 被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义: 被双引号括起来的字符中,"$& ...

  3. shell编程中的if语句

    if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...

  4. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  5. Shell编程中Shift的用法

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...

  6. Shell编程中while与for的区别及用法详解【转】

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...

  7. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  8. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

  9. [ SHELL编程 ] shell编程中数值计算方法实例

    SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...

随机推荐

  1. UVa-1025城市里的间谍 A Spy in the Metro

    原题 城市里的间谍 分析 动态规划,dp[i][j]表示你在时刻i,车站j,最少还要等待的时间. 边界条件d[T][n]=0 已经到达,其他d[T][i]=inf不可达. 在一个站点时,有以下三种决策 ...

  2. <2>基本表达式和语句

    1.基本表达式 1: =, +, -, *, /, 赋值,加减剩除; lua 没有 c/c++的缩写表达式 += -= *=, ++, --; 2: () 改变运算的优先级; 3: 字符串对象加法.. ...

  3. GetWindowRect和GetClientRect的注意事项

    发现GetClientRect()函数取值不正确,特此找来了些资料以供参考,具体如下,就可以明白怎么回事了. 一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClie ...

  4. Python学习记录之(五)-----类进阶篇

    静态方法 类方法 属性方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调 ...

  5. AURO OtoSys IM100 vs Lonsdor K518ISE: which better?

    Comparison: AURO OtoSys IM100 and Lonsdor K518ISE It’s aimed to help make a purchase of decent auto ...

  6. git 新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错

    是因为本地分支和远程分支没有建立联系  (使用git branch -vv  可以查看本地分支和远程分支的关联关系)  .根据命令行提示只需要执行以下命令即可git branch --set-upst ...

  7. 前端框架VUE----计算属性和侦听器

    一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...

  8. redis安装--转

    第一部分:安装redis 希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: 1 2 3 4 5 6 ...

  9. 通过 Java 线程堆栈进行性能瓶颈分析

    改善性能意味着用更少的资源做更多的事情.为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使 CPU 尽可能出于忙碌状态(当然,并不是让 CPU 周期出于应付无用计算, ...

  10. 有登陆认证的情况下如何使用Wisdom RESTClient?

    访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...