linux脚本大全,shell大全
命令解析器——例如bash
是一個程序,可以解析shell命令
shell基本語法
變量
環境變量
敲命令“env”可以取出所有環境變量
環境變量可以當全局變量來使用
set命令可以輸出當前系統的全部環境變量以及函數
unset命令用于刪除一個環境變量
本地變量
自定義的變量——局限在某個腳本中使用
1、變量定義:
shell中的變量沒有數據類型 - 默認值都是string類型VAR=hello? or VAR=“hello”
注意事項:
定義shell變量的時候,建議變量名大寫
賦值的時候=前后不能有空格
2、一些命令實例
將一個命令執行之后的結果賦值給某個變量(下面兩種方式都可以)
var=`pwd`
var=$(pwd)
算術運算(只能在整型之間做算數運算)
var=9
var=$((var 10))
var=$[var 10]
用export命令可以把本地變量導出為環境變量
export VARNAME //只在當前終端中有效
export VARNAME=value
位置變量
$0 ????????-?? 相當于C語言main函數的argv[0]
$1、$2...相當于C語言main函數的argv[1]、argv[2]...
特殊變量
$#: 這個程序的參數個數
$*: 表示參數列表"$1" "$2" ...
$@:? 表示參數列表"$1" "$2" ...
$$: 這個程序的PID
$?: 執行上一個命令的返回值
注意!!!加上“”之后,$*和$@會發生變化!!!
for循環時候"$*" 將所有的參數作為一個整體
for循環時候"$@"有多少個參數被拆分成幾部分
命令代換
將執行完命令之后得到的數據保存到變量
VAR=`shell命令`
VAR=$(shell命令) -- 常用,推薦使用
算術代換
1、對變量取值
在變量的前邊加 $
$VAR
2、對變量做算術運算
算術運算: -*/
算術運算操作的必須是整數
VAR=$(($VAR*10))
VAR=$[$VAR-10]
3、進制運算
$[base#n] 數值按照幾進制進行運算
base - 進制
#連接符
n:數值
轉義字符
\
將有特殊意義的字符變成普通字符
將普通字符變成有特殊意義的字符 - 正則表達式中使用
單引號
VAR='$(date)'
單引號中的內容原樣輸出
雙引號
VAR="$(date)"
會繼續雙引號中的命令, 輸出結果字符串
條件測試
條件測試命令
下面兩種方式皆可
test
[ ]
比較test , [] , [[]]
test 和[是 bash 的內部命令
[[是 bash 程序語言的關鍵字!
絕大多數情況下,這個三個功能通用。但是命令和關鍵字總是有區別的。
區別:
在[[中使用&& 和||
[ 中使用-a和 -o表示邏輯與和邏輯或
如何判斷條件是否成立?
如果返回值為0: 成立
返回值為非0:??? 不成立
例子:
上圖中pwd執行成功了,因此返回值是0
文件狀態測試
linux中的文件種類: 7種
普通文件:?f
目錄: d
符號鏈接:l
套接字:s
管道:p
字符設備:c
塊設備:b
-b filename
當filename 存在并且是塊文件時返回真(返回0)
-c filename
當filename 存在并且是字符文件時返回真
-d pathname
當pathname 存在并且是一個目錄時返回真
-e pathname
當由pathname 指定的文件或目錄存在時返回真
-f filename
當filename 存在并且是正規(普通)文件時返回真
-g pathname
當由pathname 指定的文件或目錄存在并且設置了SGID 位時返回真
-h/-L filename
當filename 存在并且是符號鏈接文件時返回真 (或? filename)
-k pathname
當由pathname 指定的文件或目錄存在并且設置了"粘滯"位時返回真
-p filename
當filename 存在并且是命名管道時返回真
-r pathname
當由pathname 指定的文件或目錄存在并且可讀時返回真
-s filename
當filename 存在并且文件大小大于0 時返回真
-S filename
當filename 存在并且是socket 時返回真
-t fd
當fd 是與終端設備相關聯的文件描述符時返回真
-u pathname
當由pathname 指定的文件或目錄存在并且設置了SUID 位時返回真
-w pathname
當由pathname 指定的文件或目錄存在并且可寫時返回真
-x pathname
當由pathname 指定的文件或目錄存在并且可執行時返回真
-O pathname
當由pathname 存在并且被當前進程的有效用戶id 的用戶擁有時返回真(字母O 大寫)
-G pathname
當由pathname 存在并且屬于當前進程的有效用戶id 的用戶的用戶組時返回真
file1 -nt file2
file1 比file2 新時返回真
file1 -ot file2
file1 比file2 舊時返回真
f1 -ef f2
files f1 and f2 are hard links to the same file
例如,測試文件filename是否為目錄文件
常見字符串測試
-z string
字符串string 為空串(長度為0)時返回真
-n string
字符串string 為非空串時返回真
str1 = str2
字符串str1 和字符串str2 相等時返回真
str1 == str2
同 =
str1 != str2
字符串str1 和字符串str2 不相等時返回真
常見的數值測試
==——eq —— equal
!=——ne—— not equal
>——gt??—— greater than
>=——ge——greater than equal
<=—— le—— less than equal
nt1 -eq int2
如果int1 等于int2,則返回真
int1 -ne int2
如果int1 不等于int2,則返回真
int1 -lt int2
如果int1 小于int2,則返回真
int1 -le int2
如果int1 小于等于int2,則返回真
int1 -gt int2
如果int1 大于int2,則返回真
int1 -ge int2
如果int1 大于等于int2,則返回真
測試時使用的邏輯操作符
a - &&? : and
o - ||: or
取反:!-a
邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o
邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
!
邏輯否,條件為假,結果為真。
shell腳本語法 - 分支
if/then/elif/else/fi
語法格式
if [ 條件判斷語句 ];then
處理語句
處理語句
elif [ 條件判斷語句 ]
then
處理語句
處理語句
else
處理語句
處理語句
fi
:——是一個特殊的命令,稱為空命令
該命令不做任何事,但Exit Status總是真。
if :; then
xxxx
fi
case/esac
基本語法
case 變量 in
yes|Yes|y|Y)
處理語句
處理語句
;;
No|no|n|N)
處理語句
處理語句
;;
*)
處理語句
;;
esac
*類似于default
case類似于switch
::類似于break
例子
a.sh
./a.sh aa
VAR=$1
case VAR in
a*|AA|a|A)
echo "a"
;;
b|bb|BB)
echo b
;;
*)
echo "hello"
;;
esac
shell腳本語法 - 循環
for/do/done
語法格式
for 變量 in list(列表);do
控制語句
控制語句
done
例子(下面兩個for循環的結果相同)
for VAR in $(ls) ;do
echo $VAR
done
for VAR in `ls` ;do
echo $VAR
done
while/do/done
語法格式
while [ 條件測試語句 ];do
控制語句
控制語句
done
例子——輸入三次密碼,三次錯誤退出程序
PWD=world
count=1
echo "請輸入密碼"
read TMP
while [ $TMP != $pwd -a $count le 3 ];do
echo "密碼錯誤,請重新輸入"
read TMP
count=$[count 1]
do
break和continue
break 可以選擇跳出的層數
break n
輸入和輸出
echo
echo 字符串
-e: 解析字符串中的\n字符
-n:去掉echo默認加上的換行符
例子:
文件重定向
cmd > file
file - 文件名
cmd >> file
內容追加到file文件中
例子——將指令cmd的標準輸出(1)重定向到file,標準錯誤(2)重定向到標準輸出(1)——標準輸出和標準錯誤都寫入file文件中
cmd > file 2>&1
#等價于
cmd 1 > file 2 > &1
1前面加&代表1是文件描述符,不加&,則1代表一個文件
awk
處理行和列,主要用于列的處理
1、awk缺省的行分隔符是換行
2、缺省的列分隔符是連續的空格和Tab
3、如何取出每一列
$0: 當前行,還沒有拆分
$1: 第一列
$2: 第二列
。。。。。
4、如果不是缺省分隔符的如何指定分隔符
-F后邊跟的就是指定的分隔符
5、例子——拆分/etc/passwd,找到每個用戶對應的家目錄
awk -F: '{print $6}' /etc/passwd
一般格式
awk 參數 '/pattern/{actions}' 目標文件
awk 參數 'condition{actions}' 目標文件
awk 參數 腳本文件 目標文件
condition -- 條件
pattern -- 正則表達式
actions -- 匹配成功后的一系列操作
例子——找出以g開頭的字符串的第三列
awk -F/ '/^g/{print $3}' test
如何定義變量
需要變量直接寫即可,默認值0
定義變量的時候直接指定一個初始值——利用“-v”設定初始值awk -v x=10 '條件/正則表達式{action} ' 文件名
練習:從ps aux得到的數據中找出pid>1000 && pid <2000的進程的個數
第一步——找出所有進程號在1000到2000之間的進程
ps -aux | awk '$2>1000 && $2<2000{print $2}'
第二步,設置變量x(x的默認值為0),用于記錄當前符合條件的進程號是第幾個符合條件的
ps -aux | awk '$2>1000 && $2<2000{print $2; x=x 1; print x}'
第三步,添加條件END(END——代表遍歷結束)
ps -aux | awk '$2>1000 && $2<2000{x=x 1}END{print x}'
shell腳本例子一
#!/bin/bash
# 關閉tracker 和 storage服務
#shell腳本沒有返回值,沒有參數,但是可以傳參
tracker_start()
{
#查找名為fdfs_trackerd的進程; grep -v grep的意思是過濾掉grep進程
#> /dev/null重定向到垃圾回收站,扔進去之后,輸出就沒有了
ps aux | grep fdfs_trackerd | grep -v grep > /dev/null
#如果查到了該進程,則$?的值是0
if [ $? -eq 0 ];then
echo "fdfs_trackerd 已經在運行中, 無需啟動..."
else
#說明該進程沒有被啟動
sudo fdfs_trackerd /etc/fdfs/tracker.conf
if [ $? -ne 0 ];then
echo "tracker start failed ..."
else
echo "tracker start success ..."
fi
fi
}
storage_start()
{
ps aux | grep fdfs_storaged | grep -v grep > /dev/null
if [ $? -eq 0 ];then
echo "fdfs_storaged 已經在運行中, 無需啟動..."
else
sudo fdfs_storaged /etc/fdfs/storage.conf
if [ $? -ne 0 ];then
echo "storage start failed ..."
else
echo "storage start success ..."
fi
fi
}
#如果沒傳入參數
if [ $# -eq 0 ];then
echo "Operation:"
echo " start storage please input argument: storage"
echo " start tracker please input argument: tracker"
echo " start storage && tracker please input argument: all"
echo " stop storage && tracker input argument: stop"
exit 0
fi
case $1 in
storage)
storage_start
;;
tracker)
#調用shell函數tracker_start
tracker_start
;;
all)
storage_start
tracker_start
;;
stop)
sudo fdfs_trackerd /etc/fdfs/tracker.conf stop
sudo fdfs_storaged /etc/fdfs/storage.conf stop
;;
*)
echo "nothing ......"
esac
get技能
1、grep -v grep ? ——過濾掉grep
2、> /dev/null——將輸出扔掉
shell腳本例子二
#!/bin/bash
#定義變量
START=1
STOP=1
case $1 in
start)
START=1
STOP=0
;;
stop)
START=0
STOP=1
;;
"")
STOP=1
START=1
;;
*)
STOP=0
START=0
;;
esac
# **************************** 殺死正在運行的CGI進程 ****************************
if [ "$STOP" -eq 1 ];then
# 登錄
kill -9 $(ps aux | grep "./bin_cgi/login" | grep -v grep | awk '{print $2}') > /dev/null 2>&1
echo "CGI 程序已經成功關閉, bye-bye ..."
fi
# ******************************* 重新啟動CGI進程 *******************************
if [ "$START" -eq 1 ];then
# 登錄 -n代表不加換行
echo -n "登錄:"
spawn-fcgi -a 127.0.0.1 -p 10000 -f ./bin_cgi/login
echo "CGI 程序已經成功啟動 ^_^..."
fi
get技能
1、> /dev/null 2>&1——將標準輸出和標準錯誤全都扔掉
2、 echo-n——不加換行
shell腳本例子三
#!/bin/bash
NAME=redis
FILE=redis.pid
# 判斷redis目錄是否存在, 如果不存在則創建
is_directory()
{
#如果傳入的第一個參數不是目錄
if [ ! -d $1 ]; then
echo "$1 目錄創建中..."
mkdir $1
if [ $? -ne 0 ];then
echo "$1 目錄創建失敗, ~~~~(>_
exit 1
fi
fi
}
# 判斷redis目錄是否存在, 如果不存在則創建
is_regfile()
{
if [ ! -f $1 ]; then
#statements
echo "$1 file not exist..."
return 1
fi
return 0
}
# 根據參數設置redis狀態
#提示用戶需要傳入參數
if [[ $1 = "" ]];then
echo "please input argument:"
echo " start: start redis server"
echo " stop: stop redis server"
echo " status: show the redis server status"
exit 1
fi
# 函數調用,函數傳入的參數是$NAME
is_directory $NAME
case $1 in
start)
# 判斷 redis-server 進程是否已經啟動...
ps aux | grep "redis-server" | grep -v grep > /dev/null
if [ $? -eq 0 ];then
echo "Redis server is runing ..."
else
# 刪除$FILE 文件
unlink "$NAME/$FILE"
echo "Redis starting ..."
redis-server ./conf/redis.conf
if [ $? -eq 0 ];then
echo "Redis server start success!!!"
# 休眠1s, 等待pid文件被創建出來, 再進行后續判斷
sleep 1
if is_regfile "$NAME/$FILE";then
# printf是一個命令,用于在中斷進行輸出
printf "****** Redis server PID: [ %s ] ******\n" $(cat "$NAME/$FILE")
printf "****** Redis server PORT: [ %s ] ******\n" $(awk '/^port /{print $2}' "./conf/redis.conf")
fi
fi
fi
;;
stop)
# 判斷 redis-server 進程是否已經啟動...
ps aux | grep "redis-server" | grep -v grep > /dev/null
if [ $? -ne 0 ];then
echo "Redis server is not runing..."
exit 1
fi
echo "Redis stopping ..."
# 判斷pid文件是否存在
#調用函數is_regfile,傳入的參數羅列在函數調用的后面,即$NAME/$FILE
if is_regfile "$NAME/$FILE"; then
# 讀進程文件
echo "### 通過 redis.pid文件 方式關閉進程 ###"
PID=$(cat "$NAME/$FILE")
else
# 查找進程ID
echo "### 通過 查找進程ID 方式關閉進程 ###"
PID=$(ps aux | grep "redis-server" | grep -v grep | awk '{print $2}')
fi
echo Redis server pid = $PID
kill -9 $PID
if [ $? -ne 0 ]; then
echo "Redis server stop fail ..."
else
echo "Redis server stop success!!!"
fi
;;
status)
ps aux | grep "redis-server" | grep -v grep > /dev/null
if [ $? -eq 0 ];then
echo "Redis server is running..."
else
echo "Redis server is not running ..."
fi
;;
*)
echo "do nothing ..."
;;
esac
來源:http://www.icode9.com/content-3-123051.html
總結
以上是生活随笔為你收集整理的linux脚本大全,shell大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3122 分披萨(二分查找)
- 下一篇: tcp长连接和短连接的区别_TCP --