linux高階程式設計四shell程式設計/指標
阿新 • • 發佈:2019-02-19
================= main 函式傳參 ===================
1.int main(int argc, const char *argv[])
1.argc:給main函式傳參字串的個數
argv[0]:執行檔案的名字
argv[1]:main函式傳參中main函式後面的第一個字串
...
================= shell 程式設計 ====================
一、shell
1.解釋型語言:python、javascript、shell
適合對系統管理、維護
執行速度快
移植性比較好
開發效率低一些
一邊編譯一邊執行
2.編譯型語言:c、c++
適合進行資料計算
執行速度快
移植性稍弱
開發效率高
先編譯再執行
二、shell程式設計
1.基本流程:
1.建立指令碼檔案:vi XXX.sh
2.授權:chmod +x XXX.sh
3.執行指令碼:./XXX.sh
2.指令碼內容:
1.所有的shell指令碼在編輯的時候必須表名shell型別
一般開頭宣告:#!/bin/bash
2.shell當中語法沒有資料型別,一切皆是字串,語句後沒有;號
3.shell變數
環境變數 ==> 當前shell的環境設定的一些變數
env ==> PATH PWD HOME...
自定義變數
a=1
使用變數
$a
位置變數
$0指令碼名稱
$1 - $9 指令碼引數
$#指令碼引數個數
$?上次執行命令的返回值,成功返回0,失敗返回非0
$$正在執行的shell程序的id號
3.shell中的引號
1." ":如果有字串,字串原樣輸出,如果有$變數則檢視變數的值
2.' ':所有的字元無論是否有變數都原樣輸出
3.` `:在該引號包含的範圍內部都按照命令執行
1 + 1 ==> `expr 1 + 1`
4.shell中的輸入輸出
1.輸入 read 變數
2.輸出 echo “ ”
練習:用read和echo完成兩個變數的加減乘除
+ - \* /
5.shell語句結構
1.測試語句
test 變數 = 值 = : -eq
!= : -ne
> : -gt
< : -lt
>= : -ge
<= : -le
if [ $a -eq 100 ]
then
語句
else
語句
fi
練習:根據使用者輸入判斷,如果存在該檔案則將檔案許可權設定為只讀,如果當前目錄下不存在則在上級目錄下建立一個tmp目錄,並在tmp目錄中建立使用者輸入的檔案 名稱
-a -e:檔案是否存在
練習:根據使用者輸入判斷,輸入檔案到底是哪種檔案型別
-b:檔案是否是塊裝置檔案
-c:檔案是否是字元裝置檔案
-d:檔案是否是目錄檔案
-f:檔案是否是普通檔案
-L:檔案是否是連線檔案
-S:檔案是否是套接字檔案
-p:檔案是否是管道檔案
2.多分支
case字串變數in
模式1)命令名錶
;;
模式2)命令名錶
;;
...
*)命令名錶
;;
esac
3.迴圈語句
1.for
for 變數名 in 單詞表
do
語句
done
for i in `seq 10`
do
echo "$i"
done
for i in {1..10}
do
echo "$i"
done
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "$i"
done
2.until
until [ $i -gt 10 ]
do
echo "$i"
done
3.while
while [ $i -le 10 ]
do
echo "$i"
done
4.exit
5.break
#!/bin/bash
for i in 1 2 3 4 5
do
for j in 1 2 3 4 5
do
if [ $j -eq 3 ]
then
break 2
fi
echo "----------"
done
echo "**********"
done
4.陣列:
5.函式:
======================= 指標 ============================
1.指標和地址
2.一級指標和二級指標
int a = 10;
定義一個變數,並在記憶體當中開闢4個位元組空間儲存變數的值
int *p = &a;
定義一個指標變數,並在記憶體當中開闢4個位元組空間儲存變數的地址
int **q = &p;
定義一個指標變數,並在記憶體當中開闢4個位元組空間儲存指向變數的指標的地址
3.指標陣列和陣列指標
int a[3];
定義一個整型陣列,並在記憶體當中開闢12個位元組的空間儲存變數的值
用來儲存整型資料的陣列
int *a[3];
int* a[3];
定義一個指標陣列,並在記憶體當中開闢12個位元組的空間儲存指向變數的地址
用來儲存指標的陣列
int *a;
定義一個指標,並在記憶體當中開闢4個位元組的空間儲存指向變數的地址
指向整型變數的一個指標
int (*a)[3];
int[3] (*a);
定義一個指標,並在記憶體當中開闢4個位元組的空間儲存指向整型陣列的地址
指向整型陣列的一個指標
4.const 指標
const == 只讀
1.const int *p;
int const *p;
p儲存變數的地址可以修改 不能通過*p修改變數的值(p指標指向的變數的值不能修改)
2.int *const p;
p儲存變數的地址不能修改(p在定義的時候必須初始化) *p的值可以改變
3.const int * const p;
int const * const p = &a;
p儲存變數的地址不能修改(p在定義的時候必須初始化)也不能通過*p修改變數的值
5.char *p;
p + 1:向地址高的空間移動一個位元組
int *p;
p + 1:向地址高的空間移動四個位元組
6.void *p;
char *q;
int *s;
s = q;錯
p = q;對
p = s;對
7.一維陣列和二維陣列
一維陣列儲存
二位陣列儲存
8.一維陣列和指標的關係
int a[4];
int *p;
p = a = &a[0]
a[0] = *p = *a
p+1 = a+1 = &a[1]
a[1] = *(p+1) = *(a+1)
9.二維陣列、二級指標和陣列指標、指標陣列的關係
1.行指標:在二位陣列當中指向一行資料的指標
int *p = a[0];
p = a[0] = &a[0][0]
a[0][0] = *p = *a[0]
p+1 = a[0]+1 = &a[0][1]
a[0][1] = *(p+1) = *(a[0]+1)
int *q = a[1];
q = a[1] = &a[1][0]
a[1][0] = *q = *a[1]
q+1 = a[1]+1 = &a[1][1]
a[1][1] = *(q+1) = *(a[1]+1)
2.int a[2][3];
int (*p)[2] = a;
p = &a[0];
*p = a[0];
p+1 = &a[1];
*(p+1) = a[1];
二維陣列a其實是一個數組指標
二維陣列a不是一個指標陣列
3.二級指標是一個指標陣列
int main(int argc,const char** argv);
1.int main(int argc, const char *argv[])
1.argc:給main函式傳參字串的個數
argv[0]:執行檔案的名字
argv[1]:main函式傳參中main函式後面的第一個字串
...
================= shell 程式設計 ====================
一、shell
1.解釋型語言:python、javascript、shell
適合對系統管理、維護
執行速度快
移植性比較好
開發效率低一些
一邊編譯一邊執行
2.編譯型語言:c、c++
適合進行資料計算
執行速度快
移植性稍弱
開發效率高
先編譯再執行
二、shell程式設計
1.基本流程:
1.建立指令碼檔案:vi XXX.sh
2.授權:chmod +x XXX.sh
3.執行指令碼:./XXX.sh
2.指令碼內容:
1.所有的shell指令碼在編輯的時候必須表名shell型別
一般開頭宣告:#!/bin/bash
2.shell當中語法沒有資料型別,一切皆是字串,語句後沒有;號
3.shell變數
環境變數 ==> 當前shell的環境設定的一些變數
env ==> PATH PWD HOME...
自定義變數
a=1
使用變數
$a
位置變數
$0指令碼名稱
$1 - $9 指令碼引數
$#指令碼引數個數
$?上次執行命令的返回值,成功返回0,失敗返回非0
$$正在執行的shell程序的id號
3.shell中的引號
1." ":如果有字串,字串原樣輸出,如果有$變數則檢視變數的值
2.' ':所有的字元無論是否有變數都原樣輸出
3.` `:在該引號包含的範圍內部都按照命令執行
1 + 1 ==> `expr 1 + 1`
4.shell中的輸入輸出
1.輸入 read 變數
2.輸出 echo “ ”
練習:用read和echo完成兩個變數的加減乘除
+ - \* /
5.shell語句結構
1.測試語句
test 變數 = 值 = : -eq
!= : -ne
> : -gt
< : -lt
>= : -ge
<= : -le
if [ $a -eq 100 ]
then
語句
else
語句
fi
練習:根據使用者輸入判斷,如果存在該檔案則將檔案許可權設定為只讀,如果當前目錄下不存在則在上級目錄下建立一個tmp目錄,並在tmp目錄中建立使用者輸入的檔案 名稱
-a -e:檔案是否存在
練習:根據使用者輸入判斷,輸入檔案到底是哪種檔案型別
-b:檔案是否是塊裝置檔案
-c:檔案是否是字元裝置檔案
-d:檔案是否是目錄檔案
-f:檔案是否是普通檔案
-L:檔案是否是連線檔案
-S:檔案是否是套接字檔案
-p:檔案是否是管道檔案
2.多分支
case字串變數in
模式1)命令名錶
;;
模式2)命令名錶
;;
...
*)命令名錶
;;
esac
3.迴圈語句
1.for
for 變數名 in 單詞表
do
語句
done
for i in `seq 10`
do
echo "$i"
done
for i in {1..10}
do
echo "$i"
done
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "$i"
done
2.until
until [ $i -gt 10 ]
do
echo "$i"
done
3.while
while [ $i -le 10 ]
do
echo "$i"
done
4.exit
5.break
#!/bin/bash
for i in 1 2 3 4 5
do
for j in 1 2 3 4 5
do
if [ $j -eq 3 ]
then
break 2
fi
echo "----------"
done
echo "**********"
done
4.陣列:
5.函式:
======================= 指標 ============================
1.指標和地址
2.一級指標和二級指標
int a = 10;
定義一個變數,並在記憶體當中開闢4個位元組空間儲存變數的值
int *p = &a;
定義一個指標變數,並在記憶體當中開闢4個位元組空間儲存變數的地址
int **q = &p;
定義一個指標變數,並在記憶體當中開闢4個位元組空間儲存指向變數的指標的地址
3.指標陣列和陣列指標
int a[3];
定義一個整型陣列,並在記憶體當中開闢12個位元組的空間儲存變數的值
用來儲存整型資料的陣列
int *a[3];
int* a[3];
定義一個指標陣列,並在記憶體當中開闢12個位元組的空間儲存指向變數的地址
用來儲存指標的陣列
int *a;
定義一個指標,並在記憶體當中開闢4個位元組的空間儲存指向變數的地址
指向整型變數的一個指標
int (*a)[3];
int[3] (*a);
定義一個指標,並在記憶體當中開闢4個位元組的空間儲存指向整型陣列的地址
指向整型陣列的一個指標
4.const 指標
const == 只讀
1.const int *p;
int const *p;
p儲存變數的地址可以修改 不能通過*p修改變數的值(p指標指向的變數的值不能修改)
2.int *const p;
p儲存變數的地址不能修改(p在定義的時候必須初始化) *p的值可以改變
3.const int * const p;
int const * const p = &a;
p儲存變數的地址不能修改(p在定義的時候必須初始化)也不能通過*p修改變數的值
5.char *p;
p + 1:向地址高的空間移動一個位元組
int *p;
p + 1:向地址高的空間移動四個位元組
6.void *p;
char *q;
int *s;
s = q;錯
p = q;對
p = s;對
7.一維陣列和二維陣列
一維陣列儲存
二位陣列儲存
8.一維陣列和指標的關係
int a[4];
int *p;
p = a = &a[0]
a[0] = *p = *a
p+1 = a+1 = &a[1]
a[1] = *(p+1) = *(a+1)
9.二維陣列、二級指標和陣列指標、指標陣列的關係
1.行指標:在二位陣列當中指向一行資料的指標
int *p = a[0];
p = a[0] = &a[0][0]
a[0][0] = *p = *a[0]
p+1 = a[0]+1 = &a[0][1]
a[0][1] = *(p+1) = *(a[0]+1)
int *q = a[1];
q = a[1] = &a[1][0]
a[1][0] = *q = *a[1]
q+1 = a[1]+1 = &a[1][1]
a[1][1] = *(q+1) = *(a[1]+1)
2.int a[2][3];
int (*p)[2] = a;
p = &a[0];
*p = a[0];
p+1 = &a[1];
*(p+1) = a[1];
二維陣列a其實是一個數組指標
二維陣列a不是一個指標陣列
3.二級指標是一個指標陣列
int main(int argc,const char** argv);