有時候咱們但願關閉一些特殊字符的含義,使用\
進行引用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
的選項,-atime
指定文件的最後訪問時間,-ctime
指定文件最後屬性改變時間
選項-type
指明瞭要找的文件類型參數以下:
查找一個文件不以.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