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 模塊內函數,變量補全
安裝步驟:
-
cd ~
-
wget https://github.com/rkulla/pydiction/archive/master.zip
-
unzip master.zip
-
mkdir -pv ~/.vim/tools/pydiction
-
cp -r pydiction-master/after ~/.vim
-
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/循環/函數