• Linux python3安装/shell脚本/if/循环/函数


    python3安装

    安装过程

    安装包:

    wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
    tar -xvf Python-3.7.0.tgz #解压

    基础包

    1、基础yum包
    yum install gcc
    yum install zlib
    yum install zlib-devel
    yum install libffi-devel -y
    yum install openssl openssl-devel -y 

    检测平台:

    ./configure --prefix=/usr/local/python3/

    编译:

    make

    安装:

    make install

    设置快捷键:

    ln -s /usr/local/python3/bin/python3 /bin/python3 
    #设置后可以用python3进入python编辑

    步骤:

    • 安装python3的包 并解压
    • 安装依赖包
    • 检测平台 查看是否有问题 (echo $? 如果是0执行成功 非0执行失败)
    • 编译 查看是否能够编译(echo $? 如果是0执行成功 非0执行失败)
    • 最后安装          (echo $? 如果是0执行成功 非0执行失败)
    • 设置快捷键

    pythonTab快捷键命令补全

     提高写程序的效率,补全功能是必不可少的。对于python,介绍vim编辑下和python交互模式这两种linux常用环境下的补全。

    vim下的补全

    •     简单python关键词补全

    •     python 函数补全带括号

    •     python 模块补全

    •     python 模块内函数,变量补全

    安装步骤:

    1. cd ~  

    2. wget https://github.com/rkulla/pydiction/archive/master.zip

    3. unzip master.zip

    4. mkdir -pv ~/.vim/tools/pydiction

    5. cp -r pydiction-master/after ~/.vim

    6. cp pydiction-master/complete-dict ~/.vim/tools/pydiction

    完成后确保有如下结构即可:

    修改用户vim配置文件:

    [root@node1 ~]# vim ~/.vimrc
    filetype plugin on
    let g:pydiction_location='~/.vim/tools/pydiction/complete-dict'

    测试补全功能:

    vim进入新建test.py,导入sys模块,按Tab键,可发现已经有补全功能了。

    python交互模式的自动补全

    python交互模式的自动补全

    编写tab补全脚本:

    [root@node1 ~]# cat ~/.pythonTab.py 
    import readline, rlcompleter; readline.parse_and_bind("tab: complete")
    [root@node1 ~]#

    修改系统环境变量

    [root@node1 ~]# cat /etc/profile.d/tab.sh 
        export PYTHONSTARTUP=~/.pythonTab.py
    [root@node1 ~]# 
    [root@node1 ~]# .  !$    
        .  /etc/profile.d/tab.sh    
    [root@node1 ~]#

    PYTHONSTARTUP:重要的Python环境变量之一,包含了在每次启动的解释器时执行Python源代码的初始化文件的路径。这个文件通常命名为.pythonrc.py。   

        !$:调用上一个命令的最后一个参数。

    常见问题

    2、module not found error no module named '_ctypes' make *** error 1
    yum install libffi-devel -y
    
    3、编译安装python3,删除键不能用
    yum install readline-devel
    重新编译安装就可以了
    
    4、pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
    yum install openssl openssl-devel -y 

    shell脚本

    什么是shell?

    shell是一个在操作系统之上的软件,linux登录后默认就进入这个软件 shell是一个命令的解释器,能解析用户所输入的命令 (ls cp rm pwd 等等) shell拥有自己内建的命令集

    bash

    bash(Bourne Again shell )是shell的扩展,并且完全兼容shell(类似vim与vi的关系)

    第一个shell脚本

    • 第一步:使用文本编辑器(vim)来创建文本文件(一般以.sh结尾)
      • 第一行必须包括shell声明:#!
      • #!/bin/bash (告诉系统执行的时候要调用什么解释器)
      • #开头的是shell的注释
    • 第二步:输入命令 echo “hello world”
    • 第三步:给文件添加执行权限 chmod 755 hello.sh
    • 第四步 运行脚本
      • 第一种方式:指定脚本的绝对或相对路径来运行 ./hello.sh
      • 第二种方式:直接运行解释器,将脚本作为参数运行 sh hello.sh
      • 常见问题 -bash: ./hello.sh: Permission denied 没有赋予执行权限

    shell变量/赋值

    变量

    变量以字母或者下划线开头,后面接任意长度的字母、数字和下划线,如 var=linux 变量的引用需要在前面加$符号 ,

    如echo “$var” 如果变量的值中间有空格,需要用双引号引起来,如var=“hello world”

    单双引号区别:

    • 单引号变量不解析
    • 双引号变量可以解析

    特殊变量

    位置参数 $n ,n为数字

    $0为命令本身

    $1-$9是命令行第一道第9个参数

    $* 代表所有参数

    $# 代表参数的个数

    $? 代表上一个命令的返回状态

    命令替换和赋值

    命令替换的格式: $(cmd) 或者 `cmd` # ``为tab上的反引号

    在执行命令的时候,会先将$(cmd) 或者 `cmd` 里的命令先执行一遍,再将结果返回到原来的命令中

    var=$(uname -a) echo $var  

    命令替换和管道的区别?

    命令替换是将一个命令的输出作为另外一个命令的参数,而管道是将命令的输出作为下一个命令的标准输入

    如 date +%Y|touch touch $(date +%Y)

    算数运算和赋值

    首先,echo 1+2,没有输出3。因为shell需要特殊的格式来进行算数运算
    方式一   ((i=$j+$k))
    方式二   let i=$j+$k
    赋值  
    var=$(($i+$j))
    echo $var
    sh lufei.sh ni(位置参数)
    lufei.sh:
    #!/bin/bash
    echo $1 
    
    echo $(id)     id的执行结果作为echo的参数
    echo `id`  反引号 跟上面一样

    多个命令分隔符

    分号(;)是shell的命令分隔符, 让同一行的命令能够顺序执行。如echo 1 ;echo 2

    课上小例子

    1、命令行输入2个数字,写个小程序,计算2个数字的和,并输出结果
    2、命令行输入2个文件,写个小程序,把这两个文件都拷贝到以年月日命名的目录下,并输出每次拷贝的执行结果  date +%Y%m%d
    1. 
    #!/bin/bash let sum=$1+$2 echo $sum 2. #!/bin/bash file1=$1 file2=$2 dir=`date +%Y%m%d` mkdir $dir cp $file1 $dir&&echo $? cp $file2 $dir&&echo $?

    if语句控制

    if 判断

    在shell中if条件判断语句和我们的C、python等语言不同,shell的if语句条件必须用[ ]括起来,另外[ ]里外都需要用空格与周围隔开(例如[ a == b ]),否则会报错
    if基本语法  
        if [ 表达式 ];then    ;fi
        或
        if command;then ;fi
    其中[ 表达式 ] 等同于test命令,man test

    条件测试类型

    整数测试

    -eq 测试两个整数是否相等
         -ne 测试两个整数是否不等
         -gt 测试一个数是否大于另一个数
         -lt 测试一个数是否小于另一个数
         -ge 大于或等于
         -le 小于或等于

    字符串测试(两边要有空格)

          == 等于  
          != 不等
          >  大于
          <  小于
          -z string 测试指定字符是否为空,空着真,非空为假
         -n string 测试指定字符串是否为不空,空为假 非空为真    

    文件测试

       -e FILE 测试文件是否存在
       -f file 测试文件是否为普通文件
       -d file 测试指定路径是否为目录
       -r file 测试文件对当前用户是否可读
       -w file 测试文件对当前用户是否可写
       -x file 测试文件对当前用户是都可执行

    组合测试

    -a: and
    -o: or
    !: 非

    &&运算符

    command1  && command2
     
    &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;命令之间使用 && 连接,实现逻辑与的功能。
    
    如test -f /var/log/messages && echo ok

    ||运算符

    command1 || command2
    ||则与&&相反。如果||左边的命令未执行成功,那么||右边的命令就会执行
    如 test -f 123 || echo error

    if练习

    判断当前用户是否是root,不是的话退出,如果是的话显示一下root的登录shell

    id=`id -u`
    if [ $id -eq 0 ]
    then
    grep "^root" /etc/passwd|cut -d: -f7
    else
    exit
    fi

    命令行输入任意三个整数,判断最大的数

    MAX=$1
    if [ $2 -ge $1 ]; then
        MAX=$2
    fi
    if [ $3 -ge $MAX ]; then
             MAX=$3
    fi
    echo "the max number is $MAX."

    用Shell脚本,判断/bin/nohup是不是可执行文件,如果是将其拷贝到/tmpdir目录下,判断如果/tmpdir目录不存在,自动创建。

    if [ -x /bin/nohup ]
        then 
        if [ ! -d /tmpdir ]
            then    
                mkdir /tmpdir
        fi
        cp /bin/nohup /tmpdir
    fi

    循环

    for语法

    for arg in [list]
    do
       command…
    done
    
    list列表可以是空格分割的字符串,也可以是命令替换返回的结果
    
    如
    for v in /etc/sudoers /etc/resolv.conf 
    do ls -l  $v
    done

    for循环练习

    打印1-10

    [root@localhost /]# for i in `seq 10`
    > do 
    > echo $i
    > done
    for i in /etc/crontab /etc/inittab ; do cat $i ; done 循环打印文件

    请用for创建100个文件,文件名为ps1-ps100

    #!/bin/bash
    for i in `seq 100`
      do
             touch pa$i
      done

    请用for把ps1-ps100,分别创建100个tar包,命名为ps1.tar-ps100.tar

     #!/bin/bash
      for i in `ls pa*`
       do
            tar -cvf $i.tar $i
       done

    while循环

    while基本语法

    while [condition]
    do 
      command... 
    done
    #输入名字 打印一个随机数字
    
    while read -p "please input a name" name; 
    do    
       echo $name; 
    done

    死循环

    while :; do echo true ; done 一句while循环

    函数

    函数语法

    函数一般定义在shell脚本中使用

    function name ()
    {
    
    }
    
    shell函数可以带function关键字,也可以不带
    shell函数内可以加return返回值,也可以不带,如果不带就以最后一条命令运行结果,作为返回值。
    例如
    demoFun(){
        echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    demoFun
    echo "-----函数执行完毕-----"

    综合练习

    判断用户如果不存在就创建用户 ,如果存在就打印用户id 

     1 #!/bin/bash
      2 if [ $# -ne 1 ];then
      3    echo "args errors,should hava one arg"
      4    exit 1
      5 fi
      6 user=$1
      7 if grep -q "^$user" /etc/passwd
      8 then
      9    echo "$user is alive,id is $(id -u $user)"
     10 else
     11    echo "$user is not alived,creating"
     12    useradd $user
     13    if [ $? -eq 0 ]
     14    then
     15     echo "create user success"
     16    else
     17         echo "create user failed"
     18    fi
     19 fi

    写一个脚本模拟Linux登录

    while read -p "localhost login: " user
    do
     if [[ $user == "" ]]
     then
        continue
     fi
     read -s -p "Password: " passwd
     if [ $user == "root" -a  X$passwd == X"123456" ]
     then
               echo "" 
       while read -p "[$user@myterminal ~]#" cmd
       do
          $cmd
        done
     else
               echo "Login incorrect"
     fi 
     done

    写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。

      1 #!/bin/bash
      2 if [ $# -eq 0 ]
      3 then
      4    echo "must have a arg at least"
      5    exit 1
      6 fi
      7 
      8 file=$1
      9 dest=/tmp
     10 if [ ! -f $file ]
     11 then
     12    echo "$file doesn't exist"
     13    exit 1
     14 else
     15    cp $file $dest/
     16    if  [ $? -eq 0 ]
     17    then
     18       echo "backup success,deleting..."
     19       rm $file
     20    else
     21       echo "backup failed,do not rm $file"

    编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下

    dir='/root'
    subdir=`ls /root`
    for i in $subdir
     do
        if [ -d $dir/$i ]
        then
     cp -r $dir/$i /tmp/
        fi
     done

    请用shell编写一个等腰三角形,接收用户输入的数字

    left=$(($1-1))
    count=1
    move=$left
    or i in `seq $1`
     do
       for j in `seq $move`;do
         echo -n " "
       done
       for k in `seq $count`;do
         echo -n "*"
       done
       for j in `seq $move`;do
         echo -n " "
       done
       echo 
       count=$((count+2))
       move=$((move-1))
     done
  • 相关阅读:
    kvm虚拟化存储管理
    k8s集群部署
    docker版的zabbix部署
    docker进阶——数据管理与网络
    docker基础
    ceph对接openstack环境
    java命令--jmap命令使用
    JVM性能分析工具jstack介绍
    SkipList跳表基本原理
    NIO之Channel、Buffer
  • 原文地址:https://www.cnblogs.com/chenxuming/p/9550957.html
Copyright © 2020-2023  润新知