1. 程式人生 > >linux高階程式設計四shell程式設計/指標

linux高階程式設計四shell程式設計/指標

================= 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);