美文网首页
shell基础

shell基础

作者: 比卡_没有丘 | 来源:发表于2019-03-18 12:08 被阅读0次

    一、shell简介

    Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务,类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量、参数、函数、流程控制等等。它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

    二、shell特性

    1.shell的通配符(元字符)

    ①“ * ” \color{red}{匹配任意多个字符}
    ls in* rm -rf *
    rm -rf .pdf
    find / -iname "
    -eth0"
    ② “ ? ” \color{red}{匹配任意一个字符}
    touch love loove live l7ve; ll l?ve
    ③ “[ ] ” \color{red}{匹配括号任意一个字符} (centos 7 不区分大小写)
    ll l[io]ve
    ll l[^a-z]ve \color{blue}{本意取反!}
    ll l[^a-z0-9]ve \color{blue}{既不是英文字母也不是数字}
    ll /dev/sd[a-z]
    ④ “ ( ) ” 在子shell中执行(cd /boot;ls) (umask 077; touch file1000)
    ⑤ " { } "集合 touch file{1..9}
    mkdir /home/{111,222}
    mkdir -pv /home/{333/{aaa,bbb},444}

    [root@localhost tmp]  mkdir -pv /home/{333/{aaa,bbb},444}
    mkdir: created directory ‘/home/333’
    mkdir: created directory ‘/home/333/aaa’
    mkdir: created directory ‘/home/333/bbb’
    mkdir: created directory ‘/home/444’
    
    

    ⑥ “ \ ” 转移符,让元字符回归本意

    # 将空格使用转移符转移
    [root@localhost tmp]  touch yu\ tao
    -rw-r--r--. 1 root root     0 Mar  9 18:06 yu tao
    # 使用转移符将 t n 进行转移
    [root@localhost tmp]  echo -e "a\tb"
    a   b
    [root@localhost tmp]  echo -e "a\nb"
    a
    b
    

    2.echo的颜色输出

    对于echo颜色输出而言,存在两种模式。即前景色与后景色两种。centos规定[30-39]为前景色部分,而[40-50]为后景色部分。

    //改变前景色
    [root@localhost tmp] echo -e "\e[1;34mThis is a txt.\e[0m"
    This is a txt.
    //改变后景色
    [root@localhost tmp] echo -e "\e[1;42mThis is a txt.\e[0m"
    This is a txt.
    
    Y T

    三、shell变量

    1.shell变量的类型:

    shell变量分环境变量(全局变量)和普通变量(局部变量)

    环境变量亦称为全局变量,可以在建立它们的shell及其派生出来的任意子进程shell中使用;环境变量又分为自定义环境变量和Bash内置的环境变量。

    • 自定义变量

    定义变量:变量名=变量值 变量名必须以字母或者下划线开头,区别大小写
    引用变量:变量名或者{变量名}
    查看变量:echo¥变量名 set (所有变量:包含自定义变量和环境变量)
    取消变量:unset 变量名
    作用范围:仅在当前shell中生效

    实例展示

    //方式一:利用if else 判断语句
    #!/usr/bin/bash
    ip=192.168.146.124
    if ping -c1 $ip &>/dev/null;then
      echo "$ip is up"
    else
      echo "$ip is down"
    fi
    
    //方式二:利用 read 交互以及 条件判断
    #!/usr/bin/bash
    read -p "please input a ip:" ip
    ping -c1 $ip &>/dev/null
    if [ $? -eq 0 ];then
      echo "$ip is up"
    else
      echo "$ip is down"
    fi
    
    • 环境变量

    定义环境变量: 方式一 export back_dir2=/home/backup
    方法二: export back_dir1 将自定义变量转换成环境变量
    引用环境变量:变量名 或{变量名}
    查看环境变量:echo $变量名 env 例如 env|grep back_dir2
    变量作用范围:在当前shell和子shell中有效

    [root@localhost ~]# ip1=3.3.3.3
    //编写脚本文件并赋权
    echo  "ip1 is $ip1"
    echo  "ip2 is $ip2"
    //执行shell时会发现不会在子shell中显示。故使用export、
    [root@localhost ~]# export ip2=4.4.4.4
    [root@localhost ~]# export ip1
    

    在日常生活中几乎很少使用环境变量,大多是情况会使用自定义变量。当脚本过长时。可以尝试编写多个小脚本模块进行调用

    image.png
    //编写pubilc.sh
    #!/usr/bin/bash
    ip10=1.1.1.1
    dir_path=/etc/a.txt
    //编写 1.sh
    #!/usr/bin/bash  
    . public.sh      进行调用
    echo "ip10 is $ip10"
    echo "dir_path is: $dir_path
    

    2.shell位置变量和预定义

    ①位置变量:如:12 34 56 78 9{10}

    #!/usr/bin/bash
    ping -c1 $1 &>/dev/null
    if [ $? -eq 0 ] ; then
            echo "$1 is up"
    else
            echo "$1 is down"
    fi
    //故执行shell需要编写位置变量
    [root@mysql-slave1 test]# sh 1.sh 192.168.146.129
    192.168.146.129 is up
    

    ②预定义变量
    0 脚本名* 所有的参数
    @ 所有的参数# 参数的个数
    当前进程的PID
    ! 上一个后台进程的PID? 上一个命令的返回值 0表示成功

    echo "第二个位置参数是$2"
    echo "第一个位置参数是$1"
    echo "第四个位置参数是$4"
    echo "所有参数是:$*"
    echo "所有参数是:$@"
    echo "参数的个数是:$#"
    echo "当前进程的PID是$$"
    echo '$1='$1
    echo '$2='$2
    echo '$3='$3
    echo '$*='$*
    echo '$@='$@
    echo '$#='$#
    echo '$$='$$
    
    

    执行上述脚本可以综合学习位置变量与预定义变量

    [root@mysql-slave1 test]# sh tesh.sh  a b c yu tao yutao f g
    第二个位置参数是b
    第一个位置参数是a
    第四个位置参数是yu
    所有参数是:a b c yu tao yutao f g
    所有参数是:a b c yu tao yutao f g
    参数的个数是:8
    当前进程的PID是1315
    $1=a
    $2=b
    $3=c
    $*=a b c yu tao yutao f g
    $@=a b c yu tao yutao f g
    $#=8
    $$=1315
    
    • shell中 * 与@的异同点

    相同点:都是引用所有参数。
    不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

    实例展示

    #!/usr/bin/bash
    echo "-- \$* 演示 ---"
    for i in "$*"; do
        echo $i
    done
    
    echo "-- \$@ 演示 ---"
    for i in "$@"; do
        echo $i
    done
    //执行结果
    [root@mysql-slave1 test]# sh diff.sh 1 2 3
    
    -- $* 演示 ---
    1 2 3
    
    -- $@ 演示 ---
    1
    2
    3
    
    • 基础名(basename)的获取 :例如我只想获取vim /etc/sysconfig/network-scripts/ifcfg-eth0中的ifcfg-eth0就可以使用basename
    //首先创建一个IP表 ip.txt
    [root@mysql-slave1 test]# vim ip.txt 
    10.18.30.100
    192.168.146.129
    192.168.193.199
    
    //创建可交互式测试脚本
    #!/usr/bin/bash
    #如果用户执行脚本时没有加参数,交互提示
    if [ $# -eq 0 ];then
        echo "usage:`basename $0` + file" 
        exit
    fi
    
    if [ ! -f $1 ];then
        echo "error file!"
        exit
    fi
    
    for ip in `cat $1`
    do
        ping -c1 $ip &>/dev/null
        if [ $? -eq 0 ];then
            echo "$ip is up "
        else
            echo "$ip is down"  
    fi
    done
    
    

    相关文章

      网友评论

          本文标题:shell基础

          本文链接:https://www.haomeiwen.com/subject/ujoiuqtx.html