shell 構建腳本基礎

bash -v test.sh 啓用 verbose 調試模式shell

bash -n test.sh  啓用語法檢查調試模式express

bash -x test.sh  遍歷腳本執行過程
編程

1、基礎參數bash

1.shell 中()  {}   []  (())  [[]]app

shell 中()  {}   []  (())

在 bash shell 中,$( ) 與` ` (反引號) 均可用作命令替換用。
${ }用於變量替換。通常狀況下,$var 與${var} 並無什麼不同,可是用 ${ } 會比較精確的界定變量名稱的範圍。
$[]和$(())是同樣的,都是進行數學運算的。支持
+ - * / %(「加、減、乘、除、取模」)。可是注意,bash只能做整數運算,對於浮點數是看成字符串處理的。
[[]] 雙方括號命令提供了針對字符串比較的高級特性。

 

 

2.命令替換less


#!/bin/bash #命令輸出負載給變量的兩種方式
#反引號字符(`)
#$()格式
d1
=`date` d2=$(date) echo "The date d1 and time are: $d1" echo "The date d2 and time are: $d2"

3.  >/dev/null 2>&1編程語言

    ls /etcfsdfdsfs   >/dev/null  2>&1  //將標準錯誤輸出導入標準正確輸出,而後將標準正確輸出重定向到   /dev/null

----------------------------------------------------------------------------------------------------------------
   >/dev/null 2>&1 
                //  實際上,應該等同於這樣: 1>/dev/null 2>/dev/null ,
                默認狀況下就是1,標準輸出,因此通常都省略。 而&符號,
                後面接的是必須的文件描述符。不能寫成2>1,
                這樣就成了標準錯誤重定向到文件名爲1的文件中了,
                而不是重定向標準錯誤到標準輸出中。
                因此這裏就是:標準輸出重定向到了/dev/null,而標準錯誤又重定向到了標準輸出,
                因此就成了標準輸出和標準錯誤都重定向到了/dev/null    
    




    2>&1 >/dev/null  //此方式爲不正確方式
    命令從左往右執行,2>&1 爲將標準錯誤輸出重定向到標準輸出,而這時標準輸出是打印在屏幕上的,還沒執行到 >/dev/null
    命令行的重定向什麼的, 是在執行命令以前就準備好了的. 解釋順序從左至右依次進行, 2&>1 ,而1是屏幕, 因此標準錯誤重定向到屏幕, 再而 1>/dev/null ,
    即標準輸出重定向到 /dev/null, 上述2>&1 >/dev/null  並非什麼同一時刻要麼產生標準輸出要麼產生標準錯誤. 而是兩個不一樣的東西.    

 

 

4.數值計算ide

#在bash中,在將一個數學運算結果賦給某個變量時,能夠用美圓符和方括號($[ operation ])將數學表達式圍起來

#!/bin/bash var1=100 var2=200 var3=$[$var1 * $var2] echo "$var3"

 

浮點數計算oop

#variable=$(echo "options; expression" | bc) 

!/bin/bash var1=$(echo "scale=2; 6.44/3/56"|bc) #scale 保留小數點位數 echo $var1

 

 

5.退出腳本測試

#Linux提供了一個專門的變量$?來保存上個已執行命令的退出狀態碼。對於須要進行檢查的命令,必須在其運行完畢後馬上查看或使用$?變量。它的值會變成由shell所執行的最後一條命令的退出狀態碼

狀 態 碼 描 述
0 命令成功結束 1 通常性未知錯誤 2 不適合的shell命令 126 命令不可執行 127 沒找到命令 128 無效的退出參數 128+x 與Linux信號x相關的嚴重錯誤 130 經過Ctrl+C終止的命令 255 正常範圍以外的退出狀態碼

 

#!/bin/bash

var=$(echo "scale=3; 1000/3.3" |bc )

echo $var

exit 0

#echo $? 查看狀態碼
#exit 3 能夠指定退出的狀態碼

 

 

2、使用結構化命令

1. if-then

#bash shell的if語句會運行if後面的那個命令。若是該命令的退出狀態碼是0(該命令成功運行),位於then部分的命令就會被執行。若是該命令的退出狀態碼是其餘值,then部分的命令就不會被執行,bash shell會繼續執行腳本中的下一個命令。fi語句用來表示if-then語句到此結束

if
command then commands fi

 

#!/bin/bash

#test multiple commands in the then section 
#
#
testuser=zy
#
#then 能夠直接跟在if 判斷後面 ,也能夠另起一行
if grep $testuser /etc/passwd; then
    echo "this is my first command"
    echo "this is my second command"
    echo "$testuser is exist "

fi

 

if-then-else 語句

#!/bin/bash

#test multiple commands in the then section 
#
#
testuser=nouser
#

if grep $testuser /etc/passwd; then
    echo "this is my first command"
    echo "this is my second command"
    echo "$testuser is exist "
    echo
else
    echo "the user $testuser does not exist on the system"
    echo
#echo 輸出一個空行 fi

 

嵌套 if

#!/bin/bash

#test multiple commands in the then section 
#
#
testuser=nouser
#

if grep $testuser /etc/passwd; then
    echo "this is my first command"
    echo "this is my second command"
    echo "$testuser is exist "
    echo
else
    echo "the user $testuser does not exist on the system"
    echo
    if ls -d /home/$testuser/
    then
    echo "however ,$testuser has a directory"
    fi

fi

 

elif 語句

#!/bin/bash

#test multiple commands in the then section 
#
#
testuser=$1
#

if grep $testuser /etc/passwd; then
    echo "this is my first command"
    echo "this is my second command"
    echo "$testuser is exist "
    echo
elif    ls -d /home/$testuser/ &>/dev/null;then
    echo "the $testuser dose not exists on the system"
    echo "however ,$testuser has a directory"

else  
    echo "however ,$testuser dose not exist on the system"
    echo "$testuser dose not have a directory"    

fi
----------------------------------------------------------------------------------------------------

[root@localhost shell_script]# ./test8.sh zy
zy:x:22223:1001:IT_2:/home/zy_home:/bin/sh
this is my first command
this is my second command
zy is exist 

[root@localhost shell_script]# ./test8.sh nouser
the nouser dose not exists on the system
however ,nouser has a directory
[root@localhost shell_script]# ./test8.sh aaa
however ,aaa dose not exist on the system
aaa dose not have a directory
[root@localhost shell_script]# 

 

if command1
then 
 command set 1 
elif command2
then 
 command set 2 
elif command3
then 
 command set 3 
elif command4
then 
 command set 4 
fi 

 

 

2.test 命令

test命令提供了在if-then語句中測試不一樣條件的途徑。若是test命令中列出的條件成立,test命令就會退出並返回退出狀態碼0。這樣if-then語句就與其餘編程語言中的if-then語句以相似的方式工做了。若是條件不成立,test命令就會退出並返回非零的退出狀態碼,這使得if-then語句不會再被執行
if test condition
then 
 commands
fi 
#若是不寫test命令的condition部分,它會以非零的退出狀態碼退出,並執行else語句塊

 

#!/bin/bash
#
#
#
var=$1

if test $var 
then
    echo " condition "

else 
    echo "no condition"

fi

 

#bash shell提供了另外一種條件測試方法,無需在if-then語句中聲明test命令。
if [ condition ] 
then 
 commands
fi #方括號定義了測試條件。注意,第一個方括號以後和第二個方括號以前必須加上一個空格, 不然就會報錯。
test命令能夠判斷三類條件:
 數值比較
 字符串比較
 文件比較

 

比 較             描 述
n1 -eq n2      檢查n1是否與n2相等
n1 -ge n2      檢查n1是否大於或等於n2
n1 -gt n2       檢查n1是否大於n2
n1 -le n2       檢查n1是否小於或等於n2
n1 -lt n2        檢查n1是否小於n2
n1 -ne n2      檢查n1是否不等於n2            

 

#!/bin/bash
#
#Using numeric test evaluations

val1=$1
val2=$2
#
if [ $val1 -gt 10 ];then
    echo "$val1 gt 10"
fi

if [ $val1 -eq $val2 ];then
    echo "$val1 eq $val2"

fi

 

字符串比較測試
比 較                     描 述
str1 = str2            檢查str1是否和str2相同
str1 != str2           檢查str1是否和str2不一樣
str1 < str2            檢查str1是否比str2小
str1 > str2            檢查str1是否比str2大
-n str1                  檢查str1的長度是否非0 
-z str1                  檢查str1的長度是否爲0 
[root@localhost shell_script]# cat test11.sh 
#!/bin/bash

#
#

var1=$1
var2=$2

if [ $var1 \> $var2 ];then
#字符串比較大於或者小於須要用 \ 進行轉義,不然會當成文件的重定向
echo "$var1 is greater than $var2" else echo "$var1 is less than $var2" fi [root@localhost shell_script]# ./test11.sh aaa cccccc aaa is less than cccccc [root@localhost shell_script]#

 

 

test命令的文件比較功能
比 較                     描 述
-d file                 檢查file是否存在並是一個目錄
-e file                 檢查file是否存在
-f file                 檢查file是否存在並是一個文件
-r file                 檢查file是否存在並可讀
-s file                 檢查file是否存在並不是空
-w file                 檢查file是否存在並可寫
-x file                 檢查file是否存在並可執行
-O file                 檢查file是否存在並屬當前用戶全部
-G file                 檢查file是否存在而且默認組與當前用戶相同
file1 -nt file2         檢查file1是否比file2新
file1 -ot file2         檢查file1是否比file2舊
[root@localhost shell_script]# cat test12.sh 
#!/bin/bash

#Look before you leap 

var1=$1

if [ -d $var1 ];then
    echo "the $var1 directory exist"
    cd $var1
    ls -a
else
    echo "the $var1 directory dose not exists"

fi
[root@localhost shell_script]# ./test12.sh /home
the /home directory exist
.  ..  nouser  shell_script  tom  zhengyue  zy_home
[root@localhost shell_script]# 

 

 

複合條件測試

if-then語句容許你使用布爾邏輯來組合測試。有兩種布爾運算符可用:
 [ condition1 ] && [ condition2 ] 
 [ condition1 ] || [ condition2 ]

 

[root@localhost shell_script]# cat test13.sh 
#!/bin/bash

#
#

if [ -d $HOME ] && [ -w $HOME/testing ];then
    echo "the file exists and you can write to it"
elif [ -d $HOME ] || [  -w $HONE/testing ];then
    echo "the file 2 || 1"
else
    echo "I cannot write to the file"

fi
[root@localhost shell_script]# ./test13.sh 
the file exists and you can write to it
[root@localhost shell_script]# ./test13.sh 
the file 2 || 1
[root@localhost shell_script]# 

 

if-then 的高級特性

bash shell提供了兩項可在if-then語句中使用的高級特性:
 用於數學表達式的雙括號
 用於高級字符串處理功能的雙方括號
雙括號命令符號 (())
符 號             描 述
val++             後增
val--             後減
++val             先增
--val             先減
!                 邏輯求反
~                 位求反
**                 冪運算
<<                 左位移
>>                 右位移
&                 位布爾和
|                 位布爾或
&&                 邏輯和
||                 邏輯或
[root@localhost shell_script]# cat test14.sh 
#!/bin/bash
i=4
b=$(( i++ ))  
c=$(( ++i ))

echo $b
echo $c
[root@localhost shell_script]# ./test14.sh 
4
6

 

雙方括號命令提供了針對字符串比較的高級特性。雙方括號命令的格式以下:
[[ expression ]]

[root@localhost shell_script]# cat test15.sh 
#!/bin/bash

#
#using pattern match

if [[ $USER == r* ]];then
    echo "Hello $USER"
else
    echo "sorry , I do not know you"
fi
[root@localhost shell_script]# ./test15.sh 
Hello root
[root@localhost shell_script]# 

 

case 語句

case 字符串 in
    模式)
        語句
        ;;
    模式2 | 模式3)
         語句
         ;;
    *)
         默認執行的 語句
         ;;
esac
#!/bin/bash
#
case $1 in
 [0-9])
    echo "$1 IS number"
    ;;
 [A-Z]) 
    echo "$1 is character"
    ;;
 *)
    echo "$1 is error character"
    ;;
esac
[root@localhost shell_script]# cat test16.sh 
#!/bin/bash

case $1 in
    [0-9])
    echo "$1 is mumber"
        ;;
    [A-Z])
    echo "$1 is character"
    ;;
    *)
    echo "$1 is error character"
    ;;
esac
[root@localhost shell_script]# ./test16.sh 1
1 is mumber
[root@localhost shell_script]# ./test16.sh A
A is character
[root@localhost shell_script]# ./test16.sh CC
CC is error character
[root@localhost shell_script]# 

 

只接受start ,stop ,restart ,status

#!/bin/bash
#
case $1 in 
    'start')
    echo "start server ..."
    ;;
    'stop')
    echo "stop server ..."
    ;;
    'restart')
    echo "restart server ..."
    ;;
    'status')
    echo "running ..."
    ;; 
*)
echo "`basename $0` {start|stop|restart|status}"
    ;;
    esac
    ##注意多分支判斷每一個判斷結束都要在後面加上;;

 for 命令

for var in list 
do 
 commands 
done 
root@localhost shell_script]# cat test17.sh 
#!/bin/bash
#basic for command

for test in A B C D E F ;do
    echo "The char : $test"

done

[root@localhost shell_script]# ./test17.sh 
The char : A
The char : B
The char : C
The char : D
The char : E
The char : F
[root@localhost shell_script]# 

 

 

[root@localhost shell_script]# cat test18.sh 
#!/bin/bash


#
#

list='A v bg ng jn df ttt'
list=$list' cc'
#列表附加內容
for I in $list;do echo "$I" done [root@localhost shell_script]# ./test18.sh A v bg ng jn df ttt cc [root@localhost shell_script]

 

 

root@localhost shell_script]# cat test19.sh 
#!/bin/bash
#
#
for file in /root/* ;do
    if [ -d "$file" ];then
        echo "The $file is a directory"
    elif [ -f "$file" ];then
        echo "the $file is a file"
    fi
done
[root@localhost shell_script]# ./test19.sh 
the /root/1111.cap is a file
The /root/123 is a directory
the /root/222.cap is a file
the /root/anaconda-ks.cfg is a file
the /root/cc is a file
the /root/Joomla_3.9.3-Stable-Full_Package.zip is a file
the /root/ping.out is a file
the /root/qwe.cap is a file
the /root/tr is a file
the /root/:x is a file
[root@localhost shell_script]# 

C 語言的 for命令

for (( variable assignment ; condition ; iteration process )) 

[root@localhost shell_script]# cat test20.sh 
#!/bin/bash

#

for (( i=1; i<5; i++ ));do
    echo "The next number is :$i"

done
[root@localhost shell_script]# ./test20.sh 
The next number is :1
The next number is :2
The next number is :3
The next number is :4
[root@localhost shell_script]# 

 

 

 

while 命令

while命令的格式是:
while test command 
do 
 other commands 
done 
#!/bin/bash
#
#
var1=10

while    echo $var1
    [ $var1 -ge 0 ];do
    echo "This is inside the loop"
    var1=$[ $var1 - 1 ]
done

 

 

until 命令

until命令和while命令工做的方式徹底相反。until命令要求你指定一個一般返回非零退
出狀態碼的測試命令。只有測試命令的退出狀態碼不爲0,bash shell纔會執行循環中列出的命令。
一旦測試命令返回了退出狀態碼0,循環就結束了。

 

until test commands 
do  other commands 
done 

 

root@localhost shell_script]# cat test22.sh 
#!/bin/bash

#

var1=100

until echo $var1
    [ $var1 -eq 0 ];do
    echo "inside the loop:$var1"
    var1=$[ $var1 - 25 ]

done
[root@localhost shell_script]# ./test22.sh 
100
inside the loop:100
75
inside the loop:75
50
inside the loop:50
25
inside the loop:25
0

 

嵌套循環

#注意,在使用嵌套循環時,你是在迭代中使用迭代,與命令運行的次數是乘積關係。

[root@localhost shell_script]# cat test23.sh #!/bin/bash # for (( a=1 ;a<=3;a++ ));do echo "starting loop $a" for ((b=1;b<=3;b++ ));do echo "Inside loop:$b" done done [root@localhost shell_script]# ./test23.sh starting loop 1 Inside loop:1 Inside loop:2 Inside loop:3 starting loop 2 Inside loop:1 Inside loop:2 Inside loop:3 starting loop 3 Inside loop:1 Inside loop:2 Inside loop:3 [root@localhost shell_script]#

 

break 語句

break n :指定要跳出的循環層級

[root@localhost shell_script]# cat test24.sh 
#!/bin/bash
#
#
#breaking out of a while loop

var1=1

while [ $var1 -lt 10 ];do
    if [ $var1 -eq 5 ];then
        break
    fi
    echo "Iteration: $var1"
    var1=$[ $var1 + 1 ]
done

echo "The while loop is complated"


[root@localhost shell_script]# ./test24.sh 
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
The while loop is complated
[root@localhost shell_script]# 

 

 

continue 命令

continue命令能夠提早停止某次循環中的命令,但並不會徹底終止整個循環。

root@localhost shell_script]# cat test25.sh 
#!/bin/bash

#

for (( i=1;i<10;i++ ));do
    if  [ $i -gt 4 ] && [ $i -lt 7 ];then
        continue
    fi
    echo "Iteration : $i"
done
[root@localhost shell_script]# ./test25.sh 
Iteration : 1
Iteration : 2
Iteration : 3
Iteration : 4
Iteration : 7
Iteration : 8
Iteration : 9
[root@localhost shell_script]# 
[root@localhost shell_script]# cat test26.sh 
#!/bin/bash 
# piping a loop to another command 
for state in "North Dakota" Connecticut Illinois Alabama Tennessee 
do 
  echo "$state is the next place to go" 
done | sort 
#輸出結果交給sort 進行排序而後進行輸出 [root@localhost shell_script]# .
/test26.sh Alabama is the next place to go Connecticut is the next place to go Illinois is the next place to go North Dakota is the next place to go Tennessee is the next place to go [root@localhost shell_script]#

 實例:

[root@localhost shell_script]# cat test27.sh 
#!/bin/bash

IFS=:
#指定分隔符爲:

for folder in $PATH ;do
    echo "path : $folder"
#for 循環遍歷path 路徑    
    for file in $folder/*
    do
#for 循環遍歷path 路徑下的文件,判斷是不是可執行文件 if [ -x $file ];then echo "-x :$file" fi done done

 

for 命令容許你遍歷一系列的值

while 命令使用普通命令或者測試命令提供了基於條件命令的循環

until 命令也提供了迭代命令的一中方法,可是取非0 的狀態進行匹配

 

 

#階乘
[root@localhost shell_script]# cat test29.sh #!/bin/bash factorial=1 for (( number = 1 ;number <= $1; number++ ));do factorial=$[ $factorial * $number ] done echo "The factorial of $1 is $factorial" [root@localhost shell_script]# ./test29.sh 8 The factorial of 8 is 40320 [root@localhost shell_script]#

傳遞9之後的參數

root@localhost shell_script]# cat test30.sh 
#!/bin/bash


echo $1

echo ${10} 
echo ${11}

 

basename 的做用:返回不包含路徑的腳本名

[root@localhost shell_script]# cat addem 
#!/bin/bash
#testing a multi-function script

name=$(basename $0)

if [ $name = "addem" ];then 

    total=$[ $1 + $2  ]

elif [ $name = "multem" ];then
    
    total=$[ $1 * $2  ]

fi

echo "$total"


[root@localhost shell_script]# ./addem 2 3
5
[root@localhost shell_script]# mv addem multem
[root@localhost shell_script]# ./multem 2 3
6
[root@localhost shell_script]# 

 

 參數統計:$#

root@localhost shell_script]# cat test32.sh 
#!/bin/bash

# $# 可以獲取參數的個數
#getting the number of parameters

echo there were $# parameters supplied.

exit 0

[root@localhost shell_script]# ./test32.sh 3 4  df  h s g h
there were 7 parameters supplied.

 

關於參數統計的腳本:

 ${$#} 在腳本中會出現異常,須要改爲 ${!#}

[root@localhost shell_script]# cat test33.sh 
#!/bin/bash
#Testing parameters
#

if [ $# -ne 2 ];then
    echo
    echo Usage: test.sh a b
    echo
else
    total=$[ $1 + $2 ]
    echo
    echo the  total is $total  
    echo 
fi
——————————————————————————————————————————————————————————————————————————
[root@localhost shell_script]# ./test33.sh 2 Usage: test.sh a b [root@localhost shell_script]# ./test33.sh 2 4 the total is 6

 

 

$* 將給定的多個參數定義爲一個總體保存,相似"A B C"

$@ 將給定的多個參數定義爲同一字符串的多個單獨的單詞,相似  "A" "B"  "C"

 

--------------------------------------

shift 移動變量

在使用shift命令時,默認狀況下它會將每一個參數變量向左移動一個位置。因此,變量$3的值會移到$2中,變量$2的值會移到$1中,而變量$1的值則會被刪除(注意,變量$0的值,

也就是程序名,不會改變)

 

[root@localhost shell_script]# cat test34.sh 
#!/bin/bash
#demonstrating the shift command

count=1

while [ -n "$1" ];do
# "$1" 須要加"" 不然沒法進行匹配
echo echo "The parameters# $count: $1" echo count=$[ $count + 1 ] shift done [root@localhost shell_script]# ./test34.sh A b 1 2 3 The parameters# 1: A The parameters# 2: b The parameters# 3: 1 The parameters# 4: 2 The parameters# 5: 3 [root@localhost shell_script]#

 處理選項:查找選項

Found the -c option
[root@localhost shell_script]# cat test35.sh 
#!/bin/bash

echo
while [ -n "$1" ];do

    case "$1" in
        -a) echo "Found the -a option" ;;
        -b) echo "Found the -b option" ;;
        -c) echo "Found the -c option" ;;
        *) echo " "$1" is not found option" ;;
    esac
#shift 將每一個變量向左移動一位
shift done

[root@localhost shell_script]# ./test35.sh -z -a -v -b -c -z is not found option Found the -a option -v is not found option Found the -b option Found the -c option [root@localhost shell_script]#

 

分離參數和選項:

[root@localhost shell_script]# cat test36.sh 
#!/bin/bash
# extracting options and parameters

echo

while [ -n "$1" ];do
    case "$1" in
        -a) echo "Found the -a option" ;;
        -b) echo "Found the -b option" ;;
        -c) echo "Found the -c option" ;;
        --) shift
            break ;;
        *) echo "$1 is not an option" ;;
    esac
        
    shift
done

#

count=1

for param in $@;do
    echo "Parameter #$count: $param "
    count=$[ $count + 1 ]
done

[root@localhost shell_script]# 
[root@localhost shell_script]# ./test36.sh -a -c test ss -- 1 2 3

Found the -a option
Found the -c option
test is not an option
ss is not an option
Parameter #1: 1 
Parameter #2: 2 
Parameter #3: 3 
[root@localhost shell_script]# 

 

處理帶值的選項:

[root@localhost shell_script]#  cat test37.sh 
#!/bin/bash
# extracting options and parameters

echo

while [ -n "$1" ];do
    case "$1" in
        -a) echo "Found the -a option" ;;
        -b) echo "Found the -b option" ;;
        -c) echo "Found the -c option" 
            echo 
            echo "Found the param :$2 "
            shift ;;
        --) shift
            break ;;
        *) echo "$1 is not an option" ;;
    esac
        
    shift
done

#

count=1

for param in $@;do
    echo "Parameter #$count: $param "
    count=$[ $count + 1 ]
done

[root@localhost shell_script]# ./test37.sh -a -c test ss -- 1 2 3

Found the -a option
Found the -c option

Found the param :test 
ss is not an option
Parameter #1: 1 
Parameter #2: 2 
Parameter #3: 3 
[root@localhost shell_script]# 

 

getopt 命令:

 

 

得到用戶輸入: read 從鍵盤得到用戶輸入

read -t 5 -p "your name: " name

-t  指定超時時間

[root@localhost shell_script]# ./test38.sh 
your name: ww
hi ww
your name: ee
ee
[root@localhost shell_script]# cat test38.sh 
#!/bin/bash
#testing the read command
#

echo -n "your name: "
read name
echo "hi $name"

read -p "your name: " name
echo "$name"
[root@localhost shell_script]# ./test38.sh
your name: ff
hi ff
your name: gg
gg
[root@localhost shell_script]# 

 

 

[root@localhost shell_script]# cat test39.sh 
#!/bin/bash
#getting just one character of input 
#

read -n1 -p "Do you want to contiune [Y/N]?  " answer
case $answer in
Y|y) echo
     echo "fine, continue on...";;
N|n) echo
     echo "OK goodbye"
     exit;;
esac
    echo "this is the end of the script"

[root@localhost shell_script]# ./test39.sh 
Do you want to contiune [Y/N]?  n
OK goodbye
[root@localhost shell_script]# 
#本例中將-n選項和值1一塊兒使用,告訴read命令在接受單個字符後退出。只要按下單個字符
回答後,read命令就會接受輸入並將它傳給變量,無需按回車鍵。

# -s選項能夠避免在read命令中輸入的數據出如今顯示器上(實際上,數據會被顯示,只是read命令會將文本顏色設成跟背景色同樣)。
 

 

#!/bin/bash 
# reading data from a file 
# 
count=1 
cat test | while read line 
do 
  echo "Line $count: $line" 
  count=$[ $count + 1] 
done 
echo "Finished processing the file"
#從文件讀取內容

 

root@localhost shell_script]# cat test41.sh 
#!/bin/bash
exec 1>testout
#exec 永久重定向
echo "ff"
echo "aa"
echo "bb"


[root@localhost shell_script]# cat testout 
ff
aa
bb
[root@localhost shell_script]# 

 

done < ${1} :$1 表明第一個命令行參數

 

 

控制腳本

1 SIGHUP      掛起進程
2 SIGINT        終止進程
3 SIGQUIT     中止進程
9 SIGKILL      無條件終止進程
15 SIGTERM    儘量終止進程
17 SIGSTOP    無條件中止進程,但不是終止進程
18 SIGTSTP    中止或暫停進程,但不終止進程
19 SIGCONT    繼續運行中止的進程

 

trap 捕獲信號

root@localhost shell_script]# cat test42.sh 
#!/bin/bash
#Testing signal trapping
#

trap "echo 'Sorry  I have trap Ctrl-C'" SIGINT

echo "This is a test script"

count=1
while [ $count -le 10 ];do
    echo "loop #$count"
    sleep 1
    count=$[ $count + 1 ]
done

echo "END"
[root@localhost shell_script]# ./test42.sh
This is a test script
loop #1
loop #2
^CSorry  I have trap Ctrl-C
loop #3
^CSorry  I have trap Ctrl-C
loop #4
^CSorry  I have trap Ctrl-C
loop #5
loop #6
loop #7
loop #8
loop #9
loop #10
END
[root@localhost shell_script]# 

後臺運行腳本

./test1.sh &   #後臺運行腳本,終端關閉後中止
nohup ./test1.sh & #後臺運行腳本,終端關閉後任然執行

 nice 命令:

nice -n 10 ./test4.sh > test4.out &

 

 

 

定時任務執行

    1.在將來某個時間點執行一次
        at
        batch
        
        at 時間
        at > COMMAND
        at > crtl +d :提交
        指定時間:
        絕對時間: HH:MM DD:MM:YY MM/DD/YY 
        相對時間: now+#
            單位: minutes ,hours ,days ,weeks
                模糊時間:noon ,midnight ,teatime 
        命令的執行結果將以郵件的形式發送給安排任務的用戶        
        at -l :顯示做業
        at -d :刪除做業
        at -c ;顯示執行的內容
        
        
        
    2.週期性執行
    cron :crontab 自身是一個不間斷執行的程序
    
    anacron: cron 的補充。可以實現cron 沒執行的動做
    
    cron:
        系統cron 任務
            /etc/crontab
        分鐘 小時 天 月 周 用戶 任務    
        用戶cron 任務
            /var/spool/cron/USERNAME
            
    時間統配符:*
        *:對應全部有效取值
    * * * * * :每分鐘執行一次     
    3 * * * * :表示每週每個月天天每小時的第三分鐘執行一次
    3 * * * * :每一個星期天的每小時的第三分鐘執行一次
    
    13 12 * * 5 :每週五12 點13 分執行一次
    13 12 6 7 * :每一年7月6號12點13 分執行一次
    
    ,:離散時間點
       10,40 * * * * :每小時的第10 分和第40 分執行一次
       
    -:連續時間點
    10 02 * * 1-5 :每週一到週五的2 點 10 分執行一次
    
    /:對應取值範圍內每多久執行一次
    */3 * * * * :每三分鐘執行一次
    
    * */2 * * * :每隔2 小時執行60 次, 由於每分鐘爲* 每分鐘都會執行
    01 */2 * * * :每隔 2小時的第一分鐘執行一次
    
    執行結果將以郵件方式發送給管理員
    
    
    */3 * * * * cat /etc/fstab > /dev/null :每3 分鐘執行一次,而且將正確輸出重定向,錯誤內容郵箱發送
    
    cron 環境變量在PATH 查找
    在腳本中 export 定義環境變量:
    service crond status :查看crond 服務運行狀態
    
    crontab -l :查看定時任務
    crontab -e : 編輯, 注意使用crontab -e 編輯,直接/etc/crontab 不行
    crontab -r : 移除全部任務
    crontab -u :指定以哪一個用戶來運行
    
    
相關文章
相關標籤/搜索