zoukankan      html  css  js  c++  java
  • linux shell脚本之-变量极速入门与进阶(1)

    1,如果创建shell脚本?

    使用任意文本编辑软件,一般为vim,创建.sh结尾的文件,在文件的最开头用 #!/bin/bash 注明shell的类型

    如:

    ghostwu@dev:~/linux/shell$ cat how_to_use_shell.sh 
    #!/bin/bash
    ls /

    2,如何执行shell?

    >把shell文件当做bash的命令行参数

    ghostwu@dev:~/linux/shell$ ls -l
    total 4
    -rwxrwxr-x 1 ghostwu ghostwu 17 5月  28 18:14 how_to_use_shell.sh
    ghostwu@dev:~/linux/shell$ bash how_to_use_shell.sh 
    backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
    bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
    boot    etc    lib       media       patch  run   srv   usr  www
    ghostwu@dev:~/linux/shell$ /bin/bash how_to_use_shell.sh 
    backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
    bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
    boot    etc    lib       media       patch  run   srv   usr  www
    ghostwu@dev:~/linux/shell$ bash ~/linux/shell/how_to_use_shell.sh 
    backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
    bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
    boot    etc    lib       media       patch  run   srv   usr  www
    ghostwu@dev:~/linux/shell$ sh how_to_use_shell.sh 
    backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
    bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
    boot    etc    lib       media       patch  run   srv   usr  www

    >给shell文件添加可执行权限,我这里已经添加过了,使用命令( chmod a+x 脚本文件路径 )

    ghostwu@dev:~/linux/shell$ ./how_to_use_shell.sh 
    backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
    bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
    boot    etc    lib       media       patch  run   srv   usr  www
    ghostwu@dev:~/linux/shell$ ~/linux/shell/how_to_use_shell.sh 
    backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
    bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
    boot    etc    lib       media       patch  run   srv   usr  www
    ghostwu@dev:~/linux/shell$ 

    3,单双引号跟php是一样的,单引号不解释变量,双引号会解释变量

    ghostwu@dev:~/linux/shell$ echo "learning shell program with ghostwu"
    learning shell program with ghostwu
    ghostwu@dev:~/linux/shell$ echo 'learning shell program with ghostwu'
    learning shell program with ghostwu
    ghostwu@dev:~/linux/shell$ echo learning shell program with ghostwu
    learning shell program with ghostwu
    ghostwu@dev:~/linux/shell$ name=ghostwu
    ghostwu@dev:~/linux/shell$ echo $name
    ghostwu
    ghostwu@dev:~/linux/shell$ echo "$name"
    ghostwu
    ghostwu@dev:~/linux/shell$ echo '$name'
    $name
    ghostwu@dev:~/linux/shell$ echo $name
    ghostwu

    4,-n,不会转义换行符。-e,会转义字符

    ghostwu@dev:~/linux/shell$ echo -n "ghostwu"
    ghostwughostwu@dev:~/linux/shell$ man echo
    ghostwu@dev:~/linux/shell$ echo "1	2	3"
    1	2	3
    ghostwu@dev:~/linux/shell$ echo -e "1	2	3"
    1    2    3

    5,打印彩色输出

    在终端中生成彩色输出相当好玩,我们可以使用转义序列来实现。
    每种颜色都有对应的颜色码。比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝
    色=34,洋红=35,青色=36,白色=37。
    要打印彩色文本,可输入如下命令:
    echo -e "e[1;31m This is red text e[0m"
    e[1;31 将颜色设为红色, e[0m 将颜色重新置回。只需要将 31 替换成想要的颜色码就可以了。
    要设置彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,
    蓝色=44,洋红=45,青色=46,白色=47。
    要打印彩色文本,可输入如下命令:
    echo -e "e[1;42m Green Background e[0m"

    ghostwu@dev:~/linux/shell$ echo "e[1;31m Hello Ghostwu e[0m"
    e[1;31m Hello Ghostwu e[0m
    ghostwu@dev:~/linux/shell$ echo -e "e[1;31m Hello Ghostwu e[0m"
     Hello Ghostwu 
    ghostwu@dev:~/linux/shell$ echo -e "e[1;31mHello Ghostwu e[0m"
    Hello Ghostwu 
    ghostwu@dev:~/linux/shell$ echo -e "e[1;31mHello Ghostwu e[0m!"
    Hello Ghostwu !

    这个要截图,才能看出效果

    变量:

    在Bash中,每一个变量的值都是字符串。
    无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储

    5,反引号(数字1左边的那个键),表示引用命令的执行结果

    ghostwu@dev:~/linux/shell$ ls
    how_to_use_shell.sh
    ghostwu@dev:~/linux/shell$ str=`ls`
    ghostwu@dev:~/linux/shell$ echo $str
    how_to_use_shell.sh
    ghostwu@dev:~/linux/shell$ echo str
    str

    注意:echo $str 与 echo str。前面表示str变量,后面表示字符串str

    反引号的另一种等价写法,用小括号括起来: $()

    ghostwu@dev:~/linux/shell$ echo str2
    str2
    ghostwu@dev:~/linux/shell$ str2=$(ls)
    ghostwu@dev:~/linux/shell$ echo $str2
    how_to_use_shell.sh

    str2=$(ls):取得ls命令执行后的结果赋值给str2这个变量【注意:变量=值, 表示变量赋值,或者改写变量的值,要使用变量的值(访问变量的值)在变量前面用$】

    ghostwu@dev:~/linux/shell$ str=`date "+%F"`
    ghostwu@dev:~/linux/shell$ echo $str
    2018-05-28
    ghostwu@dev:~/linux/shell$ str2=$(date "+%F")
    ghostwu@dev:~/linux/shell$ echo $str2
    2018-05-28

    变量引用的应用:可以把变量返回的值,拿来作为其他的应用,如时间的返回值,常用来备份文件

    ghostwu@dev:~/linux/shell$ tar czvf `date "+%F"`_shell.tar.gz how_to_use_shell.sh 
    how_to_use_shell.sh
    ghostwu@dev:~/linux/shell$ ls
    2018-05-28_shell.tar.gz  how_to_use_shell.sh

    6,引用命令行的参数,用$1..$9,大于10用大括号括起来,如:${10} 

    ghostwu@dev:~/linux/shell/how_to_use_var$ cat var.sh 
    #!/bin/bash
    echo $1 $2 $3 ${10}
    ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh {a..z}
    a b c j

    给var.sh传入26个字母作为参数, a--->$1,b--->$2, c----->$3, j---->$10

    7,$0表示脚本本身

    >如果用bash单纯执行脚本,$0就是脚本的名称

    >如果用全路径执行脚本,那么$0就是脚本的名称+路径

    ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh 
    var.sh
    ghostwu@dev:~/linux/shell/how_to_use_var$ bash ~/linux/shell/how_to_use_var/var.sh 
    /home/ghostwu/linux/shell/how_to_use_var/var.sh

    8,dirname获取脚本的路径,basename获取脚本名称

    ghostwu@dev:~/linux/shell/how_to_use_var$ dirname ~/linux/shell/how_to_use_var/var.sh 
    /home/ghostwu/linux/shell/how_to_use_var
    ghostwu@dev:~/linux/shell/how_to_use_var$ basename ~/linux/shell/how_to_use_var/var.sh 
    var.sh

    9,$# 获取参数的个数

    ghostwu@dev:~/linux/shell/how_to_use_var$ cat var.sh 
    #!/bin/bash
    echo $#
    ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh {a..j}
    10

    10,判断参数的个数,给出一些提示信息 

    ghostwu@dev:~/linux/shell/how_to_use_var$ bash var2.sh a
    usage:/bin/bash var2.sh arg1 arg2
    ghostwu@dev:~/linux/shell/how_to_use_var$ bash var2.sh a b
    a b
    ghostwu@dev:~/linux/shell/how_to_use_var$ cat var2.sh 
    #!/bin/bash
    if [ $# -ne 2 ]
        then
            echo "usage:/bin/bash $0 arg1 arg2"
            exit 1
    fi
    echo $1 $2

    11,set -- 设置位置参数,跟命令行传参差不多

    ghostwu@dev:~$ set -- hello ghost wu
    ghostwu@dev:~$ echo $#
    3
    ghostwu@dev:~$ echo $1
    hello
    ghostwu@dev:~$ echo $2
    ghost
    ghostwu@dev:~$ echo $3
    wu

    12,$@, $*,不加引号时,输出所有参数

    ghostwu@dev:~$ set -- hello ghost wu
    ghostwu@dev:~$ echo $#
    3
    ghostwu@dev:~$ echo $1
    hello
    ghostwu@dev:~$ echo $2
    ghost
    ghostwu@dev:~$ echo $3
    wu
    ghostwu@dev:~$ echo $*
    hello ghost wu
    ghostwu@dev:~$ echo $@
    hello ghost wu
    ghostwu@dev:~$ for i in $*; do echo $i; done
    hello
    ghost
    wu
    ghostwu@dev:~$ for i in $@; do echo $i; done
    hello
    ghost
    wu

    加双引号时,在循环遍历的情况下:"$*" 所有参数当做一个参数。 "$@"输出所有参数

    ghostwu@dev:~$ echo "$*"
    hello ghost wu
    ghostwu@dev:~$ echo "$@"
    hello ghost wu
    ghostwu@dev:~$ for i in "$*"; do echo $i; done
    hello ghost wu
    ghostwu@dev:~$ for i in "$@"; do echo $i; done
    hello
    ghost
    wu

    下面的例子,相当于加引号的 "$@" 

    ghostwu@dev:~$ for i;do echo $i; done
    hello
    ghost
    wu

    shift:将位置参数左移

    ghostwu@dev:~$ echo $# $1 $2 $3
    3 hello ghost wu
    ghostwu@dev:~$ shift
    ghostwu@dev:~$ echo $# $1 $2 $3
    2 ghost wu

    13,$? 获取上一条命令的执行状态返回值( 0 为成功,非0为失败 )

    ghostwu@dev:~$ pwd
    /home/ghostwu
    ghostwu@dev:~$ echo $?
    0
    ghostwu@dev:~$ cd /root
    bash: cd: /root: Permission denied
    ghostwu@dev:~$ echo $?
    1
  • 相关阅读:
    低耦合高内聚
    Python 爬虫库
    Python 爬虫的工具列表
    selenium对浏览器操作、鼠标操作等总结
    简单文件操作
    环境错误2
    环境错误
    pip list 警告消除方法
    python 安装scrapy错误
    按是否执行程序的角度划分:静态测试、动态测试
  • 原文地址:https://www.cnblogs.com/ghostwu/p/9101569.html
Copyright © 2011-2022 走看看