Shell編程(指令碼)的常用命令和語句,shell常用命令
一些常用的Shell編程(指令碼)命令和語句,可以滿足一般需求。
接收到的命令參數:
$#
命令本身:$0第一個參數:$1第二個參數:$2……
退出命令:exit
echo命令:
echo
echo -n "請選擇(y/n)?"
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[@]}
if 語句(條件判斷同樣適用於while語句和for語句):
if [ $project ];then echo "Variable \"project\" is null."fi
if [ $# -ne 3 ];then echo "命令列參數不是3個"fi
if [ "$is_ip_correct" = false ];then echo "無效的ip地址,請使用下面ip之一:" echo ${servers[*]} exit fi
if [ "$confirm" == "y" ] && [ "$confirm" != "n" ];do # do something...fi
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_no
read yes_or_no
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 fidone
調用其他程式:
PS3="請選擇一個分支:" select branch in `svn 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}'
for pid in `netstat -nlp | grep $port | awk '{print $7}' | awk -F "/" '{print $1}'`do echo "==========================Warning========================" echo "無法正常關閉進程,連接埠:$port,直接kill掉,進程號:$pid" echo "==========================Warning========================" kill $piddone
(原創文章,轉載請註明