## 環境變量 ## 全局變量 ``` 常見的全局環境變量 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 #讓配置未見當即生效 ```