shell 入門學習


title: shell 入門學習
date: 2019/7/16 15:47:49
toc: true
---linux

shell 入門學習

linux c 一站式學習筆記shell

https://ss64.com/bash/syntax.html編程

註釋

使用#註釋一行bash

#!在第一行稱爲Shebang,表示腳本解釋器是什麼,好比!# bin/bash函數

執行與啓動

  • 文件首行的!#不只能夠指定程序,還能指定參數#! /bin/sed -f,增長了這個shebang的腳本能夠不用指定程序,直接使用./xxx.腳本執行學習

  • man bash-builtins 查看內建命令測試

  • 爲何須要內建命令?ui

    shell的外部命令流程是先fork出一個shell後執行exec執行命令,fork後返回會恢復父進程的上下文,因此諸如cd等命令就不能產生效果了.net

  • 內建命令使用$?讀出返回的狀態

  • 命令行下輸入的命令用()括號括起來,那麼也會fork出一個子Shell執行小括號中的命令

  • 使用source xxx.sh或者. ./xxx.sh改變子進程,不會影響交互式(父)shell

  • 交互登陸bash的環境變量順序 搜索A *login shell* is one whose

    /etc/profile
    ~/.bash_profile, ~/.bash_login, and ~/.profile
    退出
    /etc/bash.bash_logout
  • 交互非登錄bash讀取文件~/.bashrc,使用--norc禁用這個操做
  • 非交互啓動bash,執行子命令的fork,由環境變量BASH_ENV決定, 它的值看成啓動腳本的文件名
  • sh啓動的bash,儘可能模擬上述三種bash
    • 帶有--login,模擬交互登陸bash的環境變量順序,/etc/profile ~/.profile
    • 交互bash,展開變量if [ -n "$ENV" ]; then . "$ENV"; fi
    • 非交互Shell啓動,例如#! /bin/sh,則不執行任何啓動腳本

變量

  • *匹配0或者任意個字符

  • ?匹配一個任意字符

  • [xxx],匹配方括號中任意一個字符的一次出現

  • ` 和 $() 命令代換明顯執行後計算結果複製變量
  • $(())變量轉換爲整數,只能作加減乘除的整數運算

  • 轉義字符是\,shell輸入時還表示換行繼續

  • 建立帶有-開頭的文件touch -- -a.c

  • 雙引號用於保持引號內全部字符的字面值(回車也不例外),但如下狀況除外:

    $加變量名能夠取變量的值
      反引號仍表示命令替換
      \$表示$的字面值
      \`表示`的字面值
      \"表示"的字面值
      \\表示\的字面值
      除以上狀況以外,在其它字符前面的\無特殊含義,只表示字面值
  • $0 命令自己
    $一、 $2.. 參數
    $# 參數個數,不包括$0
    $@ 表示參數列表"$1" "$2" ...,例如能夠用在for循環中的in後面。
    $? 上一條命令的Exit Status
    $$ 當前Shell的進程號
    shift shift 3表示原來的$4如今變成$1,不帶參數的shift命令至關於shift 1

語法

參考 /etc/init.d/下的腳本

if
 then
elif
 then
else
fi



case $xxx in
    a)
        ...
    ;;
    b)
        ...
    ;;
    *)
esac

for xxx in xxxx
done

while xxx;do
    xxx
done
  • true =0,false=1,這與c語言相反

  • 命令test[能夠測試條件是否成立

  • $?是退出狀態

  • -eq(等於) -ne(不等於) 
      -lt(小於) -le(小於等於) 
      -gt(大於) -ge(大於等於)
  • 測試表達式的鏈接符號 
      ! 邏輯反
      -a 與
      -o 或
  • 做爲一種好的Shell編程習慣,應該老是把變量取值放在雙引號之中,好比"$VAR",p602 linuxc 一站式編程

  • 多個命令在一行用;隔開,一行一個命令不須要;

  • :是一個特殊的命令,稱爲空命令,該命令不作任何事,但Exit Status老是真

  • &&至關於「if...then...」,而||至關於if not...then...

  • $1shell中第一個參數,$0爲命令自身,$#是參數個數,布包裹$0
  • 函數體的左花括號{和後面的命令之間必須有空格或換行,若是將最後一條命令和右花括號}寫
    在同一行,命令末尾必須有;號,函數調用不寫括號
  • mkdir $DIR > /dev/null 2>&1,這裏先將標準輸出重定位到null,而後標準錯誤輸出也到標準輸出,使用&的緣由是這裏是引用標準輸出,不加引號的話就是1這個文件了

調試

-n 讀取不執行.相似編譯
-v 一邊執行,一遍打印標準錯誤
-x 打印執行的每句話和結果

使用

$ sh -x ./script.sh

#! /bin/sh -x

腳本中設置,set -x和set +x分別表示啓用和禁用-x參數,這樣能夠只對腳本中的某一段進行跟蹤調試
#! /bin/sh
if [ -z "$1" ]; then
set -x
    echo "ERROR: Insufficient Args."
exit 1
set +x
fi
相關文章
相關標籤/搜索