1. 程式人生 > >Linux_Shell指令碼攻略學習筆記(1)1.1-1.5

Linux_Shell指令碼攻略學習筆記(1)1.1-1.5

1.1
1)shell指令碼的兩種執行方式:
a.直接輸入地址+指令碼名,如當前目錄的./test.shell或者~/Documets/test.shell
這種方式必須在指令碼頭指定直譯器,即#!/bin/bash
b.不需要指定直譯器,使用/bin/bash ~/Documents/test.shell的方式
2)每條命令之間使用換行或者分號進行分隔
3)兩個bash相關的特殊檔案:~/.bashsrc(開啟終端時的各種設定)& ~/.bash_history(使用者執行過的命令)

1.2
終端列印的兩種方式:
1)echo
a. echo ‘…’ 基本完全按照單引號裡的內容進行列印
b. echo “…” 特殊的字元需要使用轉義符去轉義
c. echo … 功能基本類似於b. 但是例如分號,這種方式不能直接列印
d. 特別的兩個引數,-e/-E 控制轉義符,-n取消echo的自帶換行
2)printf
使用方法基本類似與C語言,格式化字串的功能

1.3
1)在bash中,所有變數的值都是字串!!!
2)檢視某個程序使用的環境變數:
a. 根據程序名稱,查詢程序號,以motion這個程序為例,回顯是程序ID
pgrep motion
b. 假設上一步查到的程序ID是286, 由於該環境變數在儲存時,彼此是通過’\0’分隔的,不直觀,使用’\n’替代會更方便來看
cat /proc/286/environ | tr ‘\0’ ‘\n’
3) 注意變數的賦值,如果是一個包含空白字元的字串,必須要用單引號或者雙引號括起來。比如空格即使空白字元,賦值必須用引號,var=‘Hello world!’
4)其他環境變數相關
a. 設定環境變數,舉例
VAR=“environment var.”
export VAR
b. shell每次執行時從環境變數PATH指定的地址搜尋要執行的檔案,也就是說如果把自己常用來存放指令碼的路徑新增進去,那麼以後執行指令碼就不用輸入完整的路徑了,直接輸入指令碼名稱即可。
PATH存放在/etc/profile中,開啟該檔案,在檔案後面新增下面這句。
export PATH="$PATH:~/Documents/script"
修改該檔案之後,要立即生效,可執行 source /etc/profile
c. 其他常用的環境變數
HOME/PWD/USER/UID/SHELL
比如可以通過對UID做判斷是否等於0,以此斷定當前使用者是否是超級使用者。
5)獲取變數長度的方法,以獲取PATH的長度為例
length=${#PATH}

1.4
shell數學運算常用的四種方式:let / (( )) / [ ] / expr

  1. let ,變數前$加或者不加都可以,算數表示式有沒有空格都沒關係
    let no1++
    let result=no1 + no2
    let $no1+=6
  2. (( )) / [ ], 變數前
    ( ( ) ) [ ] r e s u l t = 加或不加都可以,但是(( ))和[ ]前必須加。括號內的表示式有沒有空格也沒關係 result=
    [no1+no2]
    result= ( ( n o 1 + n o 2 ) ) 3 e x p r ((no1 + no2)) 3)expr兩種寫法, ` 不是單引號 ‘ 。變數前必須加 , 運算表示式內部必須有空格
    result=`expr 3 + 4`
    result=$(expr $no1 + 5)

1.5
1)檔案描述符,系統預設有三個
0-----stdin
1-----stdout
2-----stderr
2) 預設輸出是stdout > 等同 1> , >> 等同 1>>
> 輸出到檔案會覆蓋操作, >> 輸出到檔案是追加操作
stderr 使用 2> , 2>>
3) 所有命令執行結束後,返回值會寫在$?中。
0代表成功輸出使用的是stdout,非0代表失敗即相應使用的是stderr
4) 清除變數a1所有許可權
chmod 000 a1
5)使用重定向符後,命令的輸出只會記錄在相應的輸出檔案中,不會在終端列印。
如果要實現既在終端列印,又輸出到檔案,需要用到 tee,但是tee只能用於stdout,stderr不可以。
使用方法:cat log.log | tee out.log
6)如果只是想要忽略某種輸出,不想讓其在終端列印,或者輸出到其他檔案,可以將輸出重定向到 /dev/null(被稱為位桶或者黑洞)
例如:cat log.log 2> /dev/null