linux shell 学习笔记--变量声明与赋值,循环

摘要:
Bash变量没有类型------------------------与其他编程语言不同,Bash不区分变量的“类型”。本质上,Bash变量是字符串。然而,根据上下文的不同,Bash还允许比较操作和算术操作。确定这些值的关键因素是变量中的值是否只是一个数字。分配a=123a=“sdsd”#请注意,=周围没有空格,否则,它将成为比较字符串操作引用$a#,方法是使用$字符操作字符串字符以连接a=“sdss”b=“ds
Bash 变量是不分类型的
------------------------
不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串.
但是依赖于上下文,Bash 也允许比较操作和算术操作.决定这些的关键因素就是,变量中的值
是否只有数字.
赋值
a=123
a="sdsd"   #注意=左右不要有空格,否则就变成比较字符串操作
引用
$a #借助$符
操作字符串
字符穿连接 
   a="sdfs" 
   b="dsds"
   c=$a$b  
--------------
Bash 支持超多的字符串操作,操作的种类和数量令人惊异.但不幸的是,这些工具缺乏集中性.
一些是参数替换的子集,但是另一些则属于UNIX 的expr 命令.这就导致了命令语法的不一致和
功能的重叠,当然也会引起混乱.
字符串长度
${#string}
expr length $string
expr "$string" : '.*'
1 stringZ=abcABC123ABCabc
2
3 echo ${#stringZ} # 15
4 echo `expr length $stringZ` # 15
5 echo `expr "$stringZ" : '.*'` # 15
从字符串开始的位置匹配子串的长度
expr match "$string" '$substring'
$substring 是一个正则表达式
expr "$string" : '$substring'
$substring 是一个正则表达式
1 stringZ=abcABC123ABCabc
2 # |------|
3
4 echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8
5 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8
expr index $string $substring
匹配到子串的第一个字符的位置.
1 stringZ=abcABC123ABCabc
2 echo `expr index "$stringZ" C12` # 6
3 # C position.
4
5 echo `expr index "$stringZ" 1c` # 3
6 # 'c' (in #3 position) matches before '1'.
在 C 语言中最近的等价函数为strchr().
提取子串
${string:position}
在 string 中从位置$position 开始提取子串.
如果$string"*""@",那么将提取从位置$position 开始的位置参数,[1]
${string:position:length}
在 string 中从位置$position 开始提取$length 长度的子串.
################################Start
Script#######################################
1 stringZ=abcABC123ABCabc
2 # 0123456789.....
3 # 0-based indexing.
4
5 echo ${stringZ:0} # abcABC123ABCabc
6 echo ${stringZ:1} # bcABC123ABCabc
7 echo ${stringZ:7} # 23ABCabc
8
9 echo ${stringZ:7:3} # 23A
10 # 3 个字符长度的子串.
子串削除
${string#substring}
从$string 的左边截掉第一个匹配的$substring
${string##substring}
从$string 的左边截掉最后一个个匹配的$substring
1 stringZ=abcABC123ABCabc
2 # |----|
3 # |----------|
4
5 echo ${stringZ#a*C} # 123ABCabc
6 # 截掉'a''C'之间最近的匹配.
7
8 echo ${stringZ##a*C} # abc
9 # 截掉'a''C'之间最远的匹配.
${string%substring}
从$string 的右边截掉第一个匹配的$substring
${string%%substring}
从$string 的右边截掉最后一个匹配的$substring
1 stringZ=abcABC123ABCabc
2 # ||
3 # |------------|
4
5 echo ${stringZ%b*c} # abcABC123ABCa
6 # 从$stringZ 的后边开始截掉'b''c'之间的最近的匹配
7
8 echo ${stringZ%%b*c} # a
9 # 从$stringZ 的后边开始截掉'b''c'之间的最远的匹配
子串替换
${string/substring/replacement}
使用$replacement 来替换第一个匹配的$substring.
${string//substring/replacement}
使用$replacement 来替换所有匹配的$substring.
1 stringZ=abcABC123ABCabc
2
3 echo ${stringZ/abc/xyz} # xyzABC123ABCabc
4 # 用'xyz'来替换第一个匹配的'abc'.
5
6 echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
7 # 用'xyz'来替换所有匹配的
个人觉得条件判断框的格式要求很严格,'[' 前后都必须有一个空格
if 结构

if [ condition1 ]
then
    if [ condition2 ]
    then
        do-something # 这里只有在condition1 和condition2 都可用的时候才行.
    fi
elif [ condition3 ]
then
    do ...
else
    do ....
fi

case 结构    注意要以 ;;结束
case "$variable" in
abc) echo "$variable = abc" ;;
xyz) echo "$variable = xyz" ;;
*) echo "dfsdf" ;;  #*表示default,若上面匹配都不成功则会执行
esac


for 结构 这是一个基本的循环结构.它与C 的相似结构有很大不同.
# 标准语法.
for a in 1 2 3 4 5 6 7 8 9 10
do
    echo -n "$a "
done

LIMIT=10

for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$".
for ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前边没有 "$".
do
    echo -n "$a "
done

while [condition]
do
    command...
done

和 for 循环一样,如果想把do 和条件放到同一行上还是需要一个";".
while [condition]; do

C风格语法
while (( a <= LIMIT )) # 双圆括号, 变量前边没有"$".
do
   echo -n "$a "
   ((a += 1)) # let "a+=1"
   # Yes, 看到了吧.
   # 双圆括号允许像C 风格的语法一样增加变量的值.
done

until
这个结构在循环的顶部判断条件,并且如果条件一直为false 那就一直循环下去.(与while
相反)
until [condition-is-true]
do
command...
done
注意: until 循环的判断在循环的顶部,这与某些编程语言是不同的.
与 for 循环一样,如果想把do 和条件放在一行里,就使用";".
until [condition-is-true]; do

免责声明:文章转载自《linux shell 学习笔记--变量声明与赋值,循环》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇视图的优缺点odoo里的开发规范下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle pl/sql 变量

一、变量介绍在编写pl/sql程序时,可以定义变量和常量;在pl/sql程序中包括有:1)、标量类型(scalar)2)、复合类型(composite) --用于操作单条记录3)、参照类型(reference) --用于操作多条记录4)、lob(large object)    二、标量(scalar)——常用类型1)、在编写pl/sql块时,如果要使用...

python实现同时给多个变量赋值的方法 Simultaneous Assignments

Simultaneous Assignments x,y=y,x 这个赋值的执行流程是什么? python的多元赋值原理是tuple的元组封装 (tuple packing) 和 序列拆封(sequence unpacking)。 t = 12345, 54321, 'hello!' 这是元组封装 (tuple packing) 的例子,将多个值放进tu...

微信小程序中对于变量的定义

在页面对应的js文件中: page顶部使用let定义变量,这是定义的全局变量,在当前脚本页面,任何函数中都可以直接使用变量名调用。如果做修改,就直接使用变量等于要更改的值。 使用const定义变量,就是一个常量了,不可更改的。 函数内容使用过let那就是局部变量了。值在函数内部使用了...

C++预定义宏

C/C++宏体中出现的#,#@,##: - #的功能是将其后面的宏参数进行字符串化操作(stringfication),就是对它所引用的宏变量通过替换后在其左右各加上一个双引号 -##被称为连接符(concatenator),用来将两个token连接为一个token。注意这里连接的对象是token就行,而不一定是宏的变量。 举例: Caffe中Layer的...

Velocity模板引擎笔记

模板引擎中判断对象是否为空:  #if(!${jsonObj.data.buyerName} || ${jsonObj.data.buyerName} == '')         <p>采购商名称:$!jsonObj.data.buyerCompanyName</p>  #else         <p>采购商名称:$...

Blocks学习笔记总结

  本文是对Apple的《Blocks Progromming Gude》学习的笔记总结。   对象时C级别的语法和运行时特性。和标准C函数很类似,但除了可执行代码外,还可能包含了变量自动绑定(栈)或内存托管(堆)。所以一个block维护一个状态集(数据),可以在执行的时候用来影响程序行为。Block用来作为回调特别有用。   你可以在MAC OS 10....