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

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

 

posted on 2015-11-24 11:22  zyz913614263  阅读(6278)  评论(1编辑  收藏  举报

导航