zoukankan      html  css  js  c++  java
  • shell脚本1——变量 $、read、``

    与Shell变量相关的几个命令:

    变量只在当前Shell中生效.

    source 这个命令让脚本影响他们父Shell的环境(. 可以代替source命令)

    export 这个命令可以让脚本影响其子Shell的环境  ()

    unset 从环境中删除变量

    其他几个与变量有关的命令:

    declare: 用于显示或设置变量

    let: 用于求整数表达式的值

    local: 用于创建不能传给子Shell的变量, 这个命令仅在过程内部有效

    readonly: 用于显示或者设置只读变量

    set: 用于设置或者重置各种Shell选项(不仅用于变量)

    shift: 用于移动位置变量

    typeset: 用于显示或者设置变量(同declare)

    变量赋值

    logfile="stdout.log"
    echo "$logfil"

    1、变量赋值——没有类型,根据赋值的类型决定变量类型,可以多次随意赋值。赋值号两边不能有空格

    1)显示定义:VAR=value

    变量声明时使用的引号不会被保留,当变量值中有空格时必须使用引号

    2)读取:read VAR

        • 一次读入一行! 可以一次读入多个变量read。

          • read firstname lastname
            输入:steve Parker Smith    以空格分,最后一个变量两个
            输入:steve 给的少,后一个变量为空字符串,一直存在于shell中,可以在当前shell中用set | grep name=查看
        • 从文件读入
          • read password < /etc/passwd读入一行
            while read passwd
            do
                echo $passwd
            done < /etc/passwd一直循环读,直到不再输入
        • read -p “what file do you want to test?" filename
        • 命令替换:
      • 命令赋值:VAR=`date`、 VAR=$(date)
      • 数值计算:c=`expr $a +4`、c=let $a + 4  、$(($a+$b))  但也有点区别:有的shell不支持,是否有对非数值进行的先验(expr没有)
    • 将变量值设置为某个给定命令的输出,其时是第一种赋值方式的变种
      • TODAY=`date +%A`动态赋值

    引用变量

    2、引用变量——的格式是${变量名}   $(variable)bar    echo $variable bar ${variable}bar

    访问不存在的变量只会返回空字符串或0,具体取决与上下文,所以当将某个变量名写错时,不会报错,还能有结果; 

    变量名区分大小写

    3、支持一维数组变量:

    [lixn@localhost ~]$ Users=(zsan lisi wangwu zhangsan lisi)  定义一维数组
    [lixn@localhost ~]$ echo $Users                  索引
    zsan
    [lixn@localhost ~]$ echo ${Users[0]}
    zsan
    [lixn@localhost ~]$ echo ${Users[2]}
    wangwu
    [lixn@localhost ~]$ echo ${Users}
    zsan
    [lixn@localhost ~]$ echo ${Users[*]}
    zsan lisi wangwu zhangsan lisi
    [lixn@localhost ~]$ echo ${#Users[*]}       返回数组长度
    5
    [lixn@localhost ~]$ echo ${#Users[2]}       返回元素值的长度
    6
    [lixn@localhost ~]$ Users[1]=wlm          修改值
    [lixn@localhost ~]$ Account=(${Users[*]})     数组之间赋值
    [lixn@localhost ~]$ echo ${Account[*]}
    zsan wlm wangwu zhangsan lisi

    特殊变量

    ${#var} 变量的长度

    特殊变量由bash自动定义和赋值,用户不能修改。

    $$:当前进程号

    $?:前一个命令的退出状态,0表示执行成功,1标志执行失败

    $0:存储命令本身——位置参数

    $1-$n:依次代表命令行参数,当大于9时,用{}括起来,如${10}——位置参数

    $#:命令行参数的个数,不包括命令本身

    $*:保存了全部的命令行参数。不包含命令本身 $@

    $!:后台程序的pid

    其他

    basename命令——去掉位置参数的路径信息,所以./scropt.sh、/usr/local/bin/script.sh等会被转化为script.sh

    Myname is `basename $0`

    shift命令——多用于“下一个参数”,shift内置命令每次调用时将所有参数进行一次移位,首先截去$1,然后截去$2....无法将移位逆向进行。

        shift也可以一次截去多个变量(shift 3  或者  shift shift shift)多用后者

    #!/bin/bash
    echo "My name is `basename $0` - I was called as $0"
    echo "I was called with $# parameters."
    count=1
    while [ "$#" -ge "1" ]; do
        echo "Parameter number $count is: $1"
        let count=$count+1
        shift
    done
    
    [lixn@Fedora24 bash_learn]$ ./shift.sh 
    My name is shift.sh - I was called as ./shift.sh
    I was called with 0 parameters.
    [lixn@Fedora24 bash_learn]$ ./shift.sh one two three
    My name is shift.sh - I was called as ./shift.sh
    I was called with 3 parameters.
    Parameter number 1 is: one
    Parameter number 2 is: two
    Parameter number 3 is: three

    $*和$@的使用与区别

    删除变量——unset myvar;将变量赋值为空字符串也能实现变量的删除,但与unset不完全相同

  • 相关阅读:
    ajax方法参数详解与$.each()和jquery里面each方法的区别
    Struts2框架里面action与前端jsp页面进行交互路径问题---》一个对话框里面有很多超链接,进行相应的跳转
    Struts2框架action路径问题心得----》页面url请求怎么找action
    Mybatis映射.xml文件报错
    MyBatis框架流程
    Struts2框架action层学习心得体会
    动态sql语句和动态传入参数个数
    String,数组,list集合长度的使用
    ResourceBundle和Locale
    linux编译内核
  • 原文地址:https://www.cnblogs.com/daduryi/p/6627660.html
Copyright © 2011-2022 走看看