LinuxShell學習(二)

Linux Shell2

#####進程 系統中的每個進程都不是憑空出現的,而是經過它的父進程建立出來的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/passwdcat /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"

還有相似的二元操做符

  • -eq (equal to )等於
  • -ne (not equal to) 不等於
  • -le (less than or equal to )小於等於
  • -gt (greater than) 大於
  • ge (greater than equal to )大於等於

分支較多的時候使用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
相關文章
相關標籤/搜索