linux學習總結----shell編程

## 環境變量  

## 全局變量  

 ```
常見的全局環境變量   
  PATH 指令的搜索路徑
  HOME 用戶的家目錄
  LOGNAME 登陸名
  SHELL 腳本的類型 
  
 使用全局環境變量 
 echo $PATH
 
 自定義全局變量  
  name='kangbazi'
  echo $name;
  
 配置系統環境變量 
 vim /etc/profile
 export name=1804 
 source /etc/profile
 
 
 echo $name 
 ```

### 設置path環境變量   

```
echo  $PATH 

1.對全部的用戶生效   
 sudo vim /etc/profile

 export PATH=$PATH:/usr/local/mysql/bin   給 mysql 添加 path環境變量  相似於windows 中 
 此電腦->右鍵屬性->高級系統設置->環境變量 ->系統環境變量->path 
 
  source /etc/profile 讓配置文件當即生效 
2.對登陸的用戶有效  
   sudo vim /root/.bashrc 
   	 export PATH=$PATH:/usr/local/mysql/bin  
   sudo source /root/.bashrc 

```

## shell編程   

> 命令解釋器  將用戶輸入的命令 解釋給 操做系統內核 

### 執行命令的方式  

1.交互式   用戶輸入一條命令  好比 rm -rf  /* 

2.批處理式的  

​	將多個命令聚集成一個腳本  一次將此次命令執行完畢  

```
#!/bin/bash 
	which ls 
	cd /usr/local/nginx 
	mv test.txt /tmp/
```





### 腳本批處理式  

需求: 若是實線某個需求  同時2個或者三個服務啓動   

nginx   

mysql

apache2 

test start   實線下面三個所有啓動 重啓 中止

service nginx restart|start|stop

service  mysql start|restart|stop

service apahce2 start|restart|stop 

```shell
#!/bin/bash 

if [ $1 == "start" ]
then
service nginx start
service mysql start
service apache2 start
fi

if [ $1 == "stop" ]
then
service nginx stop
service mysql stop
service apache2 stop
fi

if [ $1 == "restart" ]
then
service nginx restart
service mysql restart
service apache2 restart
fi
```



> 開頭必須是  #!/bin/bash 
>
> 後綴名 通常 是以 .sh 
>
> 腳本要有執行權限   chmod  +x 腳本.sh 
>
> ./腳本.sh  運行       ./  
>
> /etc/init.d/test.sh   絕對執行  

```shell
#是shell腳本中的註釋 第一行比較特殊

#!/bin/bash 

cd /
ls -al 

:wq!


chmod +x 1.sh  

./1.sh 
/tmp/1.sh 
```

## shell 變量  

> 局部變量   只能在當前shell中運行 
>
> 全局變量 應用於整個系統  通常大寫  

```
#!/bin/bash 

設置局部變量 
a=10 等號兩邊不能留空格
b=$a
顯示局部變量 
echo $a    10
echo ${b}  10 
echo "a=$a" a=10 雙引號解析變量 

銷燬變量 
unset a #這時候不要加$


b=`date` 將系統命令結果賦值給一個變量   命令用`` 包起來   
```



位置變量    

```
$0 表示的是腳本的名稱 
$1~$9 傳遞給腳本的參數   
```

## 特殊變量    

```
$# 表示傳遞給腳本的參數個數
$* 傳遞給腳本的全部參數
$? 表示命令的返回值  0表示成功   

```

### 常量

```
readonly a=10 
echo $a 

a='66'
echo $a  #報錯  表示  a 是常量 不能修改  
```

### 引號

>雙引號解析變量 
>
>單引號不解析變量 不解析轉移字符 
>
>`` 可以輸出命令的結果  
>
>特殊字符 反斜線轉義  
>
>& * ?^      
>
>
>
>\  轉義字符   

### 字符串   

```
計算字符串的長度  
	#!/bin/bash
	test='123456abc'  ${#字符串的名字}
	echo ${#test}

提取字符串  
	${字符串的名字:開始的位置:截取的長度}

    echo ${test:3:5} 456ab
```

### 數組  

``` 
a=(1 2 3)  #聲明一個數組  元素之間 用空格隔開  
獲取數組的元素  #{a[0]} 1 
獲取數組的長度 echo ${#a[@]} echo ${#a[*]}  
```

## seq  

```
seq 5-10  生成5-10之間的連續整數   

```

## 運算  

#### 數學運算  

```
a=100
echo $[$a+10]
echo $[$a-5]
echo $[$a/2]
echo $[$a*2]
echo $[$a%2]
~             

echo $((5+10))
echo $((10/2))
echo $((10/3)) 3  整除 餘數忽略掉了 

```

## 邏輯運算  

&& 

```
if [ $a != 100 && $b ==100 ]

```



|| 

```
if [ $a != 100 || $b ==100 ]
```



## 關係運算符

| 運算符     | 說明          |
| ---------- | ------------- |
| -eq     == | a -eq b  相等 |
| -ne    !=  | a -ne b       |
| -gt    >   | a -gt b       |
| -lt    <   | a -lt b       |
| -ge  >=    |               |
| -le   <=   |               |
|            |               |
|            |               |

## 字符串判斷   

| 運算符 | 說明                               |
| ------ | ---------------------------------- |
| =      | 字符串是否相等                     |
| !=     | 不等                               |
| -z     | 字符串的長度是否爲0 爲0返回true    |
| -n     | 字符串的長度是否爲0 不爲0返回true  |
| str    | 檢測字符串是否爲空  不爲空返回true |
|        |                                    |
|        |                                    |

## 文件的判斷  

| 運算符   | 說明                                       |
| -------- | ------------------------------------------ |
| -d 文件  | 檢測是不是目錄 是返回true                  |
| -f  文件 | 檢測是不是普通文件  (不是目錄不是設備 )  |
| -r 文件  | 檢測文件是否只讀                           |
| -w 文件  | 檢測文件是否可寫                           |
| -x 文件  | 是否可執行                                 |
| -s  文件 | 檢測文件是否爲空 也就是說文件的大小是否爲0 |
| -e  文件 | 檢測文件是否存在  存在返回true             |

### 分支語句  

#### if-else 

```
#!/bin/bash 

read -p '請輸入您的分數:' score
if [ $score -gt 80 ] 中括號先後有空格  
then 
   echo '優秀'
else 
   echo '通常'
fi

if [ $score -gt 80 ];then 
   echo '優秀'
else 
   echo '通常'
fi
```

  



#### case  

```
case $變量名 in    
模式1)
命令1
;;
模式2)
命令2
;;
默認執行的命令
;;
esac  

switch(){
    case 1:
    
    default
}
```



```
#!/bin/bash 

case $1 in
start| begin)
echo 'start'
;;
stop | end)
echo 'stop'
;;
*)
echo 'i dont know'
esac 


./2.sh start  
```



## 循環語句  

```
for 變量 in 列表 
do
   命令1
   命令2
done 

for i in 1 2 3 4 5;do
   echo $i
done

//從命令中讀取值   
for j in `cat 1.txt`;do
   echo $j
done

讀取目錄列表  

for file in /home/*;do
	echo $file
done 

求1-100的和  
for x in `seq 1 100`;do
        let sum+=$x

done
        echo $sum  
        
遍歷數組  
a=(1 2 3 4 5 6)
for i in ${a[*]};do
echo $i
done


```

## while  

```
while 條件 
do	
	命令
done


sum=0
i=0
while [ $i -lt 100 ];
do
    let sum+=$i
    let i+=1
done
    echo $sum

```



## 函數  

```
先定義 後使用  

test(){
    echo 'hello world'
}

test
```





切換yum 源頭 

```
1.cd /etc/apt  
準備  兩個source.list  一個是公司的  一個是阿里雲
```



```shell
#!/bin/bash 
rm -rf /etc/apt/source.list
read -p '請選擇內網仍是阿里雲(1 內網 2 阿里雲):' network

if [ $newwork -eq 1 ];then
   echo '你選擇了內網'
   cp -r /tmp/source.list /etc/apt/
else
   echo '你選擇了阿里雲'
    cp -r /tmp/aliyun/source.list /etc/apt/
 fi
 
 sudo apt-get update 
 sudo apt-get upgrade 
```

```
chmod +x 腳本名稱.sh 
```



### 遠程登陸  公鑰加密 私鑰解密     

```
ssh 用戶名@ip地址  
exit 退出遠程登陸   

創建兩臺主機之間的信任關係 
1.10.8.152.117 
2.10.8.152.95 

 第一步: 在 95上  
 ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_j_rsa 能夠本身起名字防止覆蓋掉原來的密鑰  英文狀態下寫  
Enter passphrase (empty for no passphrase):   回車
Enter same passphrase again:  回車  

cat id_j_rsa.pub   
   複製內容  注意 別複製多 也別複製少  
第二步 : 
	在 117 上  
	mkdir -p /root/.ssh  
	cd /root/.ssh 
	vim authorized_keys
	粘貼第一步複製的內容    
	保存   
	
	chmod 600 /root/.ssh/authorized_keys  這一步至關重要   
	
第三步: 在95上  ssh@10.8.152.117 這個時候就不須要輸入密碼  	
	
```

## 遠程複製 

```
scp -r 源地址  目標地址  
scp text.txt root@10.8.152.117:/tmp  將本機的文件 複製到 目標主機的tmp目錄下面 
scp root@10.8.152.117:/root/text.txt /tmp
scp -r root@10.8.152.117:/root/www /tmp 將遠程
```

### screen   

```
sudo apt-get install screen    

screen -S 本身命名 
執行任務   

ctrl+a+d 退出會話 回到主窗口  

screen -r 窗口名字   進入指定的子窗口    

screen -X -S 窗口名  quit   結束指定的 子窗口 任務   
```





### 磁盤管理  

```
HDD 機械硬盤 
HHD 混合硬盤
SDD 固態硬盤


文件系統類型 
windows ntfs fat32 fat16 exfat 
Linux  ext4 ext3 ext2 
```

### 查看磁盤的使用狀況 df  

```
第一塊磁盤 sda 
第二塊就是 sdb
第三塊     sdc

df -h 以最佳閱讀體驗閱讀磁盤的使用狀況  
df  -k 以k爲單位
df -m 以m爲單位

df -h /dev/sda2  
```

## 查看文件 及目錄對空間的使用狀況 du    

```
du -a 顯示全部文件目錄大小   包括隱藏文件  
du -h 最佳閱讀體驗閱讀
du -s 只顯示目錄大小 不顯示子目錄和文件的大小  
du -c 顯示目錄及文件的大小  並顯示總大小 
```

## 磁盤分區 fdisk  先分區 再格式化 而後掛載    

```
fdisk -l 查看磁盤的分區狀況  

發現多了一個 /dev/sdb   

fdisk /dev/sdb   
	m 幫助  
	n 新建一個分區 
	d 刪除一個分區
	w 保存 
	q 退出 

新建一個分區  
	新建主分區 primary  而後  extends 擴展分區  
	n -p-默認回車-默認回車-+8G-w 


格式化  
	fdisk -l 發現多了一個 /dev/sdb1  

	mke2fs -t ext4 /dev/sdb1 
	-t表示 制定文件系統類型   


掛載   
	mkdir -p /python1804
	mount -t ext4 /dev/sdb1 /python1804   臨時掛載  註銷 重啓 這個磁盤就沒了 
	df -h
	發現 多了一個/dev/sdb1 
取消掛載 
	umount /python1804/
	df -h 
	/dev/sdb1 就沒了  

永久掛載 
	vim /etc/fstab 
	/dev/sdb1       /python1804     ext4    defaults        0 0
	新磁盤			 掛載點 		文件系統類型  默認參數 	 0 是否須要備份 0不備份   0 是否開機檢查磁盤 0 不檢查  
	
	mount -a 讓掛載當即生效  
```



### 別名   

```
有的命令 加參數 很繁瑣 能夠根據團隊的要求  從新命名  爲了提升效率  

vim /root/.bashrc 
alias 新名字='命令 參數'
alias c='cd'

source /root/.bashrc #讓配置未見當即生效  


```
相關文章
相關標籤/搜索