由 Python 到 Shell

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

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

鉴于入职之前对很多东西都不是很懂,比如 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())

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

先入手,再精深。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

Java每日一题_关于变量的使用

答:在【类里面】声明的变量叫全局变量,全局变量也叫成员变量,全局变量,在全局作用域下申明的变量没有被手动赋值的却在程序中被使用的情况下,将被赋予初值:

903
来自专栏Crossin的编程教室

【Python 第5课】变量

先告诉一直用在线编辑器的同学一个不幸的消息:昨天有同学反馈了之后我才发现,在线编辑器没办法完全模拟控制台下输入输出的操作。所以,你可以通过它来学习和实验,但是想...

2877
来自专栏CSDN技术头条

改变开发者编码思维的六种编程范式

译者注:本文介绍了六种编程范式,提到了不少小众语言,作者希望借此让大家更多的了解一些非主流的编程范式,进而改变对编程的看法。以下为译文: 时不时地,我会发现一些...

45810
来自专栏陈树义

Java 中的 try catch 影响性能吗?

前几天在 code review 时发现有一段代码中存在滥用try catch的现象。其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多...

1783
来自专栏Java帮帮-微信公众号-技术文章全总结

02.工厂模式/抽象工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在...

3113
来自专栏为数不多的Android技巧

一种绕过Android P对非SDK接口限制的简单方法

众所周知,Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制。这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次...

6253
来自专栏编程

Python萌新在九九乘法表中栽过的跟头

对于一个只听过一节python视频课的新手,写出九九乘法表毫无疑问是一件充满挑战的事情,所以写之前我在菜鸟教程中看了一些基础知识,看了点儿之后觉得不是特别难,于...

2418
来自专栏编程坑太多

java最困扰你的那些事?又将如何解决?

1135
来自专栏开源优测

在Selenium Webdriver中使用XPath Contains、Sibling函数定位

前言 在一般情况下,我们通过简单的xpath即可定位到目标元素,但对于一些既没id又没name,而且其他属性都是动态的情况就很难通过简单的方式进行定位了。 在这...

2343
来自专栏菩提树下的杨过

全世界最短IE判定if(!+[1,])的解释

虽然从司徒先生的博客上看到 全世界最短的IE判定 很长时间了,却一直对于原理没怎么去细看,今天同事(也是一后台程序员,并非前端)又问到这个问题,于是我这个前端外...

2216

扫码关注云+社区

领取腾讯云代金券