[TOC]
* exit被用來結束一個腳本, 就像在C語言中一樣. 它也返回一個值, 并且這個值會傳遞給腳本的父進程, 父進程會使用這個值做下一步的處理.
### 1. 遠程執行命令
* * * * *
1. `ssh ssh -t -p $port $user@$ip 'cmd'`
-t:提供一個遠程服務器的虛擬tty終端
~~~
port #遠程主機端口
user #遠程登錄用戶
ip #遠程登錄IP
cmd # Linux命令
~~~
2. expect 交互
~~~
#!/usr/bin/expect -f
set ipaddress [lindex $argv 0]
set port [lindex $argv 1]
set username [lindex $argv 2]
set passwd [lindex $argv 3]
set cmd [lindex\ $argv 4]
set timeout 600
spawn ssh $ipaddress -p$port -l$username
expect {
“yes/no” { send “yes\r”;
exp_continue }
“assword:” { send “$passwd\r” }
}
expect -re “~]($|#)”
send “$cmd \r”
expect -re “~($|#)”
send “$cmd \r”
expect -re “~]($|#)”
send “exit\r”
~~~
./remote-cp.sh 192.168.1.158 22 aixin aixin "`ifconfig` "
* * * * *
### 2.獲取命令輸出數據
~~~
set `cmd` #保存了命令的輸出數據(命令輸出一般以空格分割)
echo $2 # 打印第二個位置的輸出
~~~

### 3.變量替換
~~~
#!/bin/bash
username0=
echo "username0 has been declared, but is set to null."
echo "username0 = ${username0:-`whoami`}" # “-”相當于“=”
~~~
輸出

* * * * *
### 4.控制結構
#### 4.1 if else
if condition
then : # 什么都不做,引出分支.
else
take-some-action
fi
* * * * *
### 5.測試符
#### 5.1文件測試符
~~~
* -e
文件存在
* -a
文件存在,這個選項的效果與-e相同. 但是它已經被"棄用"了, 并且不鼓勵使用.
* -f
如果文件存在且可讀為真
* -s
文件大小不為零
* -d
表示這否是一個目錄
* -z 判斷變量是否沒有值,沒有值為真返回0
* -b
表示這是一個塊設備(軟盤, 光驅, 等等.)
* -c
表示這是一個字符設備(鍵盤, modem, 聲卡, 等等.)
* -p
這個文件是一個管道
* -h
這是一個符號鏈接,當文件存在且是一個軟鏈接時,判斷的結果是True
* -L
這是一個符號鏈接
* -S
表示這是一個socket
* -t
文件(描述符)被關聯到一個終端設備上,這個測試選項一般被用來檢測腳本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否來自于一個終端.
* -r
文件是否具有可讀權限(指的是正在運行這個測試命令的用戶是否具有讀權限)
* -w
文件是否具有可寫權限(指的是正在運行這個測試命令的用戶是否具有寫權限)
* -x
文件是否具有可執行權限(指的是正在運行這個測試命令的用戶是否具有可執行權限)
* -g
set-group-id(sgid)標記被設置到文件或目錄上,如果目錄具有sgid標記的話, 那么在這個目錄下所創建的文件將屬于擁有這個目錄的用戶組, 而不必是創建這個文件的用戶組. 這個特性對于在一個工作組中共享目錄非常有用.
* -u
set-user-id (suid)標記被設置到文件上,如果一個root用戶所擁有的二進制可執行文件設置了set-user-id標記位的話, 那么普通用戶也會以root權限來運行這個文件. [1] 這對于需要訪問系統硬件的執行程序(比如pppd和cdrecord)非常有用. 如果沒有suid標志的話, 這些二進制執行程序是不能夠被非root用戶調用的.對于設置了suid標志的文件, 在它的權限列中將會以s表示.其實這個權限在最初說文件權限的文章中已經說過了,比較特殊的一種權限
* -n 字符串不為空,且長度大于零
* -k
設置粘貼位,對于"粘貼位"的一般了解, save-text-mode標志是一個文件權限的特殊類型. 如果文件設置了這個標志, 那么這個文件將會被保存到緩存中, 這樣可以提高訪問速度. [2] 粘貼位如果設置在目錄中, 那么它將限制寫權限. 對于設置了粘貼位的文件或目錄, 在它們的權限標記列中將會顯示t.
* -O
判斷你是否是文件的擁有者
* -G
文件的group-id是否與你的相同
* -N
從文件上一次被讀取到現在為止, 文件是否被修改過
* f1 -nt f2
文件f1比文件f2新
* f1 -ot f2
文件f1比文件f2舊
* f1 -ef f2
文件f1和文件f2是相同文件的硬鏈接
* !
"非" -- 反轉上邊所有測試的結果(如果沒給出條件, 那么返回真).
~~~
~~~
$$
Shell本身的PID(ProcessID)
$!
Shell最后運行的后臺Process的PID
$?
最后運行的命令的結束代碼(返回值)
$-
使用Set命令設定的Flag一覽
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$#
添加到Shell的參數個數
$0
Shell本身的文件名
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
~~~
* *表示配置任意字符
* ?表示匹配任意單個字符
* [...]用來匹配任意字符
* [!...]用來匹配非后面這個字符
~~~
[0-9]匹配0到9任意單個數字
[!0-9]匹配不是0到9任意單個數字
~~~
### 6.set -o shell特性開啟
~~~
set -x # 腳本開啟調試
unset # 于刪除已定義的shell變量(包括環境變量)和shell函數。
~~~


### 7. 讀取腳本路徑
> readlink命令用來獲取一個軟鏈接指向的目的路徑。
當一個軟鏈接指向的是一個另外的軟鏈接,而另外一個軟鏈接又指向其他的目標。 這時可以使用-f選項直接獲取最終的非軟鏈接的目標。
~~~
#/bin/bash
path=$(dirname $(readlink -f "$0"))
echo $path
~~~
## 8. 大小比較
~~~
-eq //等于
-ne //不等于
-gt //大于
-lt //小于
ge //大于等于
le //小于等于
~~~
- Docker
- 什么是docker
- Docker安裝、組件啟動
- docker網絡
- docker命令
- docker swarm
- dockerfile
- mesos
- 運維
- Linux
- Linux基礎
- Linux常用命令_1
- Linux常用命令_2
- ip命令
- 什么是Linux
- SELinux
- Linux GCC編譯警告:Clock skew detected. 錯誤解決辦法
- 文件描述符
- find
- 資源統計
- LVM
- Linux相關配置
- 服務自啟動
- 服務器安全
- 字符集
- shell腳本
- shell命令
- 實用腳本
- shell 數組
- 循環與判斷
- 系統級別進程開啟和停止
- 函數
- java調用shell腳本
- 發送郵件
- Linux網絡配置
- Ubuntu
- Ubuntu發送郵件
- 更換apt-get源
- centos
- 防火墻
- 虛擬機下配置網絡
- yum重新安裝
- 安裝mysql5.7
- 配置本地yum源
- 安裝telnet
- 忘記root密碼
- rsync+ crontab
- Zabbix
- Zabbix監控
- Zabbix安裝
- 自動報警
- 自動發現主機
- 監控MySQL
- 安裝PHP常見錯誤
- 基于nginx安裝zabbix
- 監控Tomcat
- 監控redis
- web監控
- 監控進程和端口號
- zabbix自定義監控
- 觸發器函數
- zabbix監控mysql主從同步狀態
- Jenkins
- 安裝Jenkins
- jenkins+svn+maven
- jenkins執行shell腳本
- 參數化構建
- maven區分環境打包
- jenkins使用注意事項
- nginx
- nginx認證功能
- ubuntu下編譯安裝Nginx
- 編譯安裝
- Nginx搭建本地yum源
- 文件共享
- Haproxy
- 初識Haproxy
- haproxy安裝
- haproxy配置
- virtualbox
- virtualbox 復制新的虛擬機
- ubuntu下vitrualbox安裝redhat
- centos配置雙網卡
- 配置存儲
- Windows
- Windows安裝curl
- VMware vSphere
- 磁盤管理
- 增加磁盤
- gitlab
- 安裝
- tomcat
- Squid
- bigdata
- FastDFS
- FastFDS基礎
- FastFDS安裝及簡單實用
- api介紹
- 數據存儲
- FastDFS防盜鏈
- python腳本
- ELK
- logstash
- 安裝使用
- kibana
- 安準配置
- elasticsearch
- elasticsearch基礎_1
- elasticsearch基礎_2
- 安裝
- 操作
- java api
- 中文分詞器
- term vector
- 并發控制
- 對text字段排序
- 倒排和正排索引
- 自定義分詞器
- 自定義dynamic策略
- 進階練習
- 共享鎖和排它鎖
- nested object
- 父子關系模型
- 高亮
- 搜索提示
- Redis
- redis部署
- redis基礎
- redis運維
- redis-cluster的使用
- redis哨兵
- redis腳本備份還原
- rabbitMQ
- rabbitMQ安裝使用
- rpc
- RocketMQ
- 架構概念
- 安裝
- 實例
- 好文引用
- 知乎
- ACK
- postgresql
- 存儲過程
- 編程語言
- 計算機網絡
- 基礎_01
- tcp/ip
- http轉https
- Let's Encrypt免費ssl證書(基于haproxy負載)
- what's the http?
- 網關
- 網絡IO
- http
- 無狀態網絡協議
- Python
- python基礎
- 基礎數據類型
- String
- List
- 遍歷
- Python基礎_01
- python基礎_02
- python基礎03
- python基礎_04
- python基礎_05
- 函數
- 網絡編程
- 系統編程
- 類
- Python正則表達式
- pymysql
- java調用python腳本
- python操作fastdfs
- 模塊導入和sys.path
- 編碼
- 安裝pip
- python進階
- python之setup.py構建工具
- 模塊動態導入
- 內置函數
- 內置變量
- path
- python模塊
- 內置模塊_01
- 內置模塊_02
- log模塊
- collections
- Twisted
- Twisted基礎
- 異步編程初探與reactor模式
- yield-inlineCallbacks
- 系統編程
- 爬蟲
- urllib
- xpath
- scrapy
- 爬蟲基礎
- 爬蟲種類
- 入門基礎
- Rules
- 反反爬蟲策略
- 模擬登陸
- problem
- 分布式爬蟲
- 快代理整站爬取
- 與es整合
- 爬取APP數據
- 爬蟲部署
- collection for ban of web
- crawlstyle
- API
- 多次請求
- 向調度器發送請求
- 源碼學習
- LinkExtractor源碼分析
- 構建工具-setup.py
- selenium
- 基礎01
- 與scrapy整合
- Django
- Django開發入門
- Django與MySQL
- java
- 設計模式
- 單例模式
- 工廠模式
- java基礎
- java位移
- java反射
- base64
- java內部類
- java高級
- 多線程
- springmvc-restful
- pfx數字證書
- 生成二維碼
- 項目中使用log4j
- 自定義注解
- java發送post請求
- Date時間操作
- spring
- 基礎
- spring事務控制
- springMVC
- 注解
- 參數綁定
- springmvc+spring+mybatis+dubbo
- MVC模型
- SpringBoot
- java配置入門
- SpringBoot基礎入門
- SpringBoot web
- 整合
- SpringBoot注解
- shiro權限控制
- CommandLineRunner
- mybatis
- 靜態資源
- SSM整合
- Aware
- Spring API使用
- Aware接口
- mybatis
- 入門
- mybatis屬性自動映射、掃描
- 問題
- @Param 注解在Mybatis中的使用 以及傳遞參數的三種方式
- mybatis-SQL
- 逆向生成dao、model層代碼
- 反向工程中Example的使用
- 自增id回顯
- SqlSessionDaoSupport
- invalid bound statement(not found)
- 脈絡
- beetl
- beetl是什么
- 與SpringBoot整合
- shiro
- 什么是shiro
- springboot+shrio+mybatis
- 攔截url
- 枚舉
- 圖片操作
- restful
- java項目中日志處理
- JSON
- 文件工具類
- KeyTool生成證書
- 兼容性問題
- 開發規范
- 工具類開發規范
- 壓縮圖片
- 異常處理
- web
- JavaScript
- 基礎語法
- 創建對象
- BOM
- window對象
- DOM
- 閉包
- form提交-文件上傳
- td中內容過長
- 問題1
- js高級
- js文件操作
- 函數_01
- session
- jQuery
- 函數01
- data()
- siblings
- index()與eq()
- select2
- 動態樣式
- bootstrap
- 表單驗證
- 表格
- MUI
- HTML
- iframe
- label標簽
- 規范編程
- layer
- sss
- 微信小程序
- 基礎知識
- 實踐
- 自定義組件
- 修改自定義組件的樣式
- 基礎概念
- appid
- 跳轉
- 小程序發送ajax
- 微信小程序上下拉刷新
- if
- 工具
- idea
- Git
- maven
- svn
- Netty
- 基礎概念
- Handler
- SimpleChannelInboundHandler 與 ChannelInboundHandler
- 網絡編程
- 網絡I/O
- database
- oracle
- 游標
- PLSQL Developer
- mysql
- MySQL基準測試
- mysql備份
- mysql主從不同步
- mysql安裝
- mysql函數大全
- SQL語句
- 修改配置
- 關鍵字
- 主從搭建
- centos下用rpm包安裝mysql
- 常用sql
- information_scheme數據庫
- 值得學的博客
- mysql學習
- 運維
- mysql權限
- 配置信息
- 好文mark
- jsp
- jsp EL表達式
- C
- test