zoukankan      html  css  js  c++  java
  • shell脚本基础之变量使用

    正则表达式符号
    . 任意的一个字符
    * 前边字符重复任意次
    (cui)* 前边单词重复任意次
    X+ 加号前边字符重复1次以上
    X{1,}  表1次
    X{1,8} 最少一次最多8次
    X{,n} 最多几次
    X?表0次
    X{m} 精确匹配多少次
    ^ 行首(中括号外)
    $ 行尾
    <   单词的词首
    >   单词的词尾
    [wang] w a n g  中括号里面的任意一个字符
    [^.] 中括号里面 ^ 表示除了  除了. 的任意字符
    a|buy  a或buy
    (a|b)uy auy或buy
    (epr) (epr2) 1 2  匹配完的结果 第一个 第二个
     
    执行权限
    执行脚本: 【hello.sh】
    ①有执行权限  chmod +x hello.sh
    相对路径 ./hello.sh
    ②没有执行权限也想执行
    bash hello.sh
    cat hello.sh |bsah
    ③直接执行 hello.sh 即可
    echo $PATH  --把文件放到任何PATH目录下即可
    [root@localhost date]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@localhost date]#chmod +x hello.sh
    [root@localhost date]# mkdir /root/bin
    [root@localhost date]# mv hello.sh /root/bin/
    [root@localhost date]# hello.sh
    [root@localhost date]# hash
    执行后脚本文件会 hash到内存里面,一旦将PATH下的文件换个目录,重新执行hello.sh 将找不到文件;
    需要删除hash文件路径:hash -d hello.sh ;即可
     
    脚本调试:
    检测脚本中的语法错误:bash -n f1.sh  -n 只检测语法
    bash -x f1.sh 跟踪执行逻辑问题
     
    变量的使用
    定义变量若值等于命令如:hostname,使用反引号引用。
    例:① name=`hostname`  ②name=`cat/etc/fstab`
    echo $name  数据多的话格式会有问题,所有数据都在一行
    echo "$name" 保留格式
     
    变量:字符串、数字
    shell里可以直接赋值,无需指定数据类型。
    变量名不能使用数字作为开头。
        
    变量:$ 带$则是变量名
    引用变量需要加 $
    echo $PATH
     
    bash中变量的种类:
    局部变量:当前session有效
    echo $$ 当前进程的进程编号
    echo $PPID 当前进程的父进程编号
    pstree -p  查进程树 centos最小安装不能直接使用该命令,需安装psmisc
    局部变量只在当前bash运行
    $SHLVL 查看shell嵌套了几层
     
    环境变量:全局变量
    name=hello
    echo $name
    export name 向子进程声明环境变量 or exoport name=hello
    exportenv 可以查看系统里的环境变量
    unset name 删除变量名释放内存
     
    env-->export  :查看系统里的环境变量
     
    变量的分类
    只读变量-->常量声明
    readonly name =hello  只能使用不能修改,不可unset  exit 退出程序常量消失
    declare  -r  =readonly  -p  系统自带常量
     
    () 命令放小括号里,一次性任务,开启子shell,可以定义一次性变量,结束后不影响环境
    {}大括号影响当前shell环境
     
    位置变量
    $1  $2  $3 表示  $*为多个参数
    执行脚本后边跟的$1 $2 $3 等
     
    scp 远程复制文件 scp f1 wang@192.168.8.12:/root/bin   ps:非root用户,目标路径的所有者为wang用户
    复制当前目录下的文件,到对方主机wang用户@对方地址:、对方目录
    将对方主机、用户、路径写入脚本scp.sh,需要传输的文件作为变量.
    !#/bin/bash
    echo "start  copy......"
    scp $1  root@192.168.8.12:/root/bin 
    echo "copy is finished"
     
    执行脚本:scp.sh /etc/aaa   --$1的位置参数     $* 后边可以跟多个文件
    位置参数$* 跟 $@ 的区别:使用时需要用""引号引起来。
    $*:传递给脚本的所有参数,全部参数合为一个字符串。
    $@:传递给脚本的所有参数,每个参数为独立字符串。
    $0:命令本身
    $#:传递给脚本的参数个数。
     
    ln -s scp.sh link.sh  创建scp.sh 的软连接为link.sh  执行link.sh $0 显示为link.sh
    使用软连接做到同一个脚本,不同功能。
    例如:
    [root@localhost ~]# which pidof
    /usr/sbin/pidof
    [root@localhost ~]# ll /usr/sbin/pidof
    lrwxrwxrwx. 1 root root 18 Nov 13 19:06 /usr/sbin/pidof -> /usr/sbin/killall5
    [root@localhost ~]# /usr/sbin/pidof bash   --软连接执行bash 返回的结果
    2005 621
    [root@localhost ~]# /usr/sbin/killall5 bash  --源文件执行bash返回的结果
    killall5: only one argument, a signal number, allowed
    执行结果不一致也就是$0为不同结果时,可以实现不同效果,不同值可以做不同功能。
     
    算数运算
    算数的使用方法
    let z=x+y   echo $z   ② z =$[x+y]  ③z = $((x+y))  ④expr 3 + 4    *expr是个命令
     
    echo $?   值为0是真,值为1是假
    &  并且   | 或者
    && 短路 与    【逻辑关系:如果 cmd1 && cmd2 ,cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行】
    || 短路 或     【逻辑关系:如果cmd1 || cmd2 ,cmd1为真cmd2不需要执行,反之cmd1 为假,需要cmd2执行】
     
    小练习:编写脚本 /root/bin/sumid.sh  计算/etc/passwd 文件中第十个用户和第20个用户的ID之和
    #!/bin/bash
    a="`head -n10 /etc/passwd | tail -n1 | cut -d: -f3`"
    b="`head -n20 /etc/passwd | tail -n1 | cut -d: -f3`"
    let c=a+b
     
  • 相关阅读:
    扩展AuthorizeAttribute
    扩展ValidationAttribute 1
    动态linq to list排序
    CSS属性书写顺序及命名规则
    增强网站可访问性的25种方法
    -webkit-filter是神马?
    docker安装
    docker的体系结构
    docker和虚拟化
    初识docker——docker基本概述
  • 原文地址:https://www.cnblogs.com/cuixn/p/10531396.html
Copyright © 2011-2022 走看看