shell簡單瞭解

Linux相關

  • /proc/$PID:表示進程的文件
  • /dev/null:垃圾箱,黑洞

shell內部構造

  • 變量:變量分爲:局部變量環境變量shell變量
    • shell變量:一部分是局部變量,一部分是環境變量,對shell很重要。比如:IFSPS1是局部shell變量
    • 環境變量使用export進行導出,環境變量可以讓子進程繼承
  • .bashrc:在每次創建bash進程時會執行一次
  • 標準輸入輸出以及對應的文件描述符:stdin-0, stdout-1, stderr-2

bash

特殊符號總結

  • 反引號:子shell,若要獲得值,直接var=`command`即可。
  • 單引號:字符串,原樣
  • 雙引號:字符串,支持轉義字符和變量
  • []:算術運算
  • [[]]:是[]在用作條件運算時的擴展
  • {}:將變量和周圍的字符串隔離開來,如echo "some strange ${Java}Script"
  • ()
    • 子shell:(ls)var=$(ls)
    • 數組:array=(1 2 3)
  • (()):算術運算
  • $:表示取出變量的內容,直接取出變量的值相當於執行命令
    var=(expr 3 + 4);
    $var;
    

語句格式

  • #:註釋
  • ::空語句
  • 一般語句沒有分號要求

變量

  • 聲明:等號前後不能有空格:var="acc"
  • 讀取:echo ${var}
  • 刪除變量:unset var
  • 只讀變量

字符串

  • 單引號:原樣打印:var='test_acc'
  • 雙引號:計算變量:acc="aod ${var}"
  • 獲得字符串長度:echo ${#var}
  • 單個字符查找:需要藉助exprecho `expr index ${var} char`
  • 子串:echo ${str:start:length}
  • 還有很多字符串操作,截取等# ## % %%

數組

  • 數組元素可以爲,元素類型可以不同
  • 定義數組
    array_1=(1 2 3); # 整體
    array_2[1]=23;   # 分開來
    array_3=(        # 支持換行
        1
        2
    )
    
  • 數組操作
    • 獲得某個元素:echo ${array[index]}
    • 獲得所有元素:echo ${array[*/@]}
    • 獲得元素數量:echo ${#array[*/@]}
    • 獲取所有索引:echo ${!array[*/@]}。(對於散列數組很有用)
  • 關聯(散列)數組:需要先聲明
    declare -A array_hash
    array_hash=([a]=aa [b]=bb);
    array_hash[c]=cc;
    

運算

  • 算術運算:不推薦使用原生算術運算
  • 算術運算:子shell + 命令的方法。(expr必須有嚴格的空格,因爲空格區分參數)
    var=$(expr 5 + 4);
    var=`expr 5 + 4`
    
  • 整數關係運算:只能用於判斷語句中空格要求
    • -eq,-ne,gt,lt,ge,le,-a,-o
    if [[ 23 -eq 24 -o 24 -eq 34 ]]; ...
    
  • 字符關係運算
    • =,!=,-z,-n
    if [[ "acc" = "bibi" ]]; ...
    
  • 文件關係運算符
    • 是否存在,是否是符號連接,是否是目錄,是否是塊設備,等等等
  • 可以使用test指令進行判斷,可用於if

命令參數

  • $x特殊變量。可用於終端,腳本,函數
    - - - - - -
    $0 名稱 $n 參數 $$ PID
    $# 參數數量 $* 所有參數 $@ 所有參數
    $? 退出狀態

函數

  • 一般格式,可以不用換行
    [function] func_name[()]
    {
        action;
        [return int;]
    }
    

條件控制

  • if
    if [[ $(ps -ef | grep -c "sh") -gt 1 ]];
    then
        echo "sh than 1";
    elif [[ $(ps -ef | grep -c "sh") -lt 1 ]];
    then
        echo "sh not than 1";
    fi
    
  • case:採用模式進行匹配,使用;;作爲終止,使用*作爲默認。用於字符串模式匹配時,不要引號
    case $name in
        *saku*) echo "1";
        ;;
        *) echo "2";
        ;;
    esac
    

循環控制

  • for
    for var in item1 ... itemN;
    do
        action;
    done
    
  • while,支持breakcontinue
    while condition;
    do
        action;
    done
    
  • until
    until condition;
    do
        action;
    done
    

輸入輸出重定向

  • n>,n<:將一個文件重定向到另一個文件。
    • n表示文件描述符0是stdin,1是stdout,2是stderr
    • >>表示將輸出追加到文件末尾
    • n>& m表示將輸出文件n合併到輸出文件m。兩者都是文件描述符
  • 當使用command > file時實際發生了:command輸出到stdoutstdout重定向到file
  • |:管道運算符:將標準輸出重新作爲標準輸入
  • <<tag:表示將標記之間的內容作爲輸入
# 將stderr合併到stdout,將stdout輸出到文件中。順序不能改變
ls + . > file 2>&1;

# 將stdout輸出到file1,將stderr輸出到file2
ls + . >file1 2>file2;

# 將整個作爲grep命令的輸入,可以理解爲替代管道符號 |
grep s <<!
not s
yes
is s
!

文件包含

  • . filesource file:將文件包含到當前文件中。

#命令

*/bin命令

  • tr:替換字符串:cat /proc/$PID/environ | tr "\0" "\n"
  • tee:將標準輸入一方面輸入到文件,另一方面到標準輸出
    echo "string" | tee file1.txt file2.txt | cat
    
  • sort:對行進行排序
    sort file.txt;
    cat file.txt | sort;
    
  • cat:讀取顯示文件。
    # 拼接標準輸入
    echo "some text" | cat - file;
    echo "some text" | cat /dev/stdin file;
    
  • echo
  • printf:用法同C語言
  • pgrep:得到符合模式字符串的PID
  • expr
    • 四則運算(+,-,\*,/,%,=)只支持整數。注:乘號需要轉義
    • 比較運算(==,!=)還支持字符串
  • read:獲取鍵盤輸入,可以直接將結果存在變量中:read result
  • find:會遞歸尋找給定目錄下的所有文件
    find . \( -name "*.sh" -o -name "*.py" \) -print
    
  • xargs:可用於將標準輸入的內容格式化;也可用於將標準輸入作爲命令的參數
    echo "/dev" | xargs ls;     # v
    echo "/dev" | ls;           # x
    
  • md5sum:文件校驗和
  • split:文件分割

bash內命令

  • alias unalias:別名。別名是暫時的,可以將操作追加到.bashrc使別名在每個終端生效。
    echo 'alias install="sudo apt install"' >> ~.bashrc
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章