设为首页 收藏本站
查看: 928|回复: 0

Linux脚本(shell)编程(二) 基本语法

[复制链接]

尚未签到

发表于 2015-10-26 10:25:45 | 显示全部楼层 |阅读模式
  shell的基本语法
  赋值一般采用以下形式:变量名=字符串
  1. “=”号两边是不能有空格的,不然会出错的。(这点初学者特别容易出错)
  2. 若赋值语句中,“=”后面没有任何内容,则该变量为一个空字符串,若只声明而没赋值,则该变量默认也是一个空字符串。
  3. 若一个变量中含有空格、制表符、换行符,则要用双引号括起来,不然会出错。
  4. 在shell程序文件中,如果想引用已经定义的变量,一般要在变量名前加“$”符号,这个符号含义是告诉shell,后面是一个变量。
  5. 单引号(‘…’):单引号也称为强引用,引用所有内容。在单引号中,没有字符拥有特殊含义。
  6. 双引号(“…”):双引号也称为弱引用,除了3个元字符$(美元符号)、`(反引号)和/(反斜线)外引用所有内容。在双引号中,这3个字符还保留它们各自的特殊含义。
  7. 反引号(`…`):命令替换,命令替换允许在一条命令中嵌入一条命令。shell首先执行嵌入的命令,并且用输出替换该命令。然后shell再执行整个命令。
  8. 在shell变量引用中,一个变量与一个长字符串的组合,如果当前变量处在字符串的最后,可以利用直接引用的方式;如果处在中间或开头的位置,则可以用花括号将变量名包含起来。如下:

程序:
  

[c-sharp]
view plaincopyprint?

  • #!/bin/bash  
  • address=beijing  
  • echo $address  
  • echo ${address}test  
  • echo test$address  

#!/bin/bash
address=beijing
echo $address
echo ${address}test
echo test$address  
  
  
  输出:


beijing
beijingtest
testbeijing  
  
  
  shell中的通配符(用于模式匹配)
  
  1. “*”符号
  “*”符号用于匹配字符串中0次或多次出现的字符,如:s*可以匹配shell、shanghai等。在使用“*”符号时要注意一点,在匹配文件名与路径名时,“.”符号与“/”必须显示匹配,如:*test不能匹配“.httest”文件,而要用“.*test”来匹配,同时“/home/test”需要用”/*/test”来匹配。
  2. “?”符号
  “?”符号仅匹配对应位置的一个字符。如:m?ke可匹配”mike”、”make”等,但不能匹配”mooke”。
  3. “[]“符号
  “[]“称号的作用是匹配该字符组所限定范围内的任何一个字符,方括号中的字符可以由直接级出的字符组成,如:[adehk];也可以由表示限定范围的起始字符和终止字符及中间的连接字符”-”组成。如:[a-zA-H]、[0-9]等。
  4. “!”符号
  “!”符号是与”[]“符号配合使用的,”!”的作用是匹配不在方括号中列出的字符。例如:t[!a-h]st,则可表示tyst、t9st,但不能表示test。
  
  
  
  shell中的输入
  shell中输入是由函数read实现,原型为:read 变量1 [变量2]
  利用read函数可以交互地为变量赋值,当然也可以通过制表符或空格为多变量赋值,说明如下:
  1. 如果变量个数多于输入串中字符串个数,则依次赋值,剩下变量取空值。
  2. 如果变量个数等于输入串中字符串个数,则一一对应赋值。
  3. 如果变量个数少于输入串中字符串个数,刚除依次赋值外,最后一个变量接纳剩下的字符串。
  例如:


[c-sharp]
view plaincopyprint?

  • #!/bin/bash  
  • echo "input your name and age:"  
  • read name age  
  • echo "your name is: "$name  
  • echo "your age is: "$age

#!/bin/bash
echo "input your name and age:"
read name age
echo "your name is: "$name
echo "your age is: "$age  如果你输入Jim 15 则输出:


input your name and age:
your name is: Jim
your age is: 15  
  
  
  shell中的输出
  shell中输出是由echo函数实现的,echo可直接输出其后面所跟变量的值或直接输出其后面的字符串。echo函数后面以空格隔开,以换行符终止。如果数据之间要保留多个空格,则要用双引号把它们括起来以便shell对它们进行正确的操作。另:echo函数还定义了一组转义字符,在使用转义字符时要加入”-e”选项。其转义字符如下:
  “/a” :响铃报警,”/b” :后退一字符,”/f” :换页,”/n” :显示换行,”/t” :制表符,”/v” :垂直制表符,”/r” :回车符,”//” :反斜线。

例如:

[c-sharp]
view plaincopyprint?

  • #!/bin/bash  
  • echo -e hello,'/n'world!  
  • echo hello,'/n'world!  
  • echo '-e' hello,'/n'world!
  • echo -e hello,"/n"world!
  • echo -e hello,/nworld!  
  • echo hello,/nworld!  

#!/bin/bash
echo -e hello,'/n'world!
echo hello,'/n'world!
echo '-e' hello,'/n'world!
echo -e hello,"/n"world!
echo -e hello,/nworld!
echo hello,/nworld!  输出:


hello,
world!
hello,/nworld!
hello,
world!
hello,
world!
hello,nworld!
hello,nworld!  
  shell中的数组
  shell支持一维数组,但并不限定数组大小,数组下标从0开始。
  在操作数组时,取值方式是:${数组名[下标]} ;赋值方式是:数组名[下标]=值 (为单个数组元素赋值);如果要对整个数组的所有元素赋值,可以采用:数组名=(值1,值2,值3,…),值与值之间要用空格隔开。
  遍历数组除用循环外还可用:“数组名
  • ”或“数组名[@]”,例如:

    [c-sharp]
    view plaincopyprint?

    • #!/bin/bash  
    • array1[0]=beijing  
    • array1[1]=shanghai  
    • array2=(guangzhou,shenzhen,chengdu)  
    • echo "/${array1[0]} = " ${array1[0]}
    • echo "/$array1[1] = "$array1[1]  
    • echo "/${array1
    • } = "${array1
    • }
    • echo "/$array1 = "$array1  
    • echo "/${array2
    • } = "${array2
    • }
    • echo "/${array2[@]} = "${array2[@]}  
    • echo "/$array2 = "$array2
    • echo "/$array2[1] = "$array2[1]  

    #!/bin/bash
    array1[0]=beijing
    array1[1]=shanghai
    array2=(guangzhou,shenzhen,chengdu)
    echo "/${array1[0]} = " ${array1[0]}
    echo "/$array1[1] = "$array1[1]
    echo "/${array1
  • } = "${array1
  • }
    echo "/$array1 = "$array1
    echo "/${array2
  • } = "${array2
  • }
    echo "/${array2[@]} = "${array2[@]}
    echo "/$array2 = "$array2
    echo "/$array2[1] = "$array2[1]  输出:


    ${array1[0]} =  beijing
    $array1[1] = beijing[1]
    ${array1
  • } = beijing shanghai
    $array1 = beijing
    ${array2
  • } = guangzhou,shenzhen,chengdu
    ${array2[@]} = guangzhou,shenzhen,chengdu
    $array2 = guangzhou,shenzhen,chengdu
    $array2[1] = guangzhou,shenzhen,chengdu[1]  注:数组的赋值与输出有点麻烦。

    对于数组修改操作,可以再对其重新赋值;但如果要删除一个已经赋值后的元素则需要借助一个外部命令:unset,如:unset array[0]可清空下标为0的元素,此时数组大小减一;unset array[@]可以清空整个数组元素所有元素。例如:

    [c-sharp]
    view plaincopyprint?

    • #!/bin/bash  
    • address=(beijing,shanghai,shandong)  
    • address[0]=nanjing  
    • echo ${address
    • }  
    • unset address[0]  
    • echo ${address
    • }  

    #!/bin/bash
    address=(beijing,shanghai,shandong)
    address[0]=nanjing
    echo ${address
  • }
    unset address[0]
    echo ${address
  • }  输出:



    beijing shanghai shandong
    shanghai shandong  注:关于数组输入与输出规则比较多,得多练习掌握。
      
      主要参考文章:
      http://chenzhiwei.net/2010/07/linux-shell-study-notes-part-1/

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130870-1-1.html 上篇帖子: shell 判断语句 下篇帖子: shell编程三~变量
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表