1. 程式人生 > 其它 >Ubuntu入門與shell指令碼

Ubuntu入門與shell指令碼

Ubuntu入門與shell指令碼

摘要:筆記內容主要是,正點原子Linux驅動開發教程的第一部分——Ubuntu入門,自己寫的筆記。

目錄

Ubuntu入門

  1. CPU 越強越好,記憶體最小16G, 硬碟最好200G以上,顯示卡沒有要求。
  2. 嵌入式Linux開發需要Linux環境,如果雙系統的話,一次只能執行一個系統,不好用。而Ubuntu只做為編譯使用,大部分還是採用windows下進行。所以需要雙系統同時執行,所以需要虛擬機器。
    1. 虛擬機器軟體有VMware,virtualbox;VMware是收費的,virtualbox是免費的
    2. 使用15.5.0以上的版本
  3. 配置虛擬機器
    1. 核心分配,一般五五分
    2. 記憶體也是五五分
    3. 單獨分一個盤給Ubuntu,300G
  4. 做開發選擇Ubuntu的時候,選擇LTS版本,是長期支援的
  5. Ubuntu預設不開啟數字鍵盤
  6. Ubuntu右上角可以關機

Ubuntu終端命令與shell操作

  1. 終端開啟命令,桌面右擊,開啟終端,Ctrl+Alt+T
  2. 常見命令
    1. ls命令,ls命令是瀏覽檔案,ls命令是list的縮寫,就是列舉,預設開啟的是使用者的
      1. ls -a,有個空格,顯示目錄所有檔案以及資料夾包括隱藏檔案
      2. ls -l,詳細列表
      3. ls -al,顯示所有,並詳細資訊
      4. 沒必要一定要進入,給路徑就行
    2. cd命令進入某個檔案路徑
      1. /是根目錄
      2. cd 路徑
      3. cd ~
      4. cd ../返回上一級
      5. cd直接輸入資料夾,就是相對路徑,如果加上/就是絕對路徑
    3. pwd命令,當前檔案路徑,print working directory
    4. uname,uname -a,系統資訊檢視命令,unix name
    5. clear,清屏,假的清屏,把內容搞到上面去 ,滾動滑鼠可以檢視到的
    6. cat命令檢視檔案內容,concatenate的縮寫鎖鏈的意思
    7. sudo,superuser do,超級使用者許可權,採用root使用者許可權
    8. sudo su,長期切換到超級使用者,不建議
      1. 切換回來,sudo su mss
      2. 刪庫跑路,rm /*
    9. touch,建立檔案
    10. cp拷貝,cp a.c b.c 拷貝a.c重新命名為b,c
    11. rm命令刪除
      1. rm 資料夾名 -rf,刪除資料夾
      2. rm *.o,刪除所有的.o檔案
    12. mkdir建立資料夾,資料夾是藍色的字型
    13. rmdir刪除目錄
      1. 目錄非空會報錯
    14. mv重新命名或者移動
    15. ifconfig命令檢視ip資訊
      1. ifconfig 網絡卡 down/up 關閉/開啟
    16. 命令 —-help,幫助命令
    17. reboot重啟
    18. poweroff關機
    19. man系統幫助命令
    20. sysn資料同步到磁碟
    21. find找檔案
      1. find -name name
      2. find -iname name,忽略大小寫
    22. Ctrl+c打斷
    23. grep查詢內容
      1. grep -ir
    24. du 資料夾 -sh,檢視檔案大小
    25. gedit 問加減你,開啟檔案
    26. ps, 當前系統進行檢視
    27. top 檢視系統進行實時狀態,類似於window工作管理員,退出按Q
    28. file,文件型別檢視
    29. cat 檢視檔案內容

軟體安裝

  1. 安裝方法
    1. 軟體商店
    2. sudo apt-get install
    3. deb軟體包安裝
    4. 自己下載原始碼安裝編譯
      1. 下載完之後,進入
      2. make
      3. sudo make install
    5. 其他安裝方法
  2. Ubuntu下面對應windows的.exe檔案的是.deb
    1. 下載安裝包,點選Linux型別的安裝包
    2. 安裝方式
      1. 雙擊安裝
      2. sudo dpkg -i 軟體名稱
        1. dpkg是debian package
        2. usr -share-applications
        3. 或者搜尋

檔案

  1. bin是可執行二進位制檔案

  2. dev檔案是驅動開發,cd /dev

  3. etc是配置檔案,密碼等

  4. home使用者

  5. media是可插拔檔案

  6. proc 是虛擬檔案,記憶體的

  7. usr是unix software resources

  8. ./是相對路徑,../返回上一級,.表示當前路徑

    1. ./表示當前資料夾
  9. Linux開發選擇FAT32格式的U盤

磁碟

  1. 磁碟檔案是sd,ls sd
  2. 如何判定那個檔案是U盤呢,重新插拔即可
    1. 一個是U盤,sdb
    2. 一個U盤的第一個分割槽,sdb1
  3. df與du檢視容量
    1. df,整體,disk free
    2. du,單個,disk usage,du 磁碟名稱 -h --max-depth=1
  4. mount和umount,掛載與解除安裝,路徑是media的路徑
    1. mount 裝置 掛載路徑
    2. 裝置就是dev那的不能操作只能指示一下
    3. 當前路徑是U盤中時候,不能解除安裝成功
    4. sudo mount -o iocharset=utf8 /dev/sdb1 /media/mss/msspansion
      1. 防止中文亂碼問題
  5. fdisk 磁碟管理
    1. fdisk -l列出所有的磁碟
    2. fdisk操作的是dev
    3. sudo fdisk /dev/sdb
    4. 必須輸入w儲存命令,另外,刪除的時候得解除安裝磁碟才可以
    5. 1G=1024$$1024$$1024位元組,一個扇區是512個位元組
      1. 一個G是2097152個扇區
  6. 做U盤系統
    1. sudo mkfs -t fat /dev/sdb1

壓縮與解壓縮

  1. Linux下的壓縮檔案格式
    1. .tar
    2. .tar.bz2
    3. .tar.gz
    4. 後兩者常用
  2. gzip,bzip2,Ubuntu下的壓縮軟體與命令
    1. gzip只能壓縮檔案,不能打包
  3. tar打包,就是新建一個歸檔,重點
    1. -c,建立壓縮檔案
    2. -x,解壓縮
    3. -j 使用bzip2進行壓縮
    4. -z 使用gzip進行壓縮
    5. -v 顯示過程
    6. tar -vcf bzip2test.tar bzip2test,新建的檔案寫前面
    7. tar -vcjf bzip2testtar.bz2 test
    8. tar -vxjf test.tar.bz2
  4. rar
    1. 幫助,rar
    2. rar a test.rar test
    3. rar x test.rar
  5. zip,unzip
    1. zip test.zip test
  6. 也可以通過圖形化介面進行壓縮與解壓縮,但是這樣比較偷懶

使用者與使用者組

  1. 使用者分為初次使用者、root使用者和普通使用者。初次使用者比普通使用者許可權大
  2. sudo vi /etc/password
  3. sudo gedit /etc/passwd,是使用者資訊
  4. sudo gedit /etc/shadow是密碼,加密的
  5. 使用者組id,使用者組這些說白了就是控制檔案的訪問許可權
  6. 圖形化介面建立使用者組
    1. sudo apt-get install gnome-system-tools
  7. 程式碼建立使用者和使用者組
    1. adduser 使用者名稱
    2. finger 使用者名稱
    3. passwd 使用者名稱
    4. addgroup 使用者組名
    5. groups 使用者組名
    6. delgroup 使用者組名

檔案許可權

  1. 檔案的三個屬性
    1. 讀,r
    2. 寫,w
    3. 執行,x
  2. 九個字元
    1. ---|---|--|,使用者|使用者組內成員|其他使用者
  3. 修改檔案許可權命令
  4. R W X,三位二進位制表示為 4 2 1
    1. chmod 數字 檔名,change the permission mode of the file
    2. chmod 664 hello
  5. 編譯的話,用gcc hello.c -o hello
  6. 檢視許可權,ls 檔案 -l
  7. sudo chown root hello
  8. sudo chown .root hello
  9. sudo chown mss.mss hello,同時更改使用者和使用者組
  10. sudo chown -r mss.mss 路徑,路徑下所有的使用者和使用者組更改

檔案連線

  1. 分為軟連線和硬連線,軟連線又叫符號連線,

  2. inode記錄檔案屬性,一個檔案一個inode,類似於檔案的ID,查詢檔案的時候要先找到inode,才能讀出檔案的內容

  3. In命令,是LN,是link的縮寫,如果建立符號連線,需要加關鍵字s,如果是硬連線的話,就不需要s

    1. In hello.c hello1
  4. gcc後面必須緊跟著原始檔名字,字尾在原始檔名字後面

  5. ll -i hello*列印inode

  6. 硬連線,通過inode連線產生新的檔名,而不是產生新檔案

    1. 硬連線是多個檔案指向一個inode,具備相同inode的多個檔案互為硬連線檔案
    2. 對於硬連線檔案,只有刪除了原始檔和對應的所有硬連線的檔案,檔案實體才會被刪除
    3. 硬連線可以防止檔案被誤刪除,不是複製了一份,因為一旦修改其中的一個,其餘的都會修改
    4. 硬連線不能跨檔案系統
    5. 硬連線不常用
  7. 軟連線用的多

    1. 軟連線相當於windows下的快捷方式

    2. 符號連線最好使用絕對路徑,否則會出問題

    3. 直接cp軟連線 相對路徑到新的路徑的時候,就會變成拷貝新的一份檔案

      1. cp -d hello test/,加上-d就會保持軟連線屬性
    4. ln -s 絕對路徑 軟連線名稱

VIM編輯器

  1. rm指令
    1. rm hello*
  2. 安裝VIM之後,使用vi開啟,
    1. vi test.txt直接新建並開啟
  3. vim開啟有三種模式
    1. 指令模式/一般模式,預設,不能文字編輯
      1. dd,刪除游標所在的行
        1. 刪除n行,4dd,從游標開始刪除4行
      2. u,撤銷操作
      3. .操作類似F4,重複上一個操作
      4. yy複製這一行
        1. 複製多行就是nyy
      5. p貼上到游標xiayihang
      6. P貼上到游標上一行
    2. 編輯模式,按a即可,退出使用Esc
      1. 如果不正常退出的話,刪除.*swap即可
    3. 命令列模式,一般模式下,輸入:即可
      1. :x,儲存退出
      2. :q,退出
      3. :w,儲存
      4. :q!退出不儲存
  4. 設定vim編輯器進行程式設計
    1. sudo vim /etc/vim/vimrc
    2. 在文字最後,輸入set ts =4
    3. set nu,顯示行號

make和Makefile

  1. make工具是一個軟體,使用gcc編譯器,可以自動化編譯,只編譯修改過的檔案

  2. Makefile是make使用的檔案,決定了編譯規則

  3. gcc編譯多個檔案

    1. gcc 檔案1名 檔案2名 -o main
      1. 沒有先後順序
    2. 第二種語法
      1. gcc -o main main.c
        1. gcc -o 新檔名字 舊的檔案
  4. 編譯花費時間,但是沒修改的編譯的話就浪費了時間

    1. 先編譯為.o檔案,在連線,如果改了那個就重新.o,再連線

    2. .o命令

      1. gcc -c main,c
    3. 連線命令

      1. gcc .o .o .o -o main
        1. gcc .o檔名 -o 新檔名
    4. 上述原理就是Makefile的原理,Makefile就是這樣寫的Makefile和makefile都可以

      main:main.o input.o calcu.o
      	gcc -o main main.o input.o calcu.o
      main.o:main.c
      	gcc -c main.c
      input.o:input.c
      	gcc -c input.c
      calcu.o:calcu.c
      	gcc -c calcu.c
      clean:
      	rm *.o
      	rm main
      
    5. 編寫玩Makefile檔案之後,直接執行make命令,它會自動執行Makefile檔案的

    6. make clean輸入這個清除編譯出來的檔案

    7. make重新編譯的時候會檢查最後的修改日期如果修改了,就會重新編譯,否則不編譯的

    8. Makefile的printf是echo,echo前面加上@表示不輸出具體過程

      #規則格式:必須使用tab鍵,不能使用空格,第一條為預設物件,也就是終極目標
      
      目標:依賴項
      	命令1
      	命令2
      #gcc的時候,為了減少變數的重複輸入,可以將變數進行定義
      #gcc中只有一種變數型別,就是字串
      object=main.o input.o calcu.o
      
      #引用變數的時候採用$(),美元符號加括號的形式
      main:$(object)
      	gcc -o main $(object)
      	
      #賦值符號=
      #變數先定義,最終數值,取決於最新定義的數值
      
      #賦值符號:=
      #數值取決於最開始定義的,以後再=賦值不起作用
      
      #賦值符號?=
      #如果前面沒有定義就採用後面的數值,如果定義了,就採用前面的數值
      
      #追加+=
      #在前面的基礎上進行追加
      
      
      #萬用字元%,避免相同規則重複書寫
      #自動化變數,採用$<等等,命令必須採用具體的檔名
      	#最常用的是:
      		#$@,表示目標集合
      		#$<,依賴檔案,如果是萬用字元,則代表全部的符合要求的依賴檔案
      		#$^,依賴檔案的集合,會去除重複檔案 
      	
      %.o:%.c
      	gcc -c $<
      # 注意$<已經表示檔案全部了,不需要再加字尾名
      
      #偽目標,就是clean那種
      #但是存在問題,如果存在clean檔案,就不會執行指令了
      #所以需要宣告為偽目標,
      .PHONY : clean
      clean:
      
      #這兩步之後,不管有沒有重名檔案,都會執行偽目標
      
      

shell指令碼

  1. shell指令碼就是命令列輸入命令,shell指令碼類似於windows下的批處理 命令
  2. 字尾名為.sh,第一行為;第一行必須輸入#!/bin/bash
#!/bin/bash
echo "please enter your name"
read name
echo "your name:" $name


read -p "please your age and height" age height
echo "your age is $age,you height is $height"


echo "please enter two int num:"
read -p "first num:" first_num
read -p "second num:" second_num
total=$(($first_num+$second_num))
# 運算子是美元符號,兩對括號,其中賦值符號兩邊不能放空格,否則報錯
echo "$first_num+$second_num=$total"

#test命令對數值、字元、檔案三方面進行測試
# cmd1 && cmd2,cmd1正確執行才會執行cmd2
# cmd1 ||cmd2,cmd1正確執行就不執行cmd2,否則執行cmd2

echo "please enter filename"
read -p "filename:" filename
test -e $filename && echo "$filename exist" || echo "$filename does not exist"

echo "please enter two string:"
read -p "first string" first_str
read -p "second string" second_str
test $first_str == $second_str && echo "==" || echo "!="
# ==前後必須有空格,否則結果執行不正確

# [] 用來判斷字串是否相等,相當於 test 
[ "$first_str" == "second_str" ]
# 首先括號附近得空格;其次字串必須引號引起來,!=是!和=的組合
[ "$first_str" != "second_str" ]

# $0檔案第一個引數 $1 $@引數內容 $#最後一個引數標號,檔案本身是$0
./my.sh a b c
#此時 $0 為./my.sh $1為a,$2為b,$3為c,$#表示引數個數3,$@列印所有引數也就是a b c


read -p "please enter(Y/N):" value
if[ "$value" == "y" ] ||[ "$value" == "Y" ];then
	echo "your option is Y"
	exit 0
fi

if[ "$value" == "N" ] ||[ "$value"== "n" ];then
	echo "your option is N"
	exit 0
fi
#if 開頭fi結束;if 條件 :then;exit 0是結束退出
#雙等號前後必須有空格,否則結果執行不正確
#shell 中then前面的是分號


read -p "please enter(Y/N):" value
if[ "$value" == "y" ] ||[ "$value" == "Y" ];then
	echo "your option is Y"
	exit 0
else
	echo "your option is $value"
	exit 0
fi
#if else語句中,else後面沒有任何符號;但是兩個分支都要exit 0


read -p "please enter(Y/N):" value
if[ "$value" == "y" ] ||[ "$value" == "Y" ];then
	echo "your option is Y"
	exit 0
elif [ "$value" == "N" ] ||[ "$value"== "n" ];then
	echo "your option is $value"
	exit 0
else
	echo "your option can not identify!"
	exit 0
fi
#是elif 是elif


#shell case語句
case $變數 in:
	"變數1")
		語句1
      ;;
     "變數2")
      	語句2
      ;;
esac
#末尾以case反過來寫結束,每一個語句結束帶兩個分號,選項只有右邊的括號,左上角是esc,他多一個字母a,是esac

  1 #!/bin/bash
  2 case $1 in 			#首先$1表示第一個輸入的引數,其次in後面沒有冒號
  3     "a")
  4         echo    "parameter is a"
  5         ;;
  6     "b")
  7         echo    "parameter is b"
  8         ;;
  9     *)				#這直接是*,不能是“*”,這樣表示*字元,而不是萬用字元了
 10         echo    "cannot identify"
 11         ;;			#這記得加上兩個分號
 12 esac
          
          
#shell函式
function help(){
  	echo "this is help cmd!"
}

function close(){
	echo "this is close cmd!"
}

case $1 in
	"-h")
		help		#呼叫函式的時候直接寫函式名即可,不需要寫引數
		;;
    "-c")
    	close		#呼叫函式的時候直接寫函式名即可,不需要寫引數
    	;;
esac


#shell函式傳參

print(){
	echo "parameter 1 is : $1"
	echo "parameter 1 is : $2"
}
  
print a b 		#傳參就是函式名 後面直接加引數,不需要括號


#shell 的while迴圈
while  [ 條件成立  ]
do
	迴圈體
done

while[ "$value" != "close" ]
do
	read -p "please enter para:" value
done
echo "while stopped!"


#shell for迴圈,for迴圈與while迴圈一樣都是do done迴圈
for name is mss mss1 mss2 mss3
do
	echo "your name is : $name"
done

#shell 類似c語言的for迴圈
read -p "please enter count:" count
total=0
for ((i=0;i<=count;i=i+1))
do 
	total=$(($total+$i))
done
echo "1+……+ $count = $total"