Ubuntu入門與shell指令碼
Ubuntu入門與shell指令碼
目錄摘要:筆記內容主要是,正點原子Linux驅動開發教程的第一部分——Ubuntu入門,自己寫的筆記。
Ubuntu入門
- CPU 越強越好,記憶體最小16G, 硬碟最好200G以上,顯示卡沒有要求。
- 嵌入式Linux開發需要Linux環境,如果雙系統的話,一次只能執行一個系統,不好用。而Ubuntu只做為編譯使用,大部分還是採用windows下進行。所以需要雙系統同時執行,所以需要虛擬機器。
- 虛擬機器軟體有VMware,virtualbox;VMware是收費的,virtualbox是免費的
- 使用15.5.0以上的版本
- 配置虛擬機器
- 核心分配,一般五五分
- 記憶體也是五五分
- 單獨分一個盤給Ubuntu,300G
- 做開發選擇Ubuntu的時候,選擇LTS版本,是長期支援的
- Ubuntu預設不開啟數字鍵盤
- Ubuntu右上角可以關機
Ubuntu終端命令與shell操作
- 終端開啟命令,桌面右擊,開啟終端,Ctrl+Alt+T
- 常見命令
- ls命令,ls命令是瀏覽檔案,ls命令是list的縮寫,就是列舉,預設開啟的是使用者的
- ls -a,有個空格,顯示目錄所有檔案以及資料夾包括隱藏檔案
- ls -l,詳細列表
- ls -al,顯示所有,並詳細資訊
- 沒必要一定要進入,給路徑就行
- cd命令進入某個檔案路徑
- /是根目錄
- cd 路徑
- cd ~
- cd ../返回上一級
- cd直接輸入資料夾,就是相對路徑,如果加上/就是絕對路徑
- pwd命令,當前檔案路徑,print working directory
- uname,uname -a,系統資訊檢視命令,unix name
- clear,清屏,假的清屏,把內容搞到上面去 ,滾動滑鼠可以檢視到的
- cat命令檢視檔案內容,concatenate的縮寫鎖鏈的意思
- sudo,superuser do,超級使用者許可權,採用root使用者許可權
- sudo su,長期切換到超級使用者,不建議
- 切換回來,sudo su mss
- 刪庫跑路,rm /*
- touch,建立檔案
- cp拷貝,cp a.c b.c 拷貝a.c重新命名為b,c
- rm命令刪除
- rm 資料夾名 -rf,刪除資料夾
- rm *.o,刪除所有的.o檔案
- mkdir建立資料夾,資料夾是藍色的字型
- rmdir刪除目錄
- 目錄非空會報錯
- mv重新命名或者移動
- ifconfig命令檢視ip資訊
- ifconfig 網絡卡 down/up 關閉/開啟
- 命令 —-help,幫助命令
- reboot重啟
- poweroff關機
- man系統幫助命令
- sysn資料同步到磁碟
- find找檔案
- find -name name
- find -iname name,忽略大小寫
- Ctrl+c打斷
- grep查詢內容
- grep -ir
- du 資料夾 -sh,檢視檔案大小
- gedit 問加減你,開啟檔案
- ps, 當前系統進行檢視
- top 檢視系統進行實時狀態,類似於window工作管理員,退出按Q
- file,文件型別檢視
- cat 檢視檔案內容
- ls命令,ls命令是瀏覽檔案,ls命令是list的縮寫,就是列舉,預設開啟的是使用者的
軟體安裝
- 安裝方法
- 軟體商店
- sudo apt-get install
- deb軟體包安裝
- 自己下載原始碼安裝編譯
- 下載完之後,進入
- make
- sudo make install
- 其他安裝方法
- Ubuntu下面對應windows的.exe檔案的是.deb
- 下載安裝包,點選Linux型別的安裝包
- 安裝方式
- 雙擊安裝
- sudo dpkg -i 軟體名稱
- dpkg是debian package
- usr -share-applications
- 或者搜尋
檔案
-
bin是可執行二進位制檔案
-
dev檔案是驅動開發,cd /dev
-
etc是配置檔案,密碼等
-
home使用者
-
media是可插拔檔案
-
proc 是虛擬檔案,記憶體的
-
usr是unix software resources
-
./是相對路徑,../返回上一級,.表示當前路徑
- ./表示當前資料夾
-
Linux開發選擇FAT32格式的U盤
磁碟
- 磁碟檔案是sd,ls sd
- 如何判定那個檔案是U盤呢,重新插拔即可
- 一個是U盤,sdb
- 一個U盤的第一個分割槽,sdb1
- df與du檢視容量
- df,整體,disk free
- du,單個,disk usage,du 磁碟名稱 -h --max-depth=1
- mount和umount,掛載與解除安裝,路徑是media的路徑
- mount 裝置 掛載路徑
- 裝置就是dev那的不能操作只能指示一下
- 當前路徑是U盤中時候,不能解除安裝成功
- sudo mount -o iocharset=utf8 /dev/sdb1 /media/mss/msspansion
- 防止中文亂碼問題
- fdisk 磁碟管理
- fdisk -l列出所有的磁碟
- fdisk操作的是dev
- sudo fdisk /dev/sdb
- 必須輸入w儲存命令,另外,刪除的時候得解除安裝磁碟才可以
- 1G=1024$$1024$$1024位元組,一個扇區是512個位元組
- 一個G是2097152個扇區
- 做U盤系統
- sudo mkfs -t fat /dev/sdb1
壓縮與解壓縮
- Linux下的壓縮檔案格式
- .tar
- .tar.bz2
- .tar.gz
- 後兩者常用
- gzip,bzip2,Ubuntu下的壓縮軟體與命令
- gzip只能壓縮檔案,不能打包
- tar打包,就是新建一個歸檔,重點
- -c,建立壓縮檔案
- -x,解壓縮
- -j 使用bzip2進行壓縮
- -z 使用gzip進行壓縮
- -v 顯示過程
- tar -vcf bzip2test.tar bzip2test,新建的檔案寫前面
- tar -vcjf bzip2testtar.bz2 test
- tar -vxjf test.tar.bz2
- rar
- 幫助,rar
- rar a test.rar test
- rar x test.rar
- zip,unzip
- zip test.zip test
- 也可以通過圖形化介面進行壓縮與解壓縮,但是這樣比較偷懶
使用者與使用者組
- 使用者分為初次使用者、root使用者和普通使用者。初次使用者比普通使用者許可權大
- sudo vi /etc/password
- sudo gedit /etc/passwd,是使用者資訊
- sudo gedit /etc/shadow是密碼,加密的
- 使用者組id,使用者組這些說白了就是控制檔案的訪問許可權
- 圖形化介面建立使用者組
- sudo apt-get install gnome-system-tools
- 程式碼建立使用者和使用者組
- adduser 使用者名稱
- finger 使用者名稱
- passwd 使用者名稱
- addgroup 使用者組名
- groups 使用者組名
- delgroup 使用者組名
檔案許可權
- 檔案的三個屬性
- 讀,r
- 寫,w
- 執行,x
- 九個字元
- ---|---|--|,使用者|使用者組內成員|其他使用者
- 修改檔案許可權命令
- R W X,三位二進位制表示為 4 2 1
- chmod 數字 檔名,change the permission mode of the file
- chmod 664 hello
- 編譯的話,用gcc hello.c -o hello
- 檢視許可權,ls 檔案 -l
- sudo chown root hello
- sudo chown .root hello
- sudo chown mss.mss hello,同時更改使用者和使用者組
- sudo chown -r mss.mss 路徑,路徑下所有的使用者和使用者組更改
檔案連線
-
分為軟連線和硬連線,軟連線又叫符號連線,
-
inode記錄檔案屬性,一個檔案一個inode,類似於檔案的ID,查詢檔案的時候要先找到inode,才能讀出檔案的內容
-
In命令,是LN,是link的縮寫,如果建立符號連線,需要加關鍵字s,如果是硬連線的話,就不需要s
- In hello.c hello1
-
gcc後面必須緊跟著原始檔名字,字尾在原始檔名字後面
-
ll -i hello*列印inode
-
硬連線,通過inode連線產生新的檔名,而不是產生新檔案
- 硬連線是多個檔案指向一個inode,具備相同inode的多個檔案互為硬連線檔案
- 對於硬連線檔案,只有刪除了原始檔和對應的所有硬連線的檔案,檔案實體才會被刪除
- 硬連線可以防止檔案被誤刪除,不是複製了一份,因為一旦修改其中的一個,其餘的都會修改
- 硬連線不能跨檔案系統
- 硬連線不常用
-
軟連線用的多
-
軟連線相當於windows下的快捷方式
-
符號連線最好使用絕對路徑,否則會出問題
-
直接cp軟連線 相對路徑到新的路徑的時候,就會變成拷貝新的一份檔案
- cp -d hello test/,加上-d就會保持軟連線屬性
-
ln -s 絕對路徑 軟連線名稱
-
VIM編輯器
- rm指令
- rm hello*
- 安裝VIM之後,使用vi開啟,
- vi test.txt直接新建並開啟
- vim開啟有三種模式
- 指令模式/一般模式,預設,不能文字編輯
- dd,刪除游標所在的行
- 刪除n行,4dd,從游標開始刪除4行
- u,撤銷操作
- .操作類似F4,重複上一個操作
- yy複製這一行
- 複製多行就是nyy
- p貼上到游標xiayihang
- P貼上到游標上一行
- dd,刪除游標所在的行
- 編輯模式,按a即可,退出使用Esc
- 如果不正常退出的話,刪除.*swap即可
- 命令列模式,一般模式下,輸入:即可
- :x,儲存退出
- :q,退出
- :w,儲存
- :q!退出不儲存
- 指令模式/一般模式,預設,不能文字編輯
- 設定vim編輯器進行程式設計
- sudo vim /etc/vim/vimrc
- 在文字最後,輸入set ts =4
- set nu,顯示行號
make和Makefile
-
make工具是一個軟體,使用gcc編譯器,可以自動化編譯,只編譯修改過的檔案
-
Makefile是make使用的檔案,決定了編譯規則
-
gcc編譯多個檔案
- gcc 檔案1名 檔案2名 -o main
- 沒有先後順序
- 第二種語法
- gcc -o main main.c
- gcc -o 新檔名字 舊的檔案
- gcc -o main main.c
- gcc 檔案1名 檔案2名 -o main
-
編譯花費時間,但是沒修改的編譯的話就浪費了時間
-
先編譯為.o檔案,在連線,如果改了那個就重新.o,再連線
-
.o命令
- gcc -c main,c
-
連線命令
- gcc .o .o .o -o main
- gcc .o檔名 -o 新檔名
- gcc .o .o .o -o main
-
上述原理就是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
-
編寫玩Makefile檔案之後,直接執行make命令,它會自動執行Makefile檔案的
-
make clean輸入這個清除編譯出來的檔案
-
make重新編譯的時候會檢查最後的修改日期如果修改了,就會重新編譯,否則不編譯的
-
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指令碼
- shell指令碼就是命令列輸入命令,shell指令碼類似於windows下的批處理 命令
- 字尾名為.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"