1. 程式人生 > >Linux python3安裝/shell腳本/if/循環/函數

Linux python3安裝/shell腳本/if/循環/函數

一行 安裝過程 UNC live NPU exp libffi hive org

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

Linux python3安裝/shell腳本/if/循環/函數