shell

###shell腳本編寫###
bash是GUN組織開發和推廣的一個項目,bash腳本類似批處理,簡單來說就是把許多指令集合在一起,並提供循環,條件,判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操
作,並可以完成圖形工具所無法實現的功能。
一.創建新shell腳本的操作
1. 創建包含bash命令的文本文件。文件的第一行應爲:
#!/bin/bash
2.使文件可執行
(1)可以vim xxx.sh然後使用 sh+xxx.sh 可以執行腳本
(2)chmod+x 腳本 輸入絕對路徑可以執行腳本
3.將文件放置在用戶的$PATH的目錄中
~/bin – 用於用戶的私有程序
/usr/local/bin – 本地開發、系統上的其他人使用的腳本
/usr/local/sbin - 本地開發、由root使用的腳本
直接運行腳本和使用source命令運行腳本是不同的!
4.引用和轉義
引用和轉義在shell解析字符串時用於去除字符串中特殊字符或保留詞語的特殊含義。
引用有三種類型:
(1)弱引用
將字符串放置在雙引號中,保留字符串中所有字符的文字值,$、`、\和!字符除外。
(2)強引用
將字符串放置在單引號中,保留字符串中所有字符的文字值,同時禁用所有擴展:
例如:echo '$a'
$a
(3)轉義
非引用的\是轉義字符。它保留了下一個字符的文字值。
例如:echo \#comment #
#comment
echo \#comment \#
#comment #
二.Shell變量
shell變量用於爲稍後在腳本中使用的名稱指定值,並且僅限於shell命令行或從中聲明變
量的腳本。
例如:a=2
echo "$a"
2
三.算術運算符
<VARIABLE>++ ##增量後
<VARIABLE>-- ##減量後
-            ##減法
+            ##加法
**           ##冪運算
*            ##乘法
/            ##除法
%            ##餘數
+=           ##加等
-=           ##減等
四.Shell計算命令
(1)用$[]表示數學運算
例:a=2
b=3
echo $[a+b]
5
(2)用expr表示數學運算
例:echo `expr 2 + 3`
5
(3)用let指示數學運算
例:let c=2+3
echo $c
5
(4)用(())表示數學運算
#!/bin/bash
for ((i=1;i<10;i++))
do
((j+=i))
done
echo $j
1.循環
例:for i in $(seq 2 2 4);do echo $i;done
2
4
2.循環與計算結合
#!/bin/bash
for ((i=1;i<=10;i++))
do
((j+=i))
#j=`expr $j + $i`
#let j+=i
#j=$[j+=i]
done
echo $j
五.bash位置參數
(1)使用read提示用戶輸入(使用-p選項)並將其直接存儲到一個或多個變量:
交互式輸入
#read -p "please input your name: "  un
(2)使用位置參數來讀取傳遞給腳本的命令行參數或選項輸入
Bash解析的個別參數或整個原始命令行。
指定的位置參數總數:$#
位置參數自身:$0、$1、$2、$3....
所有位置參數: $@、$*
六.退出狀態
Linux命令完成時,將返回退出狀態。成功完成程序時,將返回0的推出狀態
推出狀態的值被存儲在"?"中,可以使用以下命令查看:
# echo $?
七.test條件判斷
test命令可用於評估bash腳本中的表達式。它評估其參數所指定的表達式,如果表達式
爲true,返回零退出狀態,如果表達式爲false,則返回非零退出狀態。test具有替代語
法,使用方括號"[]"將表達式括起來,這樣更易於閱讀
(1)字符串比較運算符:=、!=
例:[ abc = abc ]; echo $?
0
(2)數字比較運算符:-eq、-ne、-lt、-le、-gt、-ge
例: [ 1 -ne 1 ]; echo $?
1
(3)文件狀態運算符:test -{b|c|e|f|d|r|w|x|s|L} file/directory
例:[ -d /etc/passwd ]; echo $?
1
(4)二進制文件運算符:-ef、-nt、-ot
(5)邏輯運算符:-o、-a、!、&&、||
八 if語句
語法:if command; then command; command2; else command3; fi
九. case語句
case語句 :它能夠把變量的內容與多個模板進行匹配,再根據成功匹配的模板去決定應該執行哪
部分代碼。




十.expect語句
在shell中利用expect實現自動應答腳本。
例:[root@maillinux mnt]# vim ssh.exp
#!/usr/bin/expect
set IP [lindex $argv 0]
set PASS [lindex $argv 1]
spawn ssh root@$IP
expect {
       "yes/no"
       {send "yse\r";exp_continue}
        "password:"
        {send "$PASS\r"}
        }
        interact

[root@maillinux mnt]# chmod +x ssh.exp
[root@maillinux mnt]# /mnt/ssh.exp 172.25.254.121 redhat
[root@maillinux mnt]# /mnt/ssh.exp 172.25.254.121 redhat
spawn ssh [email protected]
[email protected]'s password:
Last login: Sun Dec 11 03:57:15 2016 from 172.25.254.209
實驗腳本編寫
(1)十秒倒計時
vim shimiao.sh
#!/bin/bash
for ((SEC=10;SEC>0;SEC--))  ##
do
echo -ne "After ${SEC}s is end"
echo -ne "\r    \r"
sleep 1
done
(2)一分十秒倒計時腳本
#!/bin/bash
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
echo -ne"After ${MIN}:${SEC}s is end "
sleep 1
echo -ne "\r    \r"
 
     while ["$SEC" -1e "0" -a "$MIN" -gt "0"]
     do
     echo -ne "After ${MIN}: ${SEC}s is end "
     echo -ne "\r    \r"
      ((MIN--))
      SEC=10
      done

done
(3)創建用戶腳本
vim create_user.sh
#!/bin/bash
read -p "please create user:" user
useradd  $user &> /dev/null
read -p "please set password:" ps
password $ps  &> /dev/null
echo "set password sucessful !"

(4)輸入0-10內數字比較大小
#!/bin/bash
read -p "please input a number: " num
[ $num -ge "0"  -a  $num -le "10" ] && echo yes || echo no
(5)ping教室的機子ip能ping通的顯示up不能的顯示down
#!/bin/bash
for NUM in{1..10}
do
ping -c1 -w1 172.25.254.$NUM &>/dev/null
   while
   ["$?" -eq "0" ]
    do
    echo 172.25.254.$NUM is up
    break
    done    
     while
     {"$?" -ne "0" }
      do
      echo 172.25.254.$NUM is done
      done

done
(6)ping教室的機子ip能ping通的顯示up不能的顯示down
#!/bin/bash
for NUM in{1..10}
do
ping -c1 -w1 172.25.254.$NUM &/dev/null && echo 172.25.254.$NUM is up || echo 172.25.254.$NUM is done
done
(7)數據庫數據備份腳本
#!/bin/bash
for x in $(mysq1 -uroot -phx1 -e "show databases;"   -NE | grep -E "^\*|schema$".-v)
do
     mysq1dump -uroot -phx1 $x >/mnt/$x-'date' .dump
done
(8)查詢文件類型
#!/bin/bash
if
[ -e "$1" ]
then
[ -f "$1" -a ! -L "$1" ] && echo $1 is a file
[ -b "$1" ] && echo $1 is a block
[ -c "$1" ] && echo is a block
else
[ -n "$1" ] && echo is not exist || echo "please input give me a file"
fi
(9)利用passwdfile和userfile來創建用戶
可能出現的情況有:
1.passfile與userfile行數不同
2.passfile行數大於userfile
3.passfile行數小於userfile
4.沒有輸入passfile和userfile
if
[ -n "$1" -a -n "$2"]
then
         if
         [ -e "$1" -a -e "$2" ]
         then
         MAXUSER=`wc -1 $1 | cut -d " " -f 1`
         MAXPASS=`wc -1 $2 | cut -d " " -f 1`
                  [ "$MAXUSER" -eq "$MAXPASS" ]
                  for NUM in $( seq 1 $MAXPASS )
                  do
                  USERNAME=`sed -n ${NUM}p $1`
                  PASSWORD=`sed -n ${NUM}p $2`
                  CKUSER=`getend passwd $USERNAME`
                  [ -z "$CKUSER" ]
                  useradd $USERNAME
                  echo $PASSWORD |passwd --stdin $USERNAME
                  ) || echo "$USERNAME exit !!"
                  done
                   || (
                  echo $1 and $2 have different lines
                  )
          USERNAME=`sed -n ${NUM}p $1`
          PASSWORD=`sed -n ${NUM}p $2`
          CKUSER=`getend passwd $USERNAME`
          [ -z "$CKUSER"] && (
          useradd $USERNAME
          echo $PASSWORD |passwd--stdin $USERNAME
          ) || echo "$USERNAME exist !!"
          done
          ) || (
          echo $1 and $2 have different lines
          )
  elif
  [ ' -e "$1" ]
  then
  echo "ERROR:$1 is not exit"
  else
  echo "ERROR:$2 is not exit"
  fi
ERROR. Please input userfile and password file after command !!













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