shell腳本

接收到的命令參數:

參數個數:
$#

參數值:
命令本身:$0
第一個參數:$1
第二個參數:$2
……

退出命令:
exit

echo命令:

換行:
echo

輸出後不換行:
echo -n "請選擇(y/n)?"

輸出後不換行,並把光標移到最左(以便下次輸出覆蓋當前行)
echo
-ne "$i\r"
利用轉義符號輸出雙引號:
echo "歡迎使用\"正式服務器\"部署工具。"

輸出中帶變量:
echo "即將部署項目:$project_name"

輸出帶轉義符的字符串:
echo -e "first\tsecond"

輸出到文件
追加到文件尾:echo -e $log_info >> deploy.log
覆蓋文件內容:echo -e $log_info > deploy.log

printf命令:

(可以代替echo,格式化輸出,和C語言中的printf函數功能相同)

輸出一個小數點後兩位的數,並換行:
printf "The number is %.2f.\n" 100

輸出一個指定寬度的字符串:
左對齊:printf "%-20s %-15s %10.2f\n" "Stephen" "Liu" 35

右對齊:printf "|%10s|\n" hello

變量:

定義: profile="production"

使用: echo $profile

變量拼接:
log_info="$log_info,$target_ip"

數組:

定義:servers=("192.168.0.31" "192.168.0.39")
projects=("public" "industry" "logistics" "misc")

獲得整個數組:
${projects[*]}

獲得數組元素個數:
${#servers[@]}

數學運算:

加:x=$(expr "$a" + "$b")減:x=$(($a - $b))乘:x=$(expr $a * $b)除:x= $(expr $a / $b)

if 語句(條件判斷同樣適用於while語句和for語句):

判斷一個變量(project)是否非空:
if [ $project ];then
echo "Variable \"project\" is null."
fi

判斷不等於:
if [ $# -ne 3 ];then
echo "命令行參數不是3個"
fi

注:數值大小判斷的一些命令:
gt:大於(greater than)
lt:小於(less than)
eq:等於(equal)
ne:不等於(not equal)
ge:大於等於(greater or equal)
le:小於等於 (less or equal)

布爾值判斷:
if [ "$is_ip_correct" = false ];then
echo "無效的ip地址,請使用下面ip之一:"
echo ${servers[*]}
exit
fi

字符串判斷:
是否相等:
if [ "$confirm" == "y" ] && [ "$confirm" != "n" ];do

do something...

fi

是否爲空(空返回true): if [-z $string ]
是否非空(非空返回true): if [ -n $string
]

正則表達式判斷
if [[ $1 =~ ^public|industry$ ]] && [[ $3 =~ ^[yn]$ ]];then

do something...

fi

if [[ ! $deploy_more =~ [yn] ]];then

do something...

fi

判斷文件是否存在:
if [ ! -f target/$project.war ];then

do something...

fi

判斷目錄是否存在:
if [ -d $2/webapps/$1 ];then

do something...

fi

判斷一個文件名(字符串)的後綴
backup_file="/backup/java_data/$1-$today.war"
backup_file="/backup/java_data/$1-$today.gz"

if [ "${backup_file##*.}" = "war" ];then
  cp $backup_file $1.war
elif  [ "${backup_file##*.}" = "gz" ];then
  tar zxvf $backup_file
else
  echo "備份文件格式不對"
  exit
fi

read 語句(讀取用戶輸入的字符串):

最簡單的用法:讀取用戶輸入到變量yes_or_noread yes_or_no
提示用戶輸入y或n
read -e -p "是否備份:(y/n)?" -i "y" needbackup
(參數說明:-e:不知有什麼用,但如果去掉了,-i就失效了;-p:後面接着提示語句;-i:後面接着缺省輸入;最後一個參數是保存用戶輸入的變量。)

select 語句(提示用戶從列表中選擇一個):

修改默認提示語(默認值是"#?"): PS3="請選擇一個項目:"

提示用戶從數組中選擇一個值:
select project in ${projects[*]};do
if [ $project ];then
break
fi
done

或加上退出條件:
select target_ip in ${servers[*]} "Exit(退出)";do
if [ "$target_ip" = "Exit(退出)" ]; then
echo "謝謝使用!Good-Bye!"
break
fi

if [ $target_ip ]; then
    # do something
fi

done

case 語句:
case $project in
public) project_name="大衆版" ;;
logistics) project_name="配送版"
;;
misc) project_name="雜項版" ;;
esac

while 語句:

配合正則表達式判斷使用:
while [[ ! $needbackup =~ ^[yn]$ ]];do
read -e -p "是否備份:(y/n)?" -i "y" needbackup
done

用“...”做進度條
echo -n "等待$port 端口打開……"
while [ ! $pid_new ];do
#sleep 1
pid_new=netstat -nlp | grep $port | awk '{print $7}' | awk -F "/" '{print $1}'
echo -n "…"
done

for語句:

遍歷:
for ip_t in ${servers[*]};do
if [ "$2" = "$ip_t" ];then
is_ip_correct=true
break
fi
done

調用其他程序:

使用`,並獲得輸出結果:<br/>PS3="請選擇一個分支:"<br/>select branch insvn list svn://<svn_host>/java/code/branches`;do
if [ $branch ];then
svn_dir="svn://<svn_host>/java/code/branches/$branch"
project_dir=$branch
break
fi
done

使用$(),並獲得輸出結果:
today=$(date +%Y-%m-%d/%H:%M:%S)
svn_version=$(svn info $svn_dir | grep "Last Changed Rev:" | awk '{print $4}')

無聲地調用其他程序(不輸出結果,即把結果輸出到一個null設備中)rm $2/logs/m $2/logs/l $2/logs/h $2/logs/catalina.2015 &>/dev/null &

awk(用來對字符串進行切片處理,一般配合grep使用):

獲得以空格分隔的第四個字符串:
svn_version=$(svn info $svn_dir | grep "Last Changed Rev:" | awk '{print $4}')

獲得以特殊分隔符("/")分隔的第一個字符串
awk -F "/" '{print $1}'

print NF} 和 {print $NF}前者是輸出了域個數,後者是輸出最後一個字段的內容如:~# echo $PWD | awk -F/ '{print $NF}'

獲取所有端口號爲 $port 的進程,並殺掉
for pid in netstat -nlp | grep $port | awk '{print $7}' | awk -F "/" '{print $1}'
do
echo "==========================Warning========================"
echo "無法正常關閉進程,端口:$port,直接kill掉,進程號:$pid"
echo "==========================Warning========================"
kill $pid
done

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章