shell shell是一個命令解釋器,實際是一個程式,/bin/bash,linux中所有的命令都由它來解釋,有自己的語法 shell腳本 以.sh結尾 shell語法+linux命令 註釋: 單行註釋 : # 多行註釋 : :<<c c shell執行方式 bash /path/to/scrip ...
shell
shell是一個命令解釋器,實際是一個程式,/bin/bash,linux中所有的命令都由它來解釋,有自己的語法
shell腳本
以.sh結尾
shell語法+linux命令
註釋:
單行註釋 :
#
多行註釋 :
:<<c c
shell執行方式
bash /path/to/script-name 或 /bin/bash /path/to/script-name (強烈推薦使用)
/path/to/script-name 或 ./script-name (當前路徑下執行腳本)
source script-name 或 . script-name (註意“.“點號後面有空格)
前兩種執行時,都會開啟新的進程執行腳本
source不會開啟新的進程
使用source時,可以與當前終端共用進程,共用變數(重點)
變數
1、name=itcast
2、name='itcast
$age' 不會解析裡面的遍歷
3、name=”itcast
$age“ 解析變數後,再拼接成新的字元串
命令變數
1、name=`ls`
2、name=$(ls)
括弧里必須是linux命令,把命令執行的結果記錄給變數
全局變數
方法一:
變數名=值
export 變數
方法二:(最常用)
export 變數名=值
如果是在終端中定義全局變數,作用範圍是當前終端及子進程
如果想要自己定義的全局變數在跟系統的全局變數一樣在所有環境都有效,需要在~/.bashrc或/etc/profile文件中定義:
修改~/.bashrc後,直接打開新的終端,定義的全局變數就生效了,此方式只對當前用戶有效
修改/etc/profile時,需要重啟操作系統,定義的全局變數才生效,此方式對所有用戶有效
上面兩種方式在修改文件後,如果想讓全局變數在當前終端生效,需要執行命令source ~/.bashrc或source /etc/profile
查看變數
標準使用方式:"${變數名}"
內置
$0 獲取當前執行的shell腳本文件名
$$ 獲取執行shell腳本的進程號
$n 獲取當前執行的shell腳本的第n個參數值,n=1..9,當n為0時表示腳本的文件名,如果n大於9就要用大括弧括起來${10}
$# 獲取當前shell命令行中參數的總個數
$? 獲取執行上一個指令的返回值(0為成功,非0為失敗)
$?:上一條命令是執行一個文件,返回的結果是文件中的最後一條命令
預設值
1、
變數a如果有內容,那麼就輸出a的變數值
變數a如果沒有內容,那麼就輸出預設的內容
格式:
${變數名:-預設值}
2、
無論變數a是否有內容,都輸出預設值
格式:
${變數名+預設值}
測試語句
等號左右必須有空格,中括弧左右必須有空格
test a = 1
[ a = 1 ]
邏輯表達式
&&符號
命令1
&& 命令2
如果命令1執行成功,那麼執行命令2
如果命令1執行失敗,那麼不執行命令2
||符號
命令1 || 命令2
1 如果命令1執行成功,那麼不執行命令2
2 如果命令1執行失敗,那麼執行命令2
文件表達式
判斷是否是可執行文件
[ -f abc ] && [ -x abc
]
計算表達式
a=$((a+1))
let a=a+1
重定向
命令>文件
命令返回的結果又正確和錯誤兩種,1代表正確,2代表錯誤
bash chongdingxiang.sh
>/dev/null 2>&1 &
把正確的和錯誤的結果都輸出到黑洞文件,而且命令在後臺執行
linux四劍客
grep
grep -nr 關鍵字 .
find
find . -name
"*sh"
sed
行編輯工具
-i 真正的修改
s:替換
a:追加
i:插入
d:刪除
sed -i "s#sed#SED#g"
sed.txt
每一行找到sed,把所有的替換為SED
sed -i
"2s#SED#sed#2" sed.txt
第二行的第二個SED替換為sed
sed -i "1,4a\hello2"
sed.txt
在1到4行的每一行後追加一行內容
sed -i "1i\hello3"
sed.txt
在第1行前插入一行
sed -i "2d" sed.txt
刪除第2行
awk
分析工具,按行處理
awk
'BEGIN{FS=":";OFS="--"} {print $2,$NF}' awk2.txt
預設按照空格或tab鍵拆分數據,通過OFS指定輸出時的分隔符
流程式控制制
if語句
if [ 條件
]
then
指令1
elif [ 條件2
]
then
指令2
else
指令3
fi
#!/bin/bash read -p "請輸入性別:" sex if [ "$sex" == "nan" ] then echo "輸入的是男" fi
case語句
#!/bin/bash case "$1" in "start") echo "啟動" ;; "stop") echo "停止" ;; "restart") echo "重啟" ;; *) echo "。。。。" ;; esac
for迴圈
遍歷文件夾
#!/bin/bash mkdir ../bak for file in $(ls) do # echo "file: $file" cp "$file" ../bak/"${file}-bak" done
seq命令
#!/bin/bash for num in $(seq 5) do echo "num: $num" done
while迴圈
#!/bin/bash count=1 while [ $count -lt 5 ] do echo "count: $count" let count=count+1 done
until迴圈
#!/bin/bash count=1 until [ $count -ge 5 ] do echo "count: $count" let count=count+1 done
函數
#!/bin/bash echo "jiaoben : $1,$2,$3" dayin(){ if [ $# = 3 ] then echo "hanshu : $1,$2,$3" else echo "需要3個參數" fi } #dayin e f g dayin $1 $2 $3
使用source執行腳本,腳本中定義的變數和函數都能在當前終端調用
讓root用戶能夠使用python虛擬環境
export
WORKON_HOME=/home/python/.virtualenvs/
source /usr/local/bin/virtualenvwrapper.sh