echomysql
date +%T 以格式化輸出當前時間linux
演示樣例git
#!/bin/bash # This is the first Bash shell program # Scriptname: greetings.sh echo echo -e "Hello $LOGNAME, \c" echo "it's nice talking to you." echo -n "Your present working directory is: " pwd # Show the name of present directory echo echo -e "The time is `date +%T`!. \nBye" echo
時間同步shell腳本算法
#!/bin/bash ## Script Name:/etc/cron.daily/ntpdate # 使用NTP的client命令ntpdate與遠程NTPserver進行同步 # 也可以用局域網內的NTPserver替換 pool.ntp.org /usr/sbin/ntpdate -s pool.ntp.org # 更改硬件時鐘時都會記錄在/etc/adjtime文件裏 # 使hwclock依據先前的記錄來估算硬件時鐘的誤差。 # 並用來校訂眼下的硬件時鐘 /sbin/hwclock --adjust # 將系統時鐘同步到硬件時鐘 /sbin/hwclock –systohc
假設存在語法錯誤,shell 會報錯。假設沒有錯誤,則不顯示不論什麼內容sql
演示樣例shell
#!/bin/bash # This is the first Bash shell program # Scriptname: greetings.sh set -x ### Turn ON debug mode ### echo echo -e "Hello $LOGNAME, \c" echo "it's nice talking to you." echo -n "Your present working directory is: " pwd # Show the name of present directory echo set +x ### Turn OFF debug mode ### echo -e "The time is `date +%T`!. \nBye" echo
經過 str2 的值來引用 str1 的值express
錯誤演示樣例編程
str1="Hello World" str2=str1 echo $str2
正確演示樣例vim
str1="Hello World" str2=str1 newstr=${!str2} echo $newstr Hello World 或 echo ${!str2} Hello World 或 eval newstr=\$$str2 echo $newstr Hello World 或 eval echo \$$str2 Hello World
x=」CENTOS」centos
經過 x 的值來引用 CENTOS_URL 的值
# bash2.0以上才支持 newstr=${x}_URL echo $newstr CENTOS_URL echo ${!newstr} http://mirrors.163.com/centos/ 或 eval newstr=\$${x}_URL echo $newstr 或 eval echo \$${x}_URL
eval arg1 [arg2] … [argN]
* 對參數進行兩次掃描和替換
* 將所有的參數鏈接成一個表達式。並計算或運行該表達式
* 參數中的不論什麼變量都將被展開
listpage="ls -l | more" eval $listpage eval $(ssh-agent) eval newstr=\$$str2 eval echo \$${x}_URL
命令行參數相關
$* 獲取當前shell腳本所有傳參的參數,將所有位置參量當作一個字符串(以空格間隔)。至關於""$1$2$3$4$5 。 $@ 將每個位置參量當作單獨的字符串(以空格間隔)"$!" "$2" "...."。 "$*" 將所有位置參量當作一個字符串(以$IFS間隔)。 "$@" 將每個位置參量當作單獨的字符串(以空格間隔) 。 $0 命令行上輸入的Shell程序名。$# 表示命令行上參數的個數。
進程狀態相關
$? 表示上一條命令運行後的返回值 $$ 當前進程的進程號 $! 顯示運行在後臺的最後一個做業的 PID $_ 在此以前運行的命令或腳本的最後一個參數
演示樣例
常常與循環結構語句一塊兒使用,以便遍歷每個位置參數
#!/bin/sh # ScriptName: pp_shift.sh # To test Positional Parameters & Shift. echo "The script name is : $0" echo '$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4 -- '$#'="$#" echo '$@': "$@" shift # 向左移動所有的位置參數1次 echo '$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4 -- '$#'="$#" echo '$@': "$@" shift 2 # 向左移動所有的位置參數2次 echo '$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4 -- '$#'="$#" echo '$@': "$@" $ ./pp_shift.sh 1 b 3 d 4 f
$ echo $$ # 顯示當前進程的 PID 9245 $ echo $? # 顯示在此以前運行的命令的返回值 0 $ bash # 調用子Shell $ echo $$ # 顯示當前進程的 PID 9474 $ exit 1 # 指定返回值並返回父Shell $ echo $? # 顯示上一個Shell/腳本的返回值 1 $ list # 運行不存在的命令 bash: list: command not found $ echo $? 127 $ touch bbb.sh $ ./bbb.sh # 運行不具備運行權限的命令 bash: ./bbb.sh: Permission denied $ echo $?126
:將命令運行的結果輸出給變量#!/bin/bash # This script is to test the usage of read # Scriptname: ex4read.sh echo "=== examples for testing read ===" echo -e "What is your name?\c" read name echo "Hello $name" echo echo -n "Where do you work? " read echo "I guess $REPLY keeps you busy!" echo read -p "Enter your job title: " echo "I thought you might be an $REPLY." echo echo "=== End of the script ==="
[lrj@centos1 ~]$ myname=Osmond [lrj@centos1 ~]$ echo $myname Osmond [lrj@centos1 ~]$ readonly myname [lrj@centos1 ~]$ unset myname -bash: unset: myname: cannot unset: readonly variable [lrj@centos1 ~]$ myname="Osmond Liang" -bash: myname: readonly variable
$ var=test $ echo $var test $ echo $varAA $varAA $ echo ${var}AA testAA $ ls a b c $ echo $(ls) a b c $ echo `ls` a b c
let 內置命令用於算術運算
num2=1; echo $num2 let num2=4+1; echo $num2 let num2=$num2+1; echo $num2
假設變量的值是字符串,則進行算術運算時設爲 0
let num2=4 + 1 let "num2=4 + 1" # 用引號忽略空格的特殊含義
表達式中的運算可以是算術運算,比較運算,字符串運算和邏輯運算。
expr 5 % 3 expr 5 \* 3 # 乘法符號必須被轉義 expr 2 + 5 \* 2 - 3 % 2 expr \( 2 + 5 \) \* 2 – 3 # 括號必須被轉義
可以經過使用 bc 或 awk 工具來處理浮點數運算
n=$(echo "scale=3; 13/2" | bc ) echo $n m=`awk 'BEGIN{x=2.45;y=3.123;printf "%.3f\n", x*y}'` echo $m
使用 declare 聲明或直接給變量名加下標來賦值
declare -a variable variable=(item1 item2 item2 ... )
數組的引用
${variable[n]}
declare myname=osmond declare –r myname=osmond unset myname declare myname=「Osmond Liang" declare –x myname2=lrj myname2=lrj declare –x myname2
if expr1 # 假設 expr1 爲真(返回值爲0) then # 那麼 commands1 # 運行語句塊 commands1 elif expr2 # 若 expr1 不真。而 expr2 爲真 then # 那麼 commands2 # 運行語句塊 commands2 ... ... # 可以有多個 elif 語句 else # else 最多僅僅能有一個 commands4 # 運行語句塊 commands4 fi # if 語句必須以單詞 fi 終止
case expr in # expr 爲表達式。關鍵詞 in 不要忘! pattern1) # 若 expr 與 pattern1 匹配。注意括號 commands1 # 運行語句塊 commands1 ;; # 跳出 case 結構 pattern2) # 若 expr 與 pattern2 匹配 commands2 # 運行語句塊 commands2 ;; # 跳出 case 結構 ... ... # 可以有隨意多個模式匹配 *) # 若 expr 與上面的模式都不匹配 commands # 運行語句塊 commands ;; # 跳出 case 結構 esac # case 語句必須以 esac 終止
for variable in list # 每一次循環。依次把列表 list 中的一個值賦給循環變量 do # 循環體開始的標誌 commands # 循環變量每取一次值,循環體就運行一遍 done # 循環結束的標誌。返回循環頂部
可以省略 in list 。省略時至關於 in 「$@」
首先將 list 的 item1 賦給 variable
for ((expr1;expr2;expr3)) # 運行 expr1 do # 若 expr2的值爲真時進入循環,不然退出 for循環 commands # 運行循環體,以後運行 expr3 done # 循環結束的標誌,返回循環頂部
expr3 在每次運行循環體以後運行一次
首先運行 expr1
while expr # 運行 expr do # 若expr的退出狀態爲0。進入循環,不然退出while commands # 循環體 done # 循環結束標誌,返回循環頂部
* While 和輸入重定向
* 使用管道爲 while 傳遞輸入
until expr # 運行 expr do # 若expr的退出狀態非0。進入循環,不然退出until commands # 循環體 done # 循環結束標誌,返回循環頂部
將循環結果經過管道傳遞給其它命令處理(done |)
後臺運行循環(done &)
select variable in list do # 循環開始的標誌 commands # 循環變量每取一次值,循環體就運行一遍 done # 循環結束的標誌
./foo.txt 和 ./mydir 是腳本的處理對象,他們是不與不論什麼選項相關的參數,在POSIX®標準中稱其爲「操做 對象/數」(operands)
依照Linux的命令行書寫規範。例如如下命令行
也可以寫成例如如下的等價形式
ARGS : 參數列表。省略時爲 」$@」
getopts c:zrv opt
getopts :c:zrv opt
getopts的運行過程
getopts的錯誤報告模式
while getopts OPTSTRING VARNAME do case $VARNAME in …) ………… ;; …) ………… ;; :) ………… ;; \?) ………… ;; esac done
演示樣例1
#!/bin/bash ## filename : pp_parse_getopts_1.sh while getopts "abc:def:ghi" flag do echo "$flag" $OPTIND $OPTARG done echo "Resetting" OPTIND=1 while getopts "bc:def:ghi" flag do echo "$flag" $OPTIND $OPTARG done $ ./pp_parse_getopts_1.sh -a -bc foo -f "foo bar" -h –gde $ ./pp_parse_getopts_1.sh -abf "foo bar" -h -gde –c $ ./pp_parse_getopts_1.sh -abf 「foo bar」 -h –c -gde
演示樣例2
#!/bin/bash ## filename : pp_parse_getopts_2.sh while getopts ":abc:def:ghi" flag do echo "$flag" $OPTIND $OPTARG done echo "Resetting" OPTIND=1 while getopts ":bc:def:ghi" flag do echo "$flag" $OPTIND $OPTARG done $ ./pp_parse_getopts_2.sh -a -bc foo -f "foo bar" -h -gde $ ./pp_parse_getopts_2.sh -abf "foo bar" -h -gde –c $ ./pp_parse_getopts_1.sh -abf 「foo bar」 -h –c -gde
* 演示樣例3
#!/bin/bash ## filename : mybackup_getopts.sh while getopts :zc:x:rv opt do case $opt in c) ConfFile=$OPTARG ;; x) ExcludeFile=$OPTARG ;; z) Compress=true ;; r) Recursive=true ;; v) Verbose=true ;; :) echo "$0: Must supply an argument to -$OPTARG." >&2 exit 1 ;; \?) echo "Invalid option -$OPTARG ignored." >&2 ;; esac done shift $((OPTIND-1)) ; echo $0 ; echo "$@"
演示樣例4
#!/bin/bash ## filename : mybackup_getopts2.sh while getopts :zc:x:rv opt do case $opt in c) if [[ $OPTARG = -* ]]; then ((OPTIND--)) ; continue ; fi ConfFile=$OPTARG ;; x) ExcludeFile=$OPTARG ;; z) Compress=true ;; r) Recursive=true ;; v) Verbose=true ;; :) echo "$0: Must supply an argument to -$OPTARG." >&2 exit 1 ;; \?) echo "Invalid option -$OPTARG ignored." >&2 ;; esac done shift ((OPTIND-1)) ; echo $0 ; echo "$@"
函數的定義和調用
演示樣例1
#!/bin/bash ## filename: all_in_one_backup_select.sh ### User define Function (UDF) ### sql_bak () { echo "Running mysqldump tool..."; } sync_bak () { echo "Running rsync tool..."; } git_bak () { echo "Running gistore tool..."; } tar_bak () { echo "Running tar tool..."; } ### Main script starts here ### PS3="Please choose a backup tools : " select s in mysqldump rsync gistore tar quit ; do case $REPLY in 1) sql_bak ;; 2) sync_bak ;; 3) git_bak ;; 4) tar_bak ;; 5) exit ;; esac done
演示樣例2
#!/bin/bash ## filename: /root/bin/my_backup_functions.sh ### User define Function (UDF) ### sql_bak () { echo "Running mysqldump tool..."; } sync_bak () { echo "Running rsync tool..."; } git_bak () { echo "Running gistore tool..."; } tar_bak () { echo "Running tar tool..."; }
演示樣例3
#!/bin/bash ## filename: all_in_one_backup_select.sourcefunc.sh source /root/bin/my_backup_functions.sh ### Main script starts here ### PS3="Please choose a backup tools : " select s in mysqldump rsync gistore tar quit ; do case $REPLY in 1|[mM]ysqldump) sql_bak ;; 2|[rR]sync) sync_bak ;; 3|[gG]istore) git_bak ;; 4|[tT]ar) tar_bak ;; 5) exit ;; esac done
函數與位置參數
演示樣例1
#!/bin/bash ## filename: pp_and_function.sh echo "===Print positional parameters in main :" echo "$0: $*" pp1(){ echo 'f1--Print $* parameters in fun1 :' ; echo "$0: $*" } pp2(){ echo 'f2--Print $* parameters in fun1 :' ; echo "$0: $*" pp1 1st 2nd 3th 4th 5th 6th 7th 8th 9th echo 'f2--Print $* parameters in fun1 :' ; echo "$0: $*" } pp1 1 2 3 4 5 6 7 8 9 echo "===Print positional parameters in main :" echo "$0: $*" pp2 I II III IV V VI VII VIII IX ./pp_and_function.sh a b c d e f g h i
演示樣例2
#!/bin/bash ## filename: function_max.sh # User define Function (UDF) usage () { echo "List the MAX of the positive integers in command line. " echo "Usage: `basename $0` <num1> <num2> [ <num3> ... ]" exit } max () { [[ -z $1 || -z $2 ]] && usage largest=0 for i ; do ((i>largest)) && largest=$i ; done } ### Main script starts here ### max "$@" echo "The largest of the numbers is $largest." ./function_max.sh 1 58 111 32768 66
因爲largest變量在函數max內沒有使用local聲明,因此它是全局的
#!/bin/bash ## filename: function_max2.sh # User define Function (UDF) max2 () { if [[ -z $1 || -z $2 ]] ; then echo "Need 2 parameters to the function." ; exit fi [ $1 -eq $2 ] && { echo "The two numbers are equal." ; exit ; } (($1>$2)) && return $1 || return $2 } ### Main script starts here ### read -p "Please input two integer numbers : " n1 n2 echo "n1=$n1 , n2=$n2「 max2 $n1 $n2 return_val=$? echo "The larger of the two numbers is $return_val."
使用標準輸出返回函數值
#!/bin/bash ## filename: function_to-upper.sh # User define Function (UDF) to_upper () { local str="$@" local output output=$(tr '[a-z]' '[A-Z]'<<<"${str}") echo $output } ### Main script starts here ### to_upper "This Is a TEST" res=$(to_upper "$@") echo "$res" res=$(to_upper "$1") [[ $res == "YES" ]] && echo "Continue..." || echo "Stop" ./function_to-upper.sh YES we are ./function_to-upper.sh No we are not
系統INIT 啓動腳本的結構——/etc/rc.d/init.d/*