由 Python 到 Shell

作者: 谢小路 | 来源:发表于2017-11-12 22:22 被阅读211次

    入职半年,进步并不是想象中的那么大,虽说在任何地方工作都其实是靠自己的努力、对技术的钻研,达到熟练、进而开拓其他领域等,还是需要不断的“偷懒”, 能使用编程语言实现的东西尽量编写脚本完成,而不是被一系列杂乱的事影响对工作的完成和自己的进步。

    最近的总结输出也不够多,其实是没有刻意的创造练习的机会,对自己掌握知识是不利的,看上去总结输出很耗费时间,但是当“输出总结”公布在互联网上,其实它就成为了一个作品,是作品就有好坏、就有影响力强弱。“作品”事实上扮演着见证者的角色,你的进步或是你的退步,你的关注点等

    鉴于入职之前对很多东西都不是很懂,比如 Liunx, shell ...

    最近做的工作都是在频繁的重复工作,所以借着这个契机还是入手了下shell 脚本,发现有编程基础,其实这些很容易入手,编写一些简易的脚本完成一些重复性工作,既简约了时间又可以保证正确率,手动操作,总是会出现部分错误的。

    学新东西是这样的:

    1. 花80%的时间攻克20%的核心知识
    2. 借鉴已经熟悉的知识点来理解陌生的知识点
    3. 反复

    所以这篇文章借鉴Python 的知识来理解Shell 的语法。暂且叫简易入门吧。

    0. 编程语言

    王垠写过一篇文章 如何掌握所有的程序语言 ,毕竟是大神, 虽然对于普通人来讲智商平平,精力有限,难以掌握所有程序语言,甚至难以掌握一门程序语言,但是看完文章难道不应该受到些启发吗。

    重视语言特性,而不是语言。

    假如让你实现一门编程语言,你觉得要包括些什么? 语言特性,再加上些特殊的语法。

    各程序语言语法各异,但其实都是在按照程序发明者规定的语法进行组装代码,实现目标。

    所以其实程序语言最基础的就是语言特性:

    比如:

    • 变量:各种类型:整型、字符串、数组...
    • 循环语句:if 判断,for 循环
    • 函数: 参数、返回值
    • 算术运算、逻辑运算等

    ...

    就这几个点:应该可以实现一个简易的编程语言了。

    那下面我们就按上面的几点来学习。

    先学习理解 python 中的用法。

    1. python 例子

    python 下后缀名.py

    • 如何运行 python 代码
    1. 交互式
    2. 编写.py 脚本
    3. python *.py
    • 如何传递参数
    1. python *.py argone argtwo
    • 如何在脚本中使用传入的参数
    1. sys.argv
      是个列表:[文件名, argone, argtwo ... ]
    • 如何使用条件或者循环
    1. if, while, for
    
    if a==b:
        print a
    else:
        print b
        
    
    
    for i in range(5):
        print i
    
    
    • 如何定义函数
    1. def, 参数、返回值
    
    def hello(number=0):
        number = 1
        print "hello %s" %number
        
    
    • 变量定义

    var=""
    list_example=[]
    dict_example={}
    int_example = 2

    2. shell 例子

    • 是什么
    • shell scripts 的编写
    • 核心语法

    使用Linux 开发的话,在终端下敲的命令都是通过shell 和 linux 内核进行交互,完成响应的这么一个过程,而且shell 有各种各样的版本,语法有差异。这个很容易理解,语言特性就这些,但编程语言却这么多。所以还是入手最经典的bash,也是linux 默认的shell。

    shell 类似于python 中的交互式下敲代码。

    shell scripts 类似于 python 中编写的py脚本下代码的集合。

    下面照着python 下的那几个例子来演示 shell 下如何操作

    shell 下后缀名.sh

    • 如何运行
    1. chmod +x sh01.sh
      ./sh01.sh
    1. bash sh01.sh
    • 如何传递参数

    ./sh01.sh argone argtwo

    • 如何在脚本中使用传入的参数

    对文件执行传入参数:

    比如:

    ./sh01.sh argone argtwo

    $0 : 表示文件名 比如 sh01.sh

    $1 : 表示第一个参数 比如 argone

    $n : 表示第n个参数 比如 argtwo

    $# :表示传入参数的格式

    在函数定义中使用参数:

    $# : 表示传入的参数的个数

    $1 : 表示函数中的第一个参数

    $n : 表示函数中的第n个参数

    • 如何使用条件或者循环

    if ... then ... fi

    for ... in ... do ... done

    • 如何定义函数

    function(){}

    • 变量

    var_str="123"

    var_int=123

    var_list=(1 2 3)

    1. shell 演示实例

    一个脚本包括什么?

    • 变量
    • 函数
    • 打印
    • 注释
    • 循环、判断
      ...

    熟悉相关的基本语法:

    shell 基本语法

    
    #!/usr/bin/env bash
    
    # example one: var
    
    var_one="xiewei"   # 定义一个变量,是字符串
    
    echo -e ${var_one}  # 打印这个变量
    
    echo -e ${var_one}"wenlimin" # 字符串的拼接
    
    echo -e ${#var_one} # 得出字符串的长度
    
    echo -e ${var_one:0:5} # 提取字符串的前5个字符
    
    # example two: args
    
    echo $0  # 打印当前脚本的文件名
    
    # 表示这个脚本需要传入两个参数才能正确执行
    
    if [ $# -ne 2 ]; then
        echo -e "usage:  ./$0 arg_one arg_two"
        exit 1
    fi
    
    # 传入的两个参数
    
    arg_one=$1
    arg_two=$2
    
    echo -e "The first argument is: ${arg_one}"
    echo -e "The second argument is: ${arg_two}"
    
    
    # example three: function
    
    print_args(){
        arg_fun_one=$1
        arg_fun_two=$2
        echo -e "function first argument is: ${arg_fun_one}"
        echo -e "function second argument is: ${arg_fun_two}"
        return $((${arg_fun_one} + ${arg_fun_two}))
    }
    print_args 4 5
    echo -e ${?}
    
    
    # example four: list
    
    # 读取当前文件下的所有文件 file_list
    k=0
    for i in `ls`
    do
        file_list[k]=${i}
        k=$(( k + 1))
    done
    
    echo -e "The len of file list:"
    echo -e ${#file_list[@]}
    echo -e "show file list:"
    echo -e ${file_list[@]}
    
    # example five: create file
    
    # 判断是否存在文件,不存在就创建
    
    create_file="shell_05.sh"
    file_flag=`ls | grep ${create_file}`
    
    echo -e ${#file_flag}
    
    if [ -z ${file_flag} ]
    then
        touch ${create_file}
    else
        echo -e "${create_file} exist"
    fi
    
    
    
    
    
    import sys
    import subprocess
    import os
    
    print(sys.argv[0][-12:])
    
    
    # 返回传入的参数
    
    def get_sys_agrv():
        if len(sys.argv) <= 1:
            print("usage: python " + str(sys.argv[0][-12:]) + "argument")
            return 0
        else:
            file_name, *arg = sys.argv
            return file_name, arg
    
    
    # 执行shell 脚本
    
    def syscall(cmd):
        cmd = str(cmd)
        result = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        out = str(result.communicate()[0])
        if result.returncode != 0:
            raise Exception("error")
        return out
    
    
    # 传入文件名,判断是否存在,否则创建
    
    def create_file(file_name):
        cmd = None
        if type(file_name) != str:
            return 0
        if os.path.isfile(file_name):
            print(str(file_name) + "exists")
        else:
            cmd = "touch " + str(file_name)
            syscall(cmd)
            return 1
    
    # 读取当前文件夹下文件的列表
    
    def file_list(pathdir):
        cmd = None
        list_file = None
        if not os.path.exists(pathdir):
            return 0
        else:
            cmd = "ls " + str(pathdir)
            rt = syscall(cmd)
            list_file = rt.strip('\n').split('\n')
            return list_file
    
    print(file_list())
    
    
    
    

    一句话总结:工作中的重复性工作都应该以代码的方式实现自动化操作,即节约时间又保证正确性。同时创造机会刻意练习。

    先入手,再精深。

    相关文章

      网友评论

        本文标题:由 Python 到 Shell

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