LinuxShell3學習(三)

LinuxShell
引用

有時候咱們但願關閉一些特殊字符的含義,使用\進行引用chrome

echo price :\$100

除了使用\來處理單個字符,還可使用單引號引用字符串shell

使用雙引號能夠有效避免由於含有空格而被認爲是多個字符串bash

在編寫shell腳本的時候會遇到命令很長的狀況,使用\把命令拆散socket

函數

若是參數的個數不等於2,就調用usage()函數,並以1狀態退出腳本函數

#!/bin/bash
useahe(){
  echo "Usage $0 operator file"
  exit 1
}

if [ $# -ne 2 ]; then
echo "error"
useahe
else
  echo "my script is running"
  exit 0
fi

檢查函數定義和取消函數定義this

直接在shell命令行中定義一個函數操作系統

$ qq()
#shell可以識別這是一個函數定義
#等待用戶輸入函數內的內容 好比df-h
function> df -h

在命令行輸入qq就會顯示執行的函數了

使用declare -f qq來查看聲明函數的定義了命令行

使用unset qq 來刪除函數的定義code


記錄狀態信息orm

#!/bin/bash
printMsg(){
#若是參數小於兩個,報錯
if [ $# -lt 2 ]; then
  echo "printMsg needs 2 arg"
  return 1
fi
  PREFIX="$1"
  #以參數1,參數2打印參數列表
  echo "$PREFIX:$@"
}
logMsg(){

if [ -n "$1" ]; then
    echo "`date`$@">>arg.log
else
  echo "need more arg"
  return 1
fi

}
printMsg "今天" "天氣情" && logMsg "上" "海邊"

實現一個函數,用來返回一個程序名對應的PID,若是程序正在運行,則函數返回0,而且輸出這個進程的進程號,不然返回函數1

#!/bin/bash
pidof_process(){
if [ $# -ne 1 ] ; then
#在調用參數個數不爲1,則顯示錯誤信息並以1狀態退出
  echo "error function pidof_process need one arg"
  exit 1
fi
#經過pidof 獲得程序名對應的pid
#並把PID值之間的空格替換爲\n,從而得到一個pid 列表
PID=`pidof "$1" | tr '' '\n'`

if [ -z "$PID" ]; then
#若是pidof命令的輸出爲空,說明參數$1保存的程序名沒有被執行
  echo "$1 is not running"
  return 1
else
#若是程序正在運行則打印PID列表
echo "$PID"
return 0
fi
}

CHROME_PID=`pidof_process "chrome"`
#檢查函數的退出狀態
if [ $? -eq 0 ]; then
  echo "pid $CHROME_PID"

else
  echo "not found"
fi
exit 0

建立一個函數庫

若是一個腳本要用到的函數不少,把他們都寫在一個腳本的開頭,讀程序的人會翻好幾頁可是找不到函數的不少

咱們要實現的函數定義到一個庫文件,library.lib中而後運行文件包含這個庫文件.這樣在腳本中就能夠引用庫文件定義的庫函數了

庫文件library.lib

#!/bin/echo Warning:this is a library which should be sourced!
#定義這一行做用是防止庫文件被意外執行

test_platform(){
local osname=`uname -s`
PLATFORM=UNKONWN
#在本地變量os中保存當前的操做系統
case ${osname} in
  "FreeBSD")
          PLATFORM="FreeBSD"
          ;;
  "SunOs")
          PLATFORM="sunos"
          ;;
  "Darwin")
          PLATFORM="Darwin"
          ;;
  esac
  return 0
}

腳本文件library.sh

#!/bin/bash
#首先在腳本程序中包含庫文件library.lib從而能夠調用其中的函數
source ./library.lib
#調用函數庫的函數test_platform
test_platform

echo
echo "Our platform is $PLATFORM"

exit 0

首先在當前目錄建立一個庫文件library.lib

1)庫文件的後綴是任意的

2)庫文件一般沒有可執行權限

3)放置庫文件的位置是隨意的

其餘經常使用命令

經過find命令 找到全部的音樂文件,並把這些文件移到/tmp/songs文件夾下

#!/bin/bash
#首先在tmp目錄建立一個文件夾
mkdir -p ${HOME}/Desktop/tmp/songs
#檢查mkdir是否建立成功
if [ $? -eq 0 ]; then
  #find -iname 在匹配文件的時候不會區分文件名的大小寫
  #選項-exec 會把它送來的路徑看成命令行的一部分
  #在執行每個命令以前要在{}兩邊加上單引號,目的是防止文件的路徑中含有空格 
 find ~ -iname "*.mp3" -print -exec mv '{}' /tmp/songs \;
fi

echo

echo "All mp3 files have been moved to dir"
echo

exit 0

find 命令

find . -mtime -1 -type f

find命令的-mtime選項指定了所要查找文件最後修改的時間,選項-mtime的參數n,含義是天數

  • -mtime n #修改的時間等於多少天
  • -mtime +n #修改的時間多餘多少天
  • -mtime -n #修改的時間少於多少天

還有兩個相似於 -mtime的選項,-atime指定文件的最後訪問時間,-ctime指定文件最後屬性改變時間

選項-type指明瞭要找的文件類型參數以下:

  • -type f 搜索普通文件
  • -type l 搜索連接文件
  • -type d 搜索目錄
  • -type b 搜索塊設備文件
  • -type c 搜索字符設備文件
  • -type p 搜索命名的管道文件
  • -type s 搜索socket文件

查找一個文件不以.txt結尾

find . ! \( -name '*.txt' \) -print

使用file 文件查看文件的信息

file 文件名
file ~ 目錄

備份文件

將當前目錄的全部文件打包到files.tar文件下

tar - cvf files.tar *

選項-c表示要執行的操做是建立打包文件,選項-v打包過程當中輸出被追加到tarball中的文件列表-f表示

信號量

信號是一個進程發送給另外一個進程的消息,信號使兩個進程之間相互通訊

使用kill - l來查看系統中全部的信號

定時器,但願用戶在規定的時間內輸出用戶名和密碼

#!/bin/bash
Expire_Handler(){
  echo "got sigalarm signal waiting u too long"
  echo "Bye"
  #從腳本退出代碼14,用來表示接收到了sigalrm信號
  exit 14
}
Start_Timer(){
  #若是沒有指定參數的話,默認爲10s
  local INTERVAL=${1:-10}
  if [ $INTERVAL -gt 0 ]; then
    sleep $INTERVAL && kill -s 14 $$ &
    TIMERPID=$!
  else
    echo "error interval must be integer"
    exit 1
  fi
}
Unset_Timer(){
  kill 'pgrep -P'$TIMERPID
  kill $TIMERPID
}
trap Expire_Handler 14
echo
echo "u have only 15 s to enter u info "
Start_Timer 5
read id
#Unset_Timer
echo "u id is $id"
echo "all done "
exit 0
相關文章
相關標籤/搜索