1. 程式人生 > >linux與c的學習(2018.11.11)

linux與c的學習(2018.11.11)

工程管理器make(續)
偽目標【沒有依賴,只有執行動作】

.PHONY:clean  //宣告偽目標
clean:
	rm -f hello main.o func1.o func2.o
執行偽目標: make clean

不取名為makefile的執行方式:
make -f 檔名 //執行

多檔案編譯:

obj = main.o fun1.o fun2.o fun3.o   //obj為自定義
hello:$(obj)                     //$:取資訊
	gcc $(obj) -o hello

系統預設的自動化變數
$^:代表所有的依賴檔案
[email protected]

:代表目標
$<:代表第一個依賴檔案
eg:

hello:main.o fun1.o fun2.o
	gcc main.o fun1.o fun2.o -o hello
可等效為:
hello:main.o fun1.o fun2.o
	gcc $^  -o [email protected]

@:取消回顯
#:在makefile中#後面接註釋

hello: hello.c
	@gcc hello.c -o hello

SHELL指令碼
Shell就是一個命令列直譯器,它的作用就是遵循一定的語法將輸入的命令加以解釋並傳給系統。
Shell來啟動、掛起、停止甚至是編寫一些程式。

程式:
vim xxx //建立shell指令碼檔案
程式必須以下面的行開始(必須方在檔案的第一行):
#!/bin/sh
#!用來告訴系統它後面的引數是用來執行該檔案的程式。
要使指令碼可執行:
chmod +x filename
然後,可以通過輸入: ./filename 來執行指令碼

變數名=值
取出變數值可以加一個美元符號($)在變數前面
變數賦值時,“=”兩邊都不能有空格
BASH中的語句結尾不需要分號
eg:

 #!/bin/sh 
#對變數賦值:
a="hello world" 
# 現在列印變數a的內容:
echo "A is:" 
echo $a

//之後執行chmod +x HelloWorld
最後輸入./ HelloWorld執行該指令碼。
這個指令碼將會輸出: 
A is: 
hello world

echo “this is the $numnd”
不會打印出“this is the 2nd”,而僅僅列印“this is the”,因為shell會去搜索numnd變數的值,但這個變數是沒有值的。可以使用{}來告訴shell我們要列印的是num變數:

echo “this is the ${num}nd”
這將列印: “this is the 2nd”

預設變數
$#:傳入指令碼的命令列引數個數
$*:所有命令列引數值,在各個引數值間留有空格
$0:命令本身(shell檔名)
$1:第一個命令列引數
$2:第二個命令列引數

區域性變數
在變數首次被複制時加上local關鍵字可以什麼一個區域性變數

IF語句
If [expression]
then
#code block
fi
If [expression]
then
#code block
else
#code block
fi

eg:

If [expression]
	then
		#code block
	else if [expression]
		 then
		 	#code block
		  else
			#code block
		  fi
	fi

在這裡插入圖片描述

比較整數a和整數b是否相等:if[ $a = $b ]
比較整數a是否大於整數b:if[ $a –gt $b ]
比較字串a和b是否相等: if[ $a = $b ]
判斷字串a是否為空:if[ -z $a ]
比較整數變數a是否大於b:if[ $a –gt $b ]
注意:1、在“[”和“]”兩邊都留有空格
2、在“=”兩邊也都有空格

-e 檔案已存在
-f 檔案是普通檔案
-s 檔案大小不為零
-d 檔案是一個目錄
-r 檔案對當前使用者可以讀取
-w 檔案對當前使用者可以寫入
-x 檔案對當前使用者可以執行

for迴圈

for var in [list]
	do
		#code block
	done

While迴圈

while [condition]
do
	#code block
done

until迴圈

until [condition]
do
	#code block
done
    while和until的區別在於while為真時執行,until為假時執行;

case語句
BASH語句中的case和c語言中的類似可以用於進行多項分支控制:

case “$var” in
	contidion1)
		;;
	contidion1)
		;;
	*)
	default statements;;
esac

C
程式:資料結構+演算法

int的長度根據CPU的字長來決定的,int可變,在16位的機子上是2個位元組,在32位上是4個位元組
long int 位元組數不變,是4個位元組(32位)
int在記憶體中以補碼方式存放。
補碼:
正數:補碼原碼一樣
負數:原碼–>補碼的方法:符號位不變【最左邊的第一位】,其他按位取反 然後+1

[]是下標運算子:
1、計算偏移地址
2、取值

右大括號 } 有返回值的功能。