#####進程 系統中的每個進程都不是憑空出現的,而是經過它的父進程建立出來的shell
能夠經過ps -ef
來查看系統中的進程,以及他們的狀態信息,-e
的做用是列出系統的全部進程,-f
的做用是使用完整的格式顯示每個進程的信息數組
ps -fu
來查找用戶名或者用戶的UIDbash
只要在命令提示符下執行一個命令或者腳本時,都會相應的在bash下建立一個進程,進程分爲兩類:前臺進程和後臺進程less
前臺進程是在命令提示符下執行的操做,當命令行執行時,須要等待相應進程終止時才能執行其餘程序ui
後臺進程不佔用命令提示符命令行
執行shell命令的時候,經過在shell命令後添加符號&
,告訴shell咱們想把命令放到後臺執行code
查看後臺進程的狀態,使用bash內建的jobs
來查看當前終端的後臺進程,-l
會在輸出的信息添加後臺進程的PID,-r
只顯示爲running的後臺進程,-s
顯示爲狀態爲stopped的後臺進程排序
可使用bash的內建命令fg
把後臺進程調回前臺,指定任務號的方法是在數字前面加上一個%
來表示這是一個任務號進程
使用bg
命令將掛起的進程放到後臺繼續執行,或者使用ctrl+z
字符串
stty -a
會顯示當前的終端使用的各類組合鍵eof = ^D
,這裏把ctrl+d
定義爲結束標識EOF
,ctrl +c
來終止當前終端的前臺進程
從一個目錄中取出最近5個普通文件,而且要求輸出文件名和最後訪問的時間 ls -lut | grep"^-"|head -5|cut -c41-
ls -t
在輸出文件列表的時候根據文件修改的時間排序,ls -l
命令顯示文件最後的訪問時間,排序的結果是最近訪問過的文件顯示在最前面,因爲目錄下可能有子目錄或者特殊文件使用grep "^-"
來過濾,其中參數^-
表示以-
開始的文件,這時候獲得了過濾後的有序文件列表,經過head - 5
來提取數據的前5行,經過cut
命令將無關信息刪除-c
命令會保留輸出那些字符
paste
將多個文件鏈接到一塊兒,當鏈接兩個文件的時候paste
會將相同行號的行鏈接起來 paste -d':' file.a file.b|cat -n
,-d
表示指定分隔符
檢測系統的shell統計他們被多少個用戶使用,並把統計結果按照從多到少的順序打印出來,每一個用戶使用的登錄shell都存在etc/passwd
中 cat /etc/passwd|cut -d: f7|sort|uniq -c|sort -nr
輸出計算機的硬件信息
#!/bin/bash TIME=`date` NAME=`uname -n` KERNEL=`uname -s` VERSION=`uname -r` ARCH=`uname -m` echo echo "info about u computer" echo "curr $TIME" echo "host name $NAME" echo "arch $ARCH" echo "version $KERNEL $VERSION" echo exit 0
把執行的命令放到符號""中,shell會首先執行"
"中的命令,而後用執行命令的結果替換掉``字符串
使用read
命令把用戶輸入的值賦值給變量,使用unset
刪除一個定義過的變量
#!/bin/bash echo read NAME echo "welcome $NAME" unset NAME if [ -z $NAME ] then echo echo $NAME is null else echo "NAME IIS $NAME" fi
在shell腳本有時也但願把變量定義成一個只讀的常量,使用關鍵字read only
標識過的變量就是隻讀變量
shell中數組的使用
data[1]=1 data[2]=2 data[3]=3 echo $data[1] 輸出數組元素1的值 echo $data[*]輸出數組全部的元素 echo $data[@]同理 或者 data=(1 2 3 4 5 6) 直接賦值 data=([2]=value2 [3]=value3)
$#
表示命令行的參數的個數,-lt
的意思是arg1 -lt arg2
判斷arg1是否小於arg2
#!/bin/bash if [ $# -lt 2 ] then #若是參數個數小於2,腳本執行退出 echo "error" exit 1 elif [ $# -gt 2 ] then #若是參數個數大於2,腳本執行退出 echo "error" fi echo "my shell is running"
還有相似的二元操做符
分支較多的時候使用case
實現多分支結構,bash中的case 不能對數值進行匹配,每個子句必須用;;
,;&
,;;&
來終止,其中最經常使用的是;;
#!/bin/bash clear echo echo "file operation list" echo "chose one of the following operations" echo "[o] open file" echo "[d] delete file" echo "[r] rname file" echo "[m] move file" read operation case "$operation" in "o"|"O") echo "open" ;; "d"|"D") echo "delete" ;; "r"|"R") echo "rname" ;; "m"|"M") echo "move" ;; *) echo "exit" esac exit 0
while 循環,ping
命令的-c1
參數是發送一個ECHO_REQUEST
包,-w1
的參數是指定每一次ping的時間是1s
#!/bin/bash clear NETWORK=192.168.1 IP=30 while [ "$IP" -lt "130" ] do echo "Pinging ${NETWORK}.${IP}" ping -c1 -w1 ${NETWORK}.${IP} > /dev/null 2>&1 if [ "$?" -eq 0 ] then echo "OK" else echo "Failed" fi let IP=$IP+1 done exit 0
util循環直到知足條件中止循環
#!/bin/bash clear QUIT_COMMAND=quit until [ "$USER_INPUT" = "$QUIT_COMMAND" ] do echo "please input $QUIT_COMMAND to exit" read USER_INPUT echo echo "u command is $USER_INPUT" case $USER_INPUT in "open") echo "open" ;; "close") echo "close" ;; *) echo "error" ;; esac done
for循環將全部.sh文件放到文件夾test
下
#!/bin/bash clear mkdir ${HOME}/Desktop/test/test > /dev/null 2>&1 if [ $? -ne 0 ] then echo "dir ${HOME}/Desktop/test/test is already exits" exit 1 else echo "created" fi for FILE in `ls -l *.sh` do cp $FILE ${HOME}/Desktop/test/test/test_$FILE #chmod -x ${HOME}/test/test_$FILE done exit 0
select 循環,實現若干選項的菜單用戶值須要輸入菜單的編號便可獲得值 [ !-z $dir]
來判斷變量是否被設置爲其中的一個菜單項
#!/bin/bash clear echo echo "which do u want to list" echo select dir in /bin/ /usr/bin/ /usr/local/bin/ /sbin/ quit do if [ ! -z "$dir" ] then if [ "$dir" = "quit" ] then echo echo "bye bye" break; else echo echo echo "u select is $dir" echo ls -l $dir fi else echo "error" #statements fi done exit 0
#!/bin/bash clear echo "backup files" echo "---------" #根據腳本所在的位置 #遍歷上一級全部目錄,備份其中的文件 for DIR in ../* do #檢查是不是一個目錄 if [ -d ${DIR} ]; then #從路徑提取出最後的目錄名 basedir=`basename ${DIR}` echo echo "create dir ${HOME}/Desktop/storage/${basedir}" echo #建立一個文件夾 mkdir -p ${HOME}/Desktop/storage/${basedir} if [ $? -eq 0 ]; then for extension in sh c txt h do cp ${DIR}/*.${extension} ${HOME}/Desktop/storage/${basedir} 2>/dev/null if [ $? -ne 0 ]; then echo echo "error ${DIR}/${extension}" continue fi echo "done" done else exit 1 fi else continue fi done exit 0