1. 程式人生 > >Linux命令列與shell指令碼程式設計大全(一)

Linux命令列與shell指令碼程式設計大全(一)

一、基本 bash shell命令

建立檔案 : touch

連結檔案:符號連結:是一個實實在在的檔案,兩個通過符號連結在一起的檔案,彼此的內容並不相同。使用ln -s命令。

硬連結:會建立獨立的虛擬檔案,其中包含了原始檔案的資訊及位置。但他們從根本上而言是同一個檔案。原始檔案必須事先存在,使用ln命令。

檢視檔案型別 : file

檢視整個檔案 : cat , more , less

檢視部分檔案 : tail , head

 

二、更多shell命令

探查程序 : ps , 常用 ps -ef , ps -l

實時監測程序 : top。第一部分顯示系統的概況:第一行顯示當前時間、系統執行時間、登入的使用者數以及系統的平均負載(三個值代表最近1min、5min、15min)如果近15min內的平均負載都很高,說明系統可能有問題。

第二行顯示了程序概要資訊:有多少程序處在執行、休眠、停止或是僵化狀態

下一行顯示了CPU的概要資訊。

緊跟其後的兩行說明了系統記憶體的狀態。第一行是系統的實體記憶體:總共多少記憶體,當前用了多少,還有多少。後一行表示同樣的資訊,不過針對系統交換空間。

最後一行顯示當前執行中的程序纖細列表。

PID:程序ID; USER:程序屬主名字; PR:程序優先順序; NI:程序的謙讓值; VIRT:程序佔用的虛擬記憶體總量; RES:程序佔用實體記憶體總量; SHR:程序和其他程序共享的記憶體總量; S:程序的狀態(D可中斷休眠,R執行,S休眠,T跟蹤或停止,Z僵化); %CPU:程序使用CPU時間比例; %MEM:程序使用的記憶體佔用記憶體的比例; TIME+:自程序啟動到目前位置的CPU時間總量; COMMAND:程序對應的命令列名稱。

結束程序 : kill , killall

掛載儲存媒體: mount

移除儲存媒體: umount

檢視所有已掛載的磁碟 : df

顯示特定目錄的磁碟使用情況 : du

排序資料 : sort

搜尋資料 : grep

壓縮資料 : bzip2(.bz2) , compress(.Z) , gzip(.gz) , zip(.zip) 。只能壓縮單個檔案或者某個目錄中的檔案,或者是能有通用符表示的多個檔案。

歸檔資料 : tar (將多個檔案歸檔進單個檔案)

 

三、理解Shell

程序列表 : 將命令列表包含在括號中 , 如 :( pwd ; ls ; cd /etc; pwd; cd ; pwd; ls)會建立一個子shell來執行命令。

後臺模式 : 在命令結尾加上字元 & ,如 sleep 3000 &

協程 : 在後臺生成一個子shell,並在這個shell中執行命令 ,如 : coproc my_job { slee 10; }。

外部命令 : 也稱為檔案命令,存在於bash shell 之外的程式,當外部命令執行時,會建立一個子程序。

內建命令 : 不需要使用子程序來執行,執行速度更快

命名別名 : alias li='ls -li',僅在它所被定義的shell程序中才有效。可以將alias設定放在$HOME/.bashrc檔案中,使其效果永久化。

 

四、Linux環境變數

全域性變數

檢視全域性變數: printenv 或者 env,檢視某一個環境變數printenv ,如: printenv PATH,或者echo,如: echo $PATH. 設定全域性變數時,可以先建立一個區域性變數,然後再使用export將其匯出為全域性變數。如 : export my_variable. 子shell不能改變父shell中的全域性變數,即使使用export命令。

區域性變數

檢視區域性變數: set命令會顯示為某個特定程序設定的所有環境變數,包括區域性、全域性和使用者定義變數。

設定使用者變數: my_variable="Hello world",該變數在子shell中無效。陣列變數mytest=(one two three four five),輸出所有的值echo ${mytest[*]},輸出單個值 echo ${mytest[2]},可以使用unset刪除陣列中的某個值,但是隻會使該索引上的值為空。素組變數在shell指令碼程式設計時並不常用,它的可移植性不好。

刪除環境變數 : unset my_variable。如果該變數是全域性變數,且在子shell中刪除了該變數,在父shell中該變數依然可用。

設定PATH變數 : PATH=$PATH:/home/christine/Scripts 。 只能持續到退出或者重啟系統。

環境變數的定位 : 登入時作為預設登入shell的啟動檔案為/etc/profile, 作為非登入shell的互動式shell(如在命令列敲入bash時啟動),它不會訪問/etc/profile檔案,只會檢查使用者HOME目錄中的.bashrc檔案。 非互動式shell使用的BASH_ENV環境變數,它可以繼承父shell匯出過的變數,使用當前shell的區域性變數和全域性變數。

環境變數持久化 : 在/etc/profile.d 目錄中建立一個以.sh結尾的檔案。把所有新的或者修改過的全域性變數設定放在這個資料夾中。

 

五、Linux檔案許可權

/etc/passwd檔案

登入使用者名稱: 使用者密碼: 使用者賬戶UID(數字形式):使用者帳號組ID(GID數字形式): 使用者賬戶的文字描述(備註欄位): 使用者HOME目錄的位置: 使用者預設shell

/etc/shadow檔案 : 只有root使用者可以訪問。

登入名: 加密後的密碼: 自上次修改密碼後過去的天數(自1970年1月1日開始): 多少天后才能修改密碼: 多少天后必須更改密碼: 密碼過期前多少天提醒使用者更改密碼: 密碼過期後多少天禁用使用者賬戶: 使用者賬戶被禁用的日期(自1970年1月1日到當天的天數): 預留欄位

新增新使用者: useradd

刪除使用者 : userdel

修改使用者 : usermod(修改使用者賬戶欄位,可以制定主要組以及附加組的所屬關係), passwd(修改已有使用者的密碼), chpasswd(從檔案中讀取登入名密碼對,並更新密碼), chage(修改密碼的過期日期), chfn(修改使用者賬戶的備註資訊), chsh(修改使用者的預設登入shell)

/etc/group檔案 : 檔案格式 : 組名: 組密碼: GID: 屬於改組的使用者列表

建立組 : groupadd         

修改組 : groupmod

檔案許可權 : 例 lrwxrwxrwx 1 root root 6 Oct 3 03:54 link_nusers -> nusers

第一個字元代表了物件型別 : -代表檔案, d代表目錄, l代表連結, c代表字元型裝置, b代表塊裝置, n代表網路裝置。3組3字元編碼分別代表了物件的屬主、物件的屬組、系統其他使用者的許可權,r可讀,w可寫,x可執行,其中-是0,x是1,w是2,r是4。檔案的全許可權值是666,目錄是777.umask值是掩碼值,需要從物件的全許可權值中減去,即666-022=644。

改變檔案許可權:

chmod 760 myfiles或者 chmod [ugoa…] [+-=] [rwxXstugo…]

u代表使用者,g代表組,o代表其他,a代表上述所有。

+表示在現有許可權基礎上增加許可權,-表示在現有許可權上移除許可權,=表示將許可權設定成後面的值

X如果物件是目錄或者它已有執行許可權,賦予執行許可權; s執行時重新設定UID或GID; t保留檔案或目錄; u將許可權設定為屬主一樣; g將許可權設定為跟屬組一樣; o將許可權設定為跟其他使用者一樣。

改變所屬關係 : chown 改變檔案的屬主。 chgrp改變檔案的預設屬組。

共享檔案(某一個組內的所有使用者):

mkdir testdir ##建立共享目錄

chgrp shared testdir #改變目錄所在組

chmod g+s testdir #在屬組的許可權上增加執行時重新設定UID或者GID

umask 002 #設定檔案對屬組可寫

cd testdir ; touch testfile #進入目錄建立檔案

 

六、管理檔案系統

建立分割槽 : fdisk

建立檔案系統(格式化) : mkfs.vfat(格式化u盤,檔案系統fat), mkfs.ext3(檔案系統ext3)

 

七、安裝軟體程式

使用aptitude 管理軟體包

在命令列輸入aptitude

快速顯示某個特定包的詳細資訊 aptitude show package_name

得到特定軟體包相關的所有檔案的列表 dpkg -L pageage_name

找到特定的軟體包 aptitude search package_name

安裝軟體包 aptitude install package_name

更新軟體 aptitude safe-upgrade

解除安裝軟體 aptitude purge package_name 或 aptitude remove package_name

區別remove選項不刪除資料和配置檔案,purge會刪除全部。

 

八、構建基本指令碼

建立shell指令碼檔案

格式一般為 : #! /bin/bash

例 如:

使用變數

環境變數: 在變數名前加美元符($)來使用這些環境變數。

使用者變數: var1=10,使用者變數可通過美元符引用,在shell指令碼結束時會被刪除掉。

命令替換:將命令輸出賦給變數:反引號字元(`)或者$()

重定向輸入和輸出

輸出重定向 : >(寫入檔案) , >>(追加)

輸入重定向 : <(基本輸入) , <<(內聯輸入重定向)

管道(  |  )

將一個命令的輸出作為另外一個命令的輸入,如 ls -l | more

執行數學運算

expr命令 : expr 1 \* 2 , expr 1 + 5

使用放括號 : var1=$[1 + 5] var2=$[$var1 * 2]

浮點: 使用bc計算器,設定小數位: scale=4

在指令碼中使用bc,基本格式:

variable=$(echo “options; expression” | bc)

bash計算器中建立的變數只能在bash計算器中有效,不能在shell指令碼中使用

退出指令碼

檢視退出狀態碼 : $?(0表示預設正常退出)

exit命令:允許在指令碼結束時指定一個退出狀態碼,如 exit 5

 

九、使用結構化命令

if語句

if語句會執行if後面的那個命令,如果該命令的退出狀態碼是0,then部分的命令會被執行,如果是其他值,then部分不會被執行

基本格式 :

if command1
then 
    command
fi

if-then-else語句

基本格式:

if command

then command

else command

fi


或者 :

 if command

then command

elif command

then command

fi

巢狀if

test命令

如果test命令中列出的條件成立,test命令就會退出並返回退出狀態碼0.如果變數中沒有內容,退出狀態不為0.基本格式:

test condition

在if-then語句中的用法

if test condition

then commands

fi

另外一種方法 :

if [ condition ] ####注意空格

then command1

fi

 

數值比較和字串比較

#! /bin/sh
##數值比較
# n1 -eq n2  檢查n1是否與n2相等 (equal)
# n1 -ge n2  檢查n1是否大於或等於n2 (great equal)
# n1 -gt n2  檢查n1是否大於n2 (greater than)
# n1 -le n2  檢查n1是否小於或等於n2 (less equal)
# n1 -lt n2  檢查n1是否小於n2 (less than)
# n1 -ne n2  檢查n1是否不等於n2 (not equal)
##字串比較
# str1 = str2 檢查str1是否與str2相同
# str1 != str2 檢查str1是否與str2不同
# str1 < str2 檢查str1是否比str2小
# str1 > str2 檢查str1是否比str2大
# -n str1 檢查str1的長度是否非0
# -z str1 檢查str1的長度是否為0
value1=10
value2=a
if [ $value1 -gt 5 ]
then 
	echo "the test value $value1 is greater than 5"
fi

if [ $value1 \< $value2 ]  #注意這裡需要轉義
then
	echo "$value1 is less than $value2"
else
	echo "$value1 is greater than $value2"
fi

 

檔案檢查

#! /bin/bash
##檔案比較
# -d file          檢查file是否存在並是一個目錄
# -e file          檢查file是否存在
# -f file          檢查file是否存在並是一個檔案
# -r file          檢查file是否存在並可讀
# -s file          檢查file是否存在並非空
# -w file          檢查file是否存在並可寫
# -x file          檢查file是否存在並可執行
# -O file          檢查file是否存在並屬當前使用者所有
# -G file          檢查file是否存在並且預設組與當前使用者相同
# file1 -nt file2  檢查file1是否比file2新
# file1 -ot file2  檢查file1是否比file2舊

file=/root/Desktop/Scripts
if [ -d $file ]
then 
	echo "this is a directory"
fi

複合條件測試

[ condition1 ] && [ condition2 ]  ## 邏輯與

[ condition1 ] || [ condition2 ]  ## 邏輯或

if-then 高階特性

用於數學表示式的雙括號

用於高階字串處理功能的雙方括號

#!/bin/bash
##雙括號命令符號
# val++  後增,    val--  後減,    ++val  先增,    --val  先減
# !  邏輯求反,    ~  位求反,      **  冪運算,    <<  位左移
# >> 位右移,     &  位布林和,    |  位布林或,  && 邏輯和,  || 邏輯或

##雙方括號   [[ expression ]] 
#  expression使用test命令中採用的標準字串比較,同時還提供了模式匹配

var1=4
var2=3
((var3=$var1 & $var2))
if [ $var3=0 ]
then 
	echo "$var1 & $var2 is equal 0 "
fi
if [[ $USER == r* ]]
then 
	echo "Hello $USER"
fi

case命令

在一組可能的值中尋找特定值(相當於switch)

基本格式

case variable in 
        pattern1 | patter2)    command1;;
        pattern3) command2;;
        *) default commands;;
easc
#!/bin/bash

case $USER in
	root | barbara)
		echo "Welcome, $USER"
		echo "Please enjou you visit";;
	testing)
		echo "Special testing account";;
	*)
		echo "sorry,you're not allowed here";;
esac

十、更多結構化命令

for命令

基本格式 :

for var in list

do

commands

done
#! /bin/bash

##讀取列表中的值
# list="Alabama Alaska Arizona"
## 讀取複雜值 
# list="I don\'t know if this\'ll work"   #單引號轉義
## 從變數讀取列表
# list="Alabama Alaska Arizona"
# list=$list "Connecticut"   # list="Alabama Alaska Arizona Connecticut"
## 從命令讀取值
# list="/root/Desktop/Scripts/state"
# for state in $(cat $list)
## 更改欄位分割符
# 預設分割符 : 空格、製表符、換行符
# 更改IFS的值: IFS=$'\n',只能識別換行符
## 用萬用字元讀取目錄
# for file in /root/Desktop/Scripts/*

# example1:
file=state
IFS=$'\n'
for state in $(cat $file)
do 
	echo "$state"
done

# example2:
for (( a=1,b=10 ; a<=10 ; a++,b--))
do 
	echo "$a-$b"
done

C語言風格for命令

格式 :

for (( variable assignment ; condition ; iter))

while命令

它會在每次迭代的一開始測試test命令,在test命令返回非零退出狀態碼時,while命令會停止執行。格式 :

while test_command

do

other commands

done
#!/bin/bash
## 在while中可以使用多個測試命令
var1=10
while echo $var1           ##第一個測試命令
       	   [ $var1 -ge 0 ] ##第二個測試命令
do
	echo "This is inside the loop"
	var1=$[ $var1 - 1 ]
done

until命令

和while命令工作方式完全相反,until命令要求你制定一個通常返回非零推出狀態碼的測試命令,只有測試命令的退出狀態碼不為0,才會執行迴圈中列出的命令。一旦測試命令返回了退出狀態碼0,迴圈結束。基本格式:

until test_command

do

other commands

done

用法同while相同。

其他知識:

#! /bin/bash
## 迴圈檔案處理
IFS.OLD=$IFS ##儲存IFS值
IFS=$'\n'
for entry in $(cat /etc/passwd)
do
	echo "Values in $entry -"
	IFS=:
	for value in $entry
	do 
		echo "    $value"
	done
done

## break n: 命令可以跳出內部和外部迴圈,n預設為1,表示跳出當前迴圈,如果將n設為2,break命令會停止下一級的外部迴圈
## continue n: 命令允許通過命令列引數指定要繼續執行哪一級迴圈
## 處理迴圈輸出: 可以對迴圈的輸出使用管道或進行重定向,這可以通過在done命令後新增一個處理命令來實現

for file in /root/Desktop/Scripts/*
do 
	if [ -f "$file" ]
	then
		echo "$file is a file"
	fi
done > output.txt
# done | sort > output.txt