注意 : 在VIM中使用set paste格式化vim,再粘貼內容,格式就不會亂html
關係運算符mysql
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,若是是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數是否小於右邊的,若是是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數是否大於等於右邊的,若是是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,若是是,則返回 true。 | [ $a -le $b ] 返回 true。 |
運算符 | 說明 | 舉例 |
---|---|---|
! | 非運算,表達式爲 true 則返回 false,不然返回 true。 | [ ! false ] 返回 true。 |
-o | 或運算,有一個表達式爲 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 與運算,兩個表達式都爲 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
-lt #表示小於linux
-gt #表示大於nginx
-eq #表示等於git
-qw #表示是否github
-ne #表示非、不等於正則表達式
-ge #表示 大於等於sql
-b #表示判斷是否是shell
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 檢測兩個字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 檢測字符串長度是否爲0,爲0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字符串長度是否爲0,不爲0返回 true。 | [ -n "$a" ] 返回 true。 |
$ | 檢測字符串是否爲空,不爲空返回 true。 | [ $a ] 返回 true。 |
正則表達式元字符vim
特殊的元字符
擴展的正則表達式
Linux 教程
Linux 教程Linux 簡介Linux 安裝Linux 系統啓動過程Linux 系統目錄結構Linux 忘記密碼解決方法Linux 遠程登陸Linux 文件基本屬性Linux 文件與目錄管理Linux 用戶和用戶組管理Linux 磁盤管理Linux vi/vimlinux yum 命令
Shell 教程Shell 變量Shell 傳遞參數Shell 數組Shell 運算符Shell echo命令Shell printf命令Shell test 命令Shell 流程控制Shell 函數Shell 輸入/輸出重定向Shell 文件包含
Linux 命令大全Nginx 安裝配置MySQL 安裝配置
上一章節咱們學習了 Shell 的 echo 命令,本章節咱們來學習 Shell 的另外一個輸出命令 printf。
printf 命令模仿 C 程序庫(library)裏的 printf() 程序。
printf 由 POSIX 標準所定義,所以使用 printf 的腳本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的參數,外面能夠在 printf 中使用格式化字符串,還能夠制定字符串的寬度、左右對齊方式等。默認 printf 不會像 echo 自動添加換行符,咱們能夠手動添加 \n。
printf 命令的語法:
printf format-string [arguments...]
參數說明:
實例以下:
$ echo "Hello, Shell" Hello, Shell $ printf "Hello, Shell\n" Hello, Shell $
接下來,我來用一個腳原本體現printf的強大功能:
#!/bin/bash # author:菜鳥教程 # url:www.runoob.com printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
執行腳本,輸出結果以下所示:
姓名 性別 體重kg 郭靖 男 66.12 楊過 男 48.65 郭芙 女 47.99
%s %c %d %f都是格式替代符
%-10s 指一個寬度爲10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,若是不足則自動以空格填充,超過也會將內容所有顯示出來。
%-4.2f 指格式化爲小數,其中.2指保留2位小數。
更多實例:
#!/bin/bash # author:菜鳥教程 # url:www.runoob.com # format-string爲雙引號 printf "%d %s\n" 1 "abc" # 單引號與雙引號效果同樣 printf '%d %s\n' 1 "abc" # 沒有引號也能夠輸出 printf %s abcdef # 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用 printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 若是沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n"
執行腳本,輸出結果以下所示:
1 abc 1 abc abcdefabcdefabc def a b c d e f g h i j and 0
序列 | 說明 |
---|---|
\a | 警告字符,一般爲ASCII的BEL字符 |
\b | 後退 |
\c | 抑制(不顯示)輸出結果中任何結尾的換行字符(只在%b格式指示符控制下的參數字符串中有效),並且,任何留在參數裏的字符、任何接下來的參數以及任何留在格式字符串中的字符,都被忽略 |
\f | 換頁(formfeed) |
\n | 換行 |
\r | 回車(Carriage return) |
\t | 水平製表符 |
\v | 垂直製表符 |
\\ | 一個字面上的反斜槓字符 |
\ddd | 表示1到3位數八進制值的字符。僅在格式字符串中有效 |
\0ddd | 表示1到3位的八進制值字符 |
3一、題目要求 :獲取網卡ip、 獲取網卡ip顯示顏色
提示用戶輸入網卡的 名字,而後咱們用腳本輸出網卡的ip,須要考慮下面問題:
#!/bin/bash ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/eth.list while : do eths=`cat /tmp/eth.list |xargs` read -p "Please input a if name(The eths is `echo -e "\033[31m$eths\033[0m"`): " eth if [ -z "$eth" ] then echo "Please input a if name." continue fi if ! grep -qw "$eth" /tmp/eth.list then echo "The if name is error." continue else break fi done if_ip() { ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt n=`wc -l /tmp/$1.txt|awk '{print $1}'` if [ $n -eq 0 ] then echo "There is no ip address on the eth." else echo "The ip addreess is:" for ip in `cat /tmp/$1.txt` do echo -e "\033[33m$ip\033[0m" done fi } if_ip $eth
實例 :
[root@localhost ~]# # ip add # 查看機器上全部的網卡
[root@localhost ~]# # ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' #查看全部的網卡列表
[root@localhost ~]# # ip add show dev ens33 | grep ' inet ' |awk '{print $2}' #獲取ens33網卡的IP,並精準截取IP所在的第二行。/24表示是IP地址的netmask網段
輸入網卡的名字 ,運行腳本,查看結果,
若是輸入了。錯的網卡名字,會提示網卡名字錯誤。輸入正確的網卡名字,就直接顯示IP地址,而後退出。
未添加顏色,執行腳本以後,顯示的結果。
注意 :
cat /tmp/eth.list |xargs #在腳本中表示列出全部的網卡的名字
[root@localhost ~]# echo "Please input a if name(The eths is 'cat /tmp/eth.list|xargs')" #查看網卡列表中的eth網卡
if [ -z "$eth" ] #表達的含義,是若是eth是空的,就提示用戶 : Please input a if name.
if ! grep -qw "$eth" /tmp/eth.list #表達的含義,是若是eth是不在/tmp/eth.list 文件中,就提示用戶 : The if name is error.
if_ip #函數的名字
ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt #顯示IP網卡的IP地址,並把輸出的結果存入/tmp/$1.txt臨時文件中 ,$1表示第一個參數。
wc -l /tmp/$1.txt|awk '{print $1} #先統計/tmp/$1.txt臨時文件中的行數。
if [ $n -eq 0 ] #若是eq等於0,那麼提示用戶 「There is no ip address on the eth.」
31.2 獲取網卡ip顯示顏色
案例
echo顯示帶顏色,須要使用參數-e
格式以下 :
echo -e "\033"[字背景顏色;文字顏色m字符串\033[0m
例如 :
echo -e"\033[41;37m TonyZhang \033[0m"
其中41的位置表明底色,37的位置是表明字的顏色
注 :
一、字背景顏色和文字顏色之間是英文的」""」
二、文字顏色後面有個m
三、字符串先後能夠沒有空格,若是有的話,輸出也是一樣有空格
例子 :
echo -e "/033[30m 黑色字 \033[0m"
echo -e "/033[31m 紅色字 \033[0m"
echo -e "/033[30m 綠色字 \033[0m"
echo -e "/033[30m 黃色字 \033[0m"
echo -e "/033[30m 藍色字 \033[0m"
echo -e "/033[30m 紫色字 \033[0m"
echo -e "/033[30m 藍色字 \033[0m"
echo -e "/033[30m 白色字 \033[0m"
echo -e "/033[30m 黑底白色字 \033[0m"
echo -e "/033[30m紅底 白字 \033[0m"
echo -e "/033[30m 綠底白字 \033[0m"
echo -e "/033[30m 黃底白字 \033[0m"
echo -e "/033[30m 藍底白字 \033[0m"
爲網卡的名稱顯示顏色。
#!/bin/bash ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/eth.list while : do eths=`cat /tmp/eth.list |xargs` read -p "Please input a if name(The eths is '/tmp/eth.list|xargs'): " eth if [ -z "$eth" ] then echo "Please input a if name." continue fi if ! grep -qw "$eth" /tmp/eth.list then echo "The if name is error." continue else break fi done if_ip() { ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt n=`wc -l /tmp/$1.txt|awk '{print $1}'` if [ $n -eq 0 ] then echo "There is no ip address on the eth." else echo "The ip addreess is:" `cat /tmp/$1.txt fi } if_ip $eth
添加顏色,執行腳本以後,顯示的結果。
3二、題目要求 : 列出目錄內容
寫一個腳本,實現以下功能:
【核心要點】
$#參數個數
test -d filename #
find $d -type d #把當前文件下的文件所有列出來
#!/bin/bash if [ $# -eq 0 ] then echo "當前目錄下的文件是:" ls . else for d in $@ do if [ -d $d ] then echo "目錄$d下有這些子目錄:" find $d -type d else echo "並無該目錄:$d" fi done fi
實例 :
查看當前目錄下的文件
顯示tmp和/usr/local目錄下的文件
3三、題目要求 : 下載文件
定義一個shell函數,能接受兩個參數,知足如下要求:
#!/bin/bash if [ $# -ne 2 ] then echo "你必需要輸入兩個參數,第一個參數是網址,第二個參數是目錄." exit 1 fi if [ ! -d $2 ] then while : do echo "你輸入的第二個參數,並非一個存在的目錄。是否要建立該目錄呢?(y|n): "c case $c in y|Y) mkdir -p $2 ;; n|N) exit 51 ;; *) echo "請輸入y或者n." continue ;; esac done else cd $2 wget $1 if [ $? -eq 0 ] then exit 0 else echo "下載失敗." exit 52 fi fi
實例 :
運行腳本,獲得結果是1,說明腳本沒問題。返回52給調用腳本,給的目錄不存在,則下載文件失敗,
腳本解析失敗,緣由後面沒有兩個參數,
輸入兩個參數,第一個參數是網址,第二個參數是目錄時,就解析成功了。
查看下載的文件
注意 :
if [ $# -ne 2 ] #若是參數不等於2,提示 : 你必需要輸入兩個參數,第一個參數是網址,第二個參數是目錄.
if [ ! -d $2 ] #若是$2是一個不存在的目錄,提示 :你輸入的第二個參數,並非一個存在的目錄。是否要建立該目錄呢?(y|n):
mkdir -p $2 #若是客戶輸入了y或者Y,建立這個目錄。若是輸入N|n,直接退出。
cd $2
wget $1 #表示若是沒有,就cd切換到$2,而後wegt下載
if [ $? -eq 0 ] #若是$?等於0,表示下載成功就退出,不然就是下載失敗。
報錯緣由 : 未安裝命令。解決辦法 : yum install -y wget
3四、題目要求 : 猜數字
寫一個shell腳本,能實現以下需求:
#!/bin/bash n=$[$RANDOM%101] while : do read -p "請輸入一個0-100的數字:" n1 if [ -z "$n1" ] then echo "必需要輸入一個數字。" continue fi n2=`echo $n1 |sed 's/[0-9]//g'` if [ -n "$n2" ] then echo "你輸入的數字並非正整數." continue else if [ $n -gt $n1 ] then echo "你輸入的數字小了,請重試。" continue elif [ $n -lt $n1 ] then echo "你輸入的數字大了,請重試。" continue else echo "恭喜你,猜對了!" break fi fi done
實例 :
獲取一個隨機的數字
獲取一個100之內的隨機數字
運行0-99的腳本,輸入一個正確的隨機數字,就結束了。
35.一、題目要求 : 根據名字得數字
寫一個shell腳本,能實現以下需求:
#!/bin/bash f=/tmp/user_number.txt while : do read -p "Please input a username: " u u1='echo $u|sed 's/[a-zA-Z0-9]//g'' if [ -n "$u1" ] then echo "你輸入的用戶名不符合規範,正確的用戶名應該是大小寫字母和數字的組合" continue else if [ -f $f ] then u_n=`awk -v uu=$u '$1==uu {print $2}' $f` if [ -n "$u_n" ] then echo "用戶$u對應的數字是:$u_n" else n=$[$RAMDOM%100] echo "用戶$u對應的數字是 : $n" echo $u $n >> $f fi else n=$[$RAMDOM%100] echo "用戶$u對應的數字是:$n" echo $u $n >> $f fi fi done
實例 :
查看運行的結果,/tmp/user_number.txt文件沒有建立。
當第二次執行腳本時,/tmp/user_number.txt就建立了。輸入q或者大寫的 Q,退出 運行的腳本。不建議使用ctrl +c.
注意 :
u_n #u_n的值爲1
if [ -n "$u_n" ] #若是u_n不爲空,那麼$u對應的變量就是$u_n ;不然,從新創造一個隨機數。
`echo $u|sed 's/[a-zA-Z0-9]//g'` #若是輸入u的值,是空的,說明用戶輸入的名字是對的
-n "$u1" #若是輸入的不爲空,。提示 「你輸入的用戶名不符合規範,正確的用戶名應該是大小寫字母和數字的組合」
"$u $n" >>$f #將用戶名和對應的數字,記錄到/tmp/user_number.txt文件中
awk '{print $2}' $f|grep -qw $n #查找/tmp/user_number.txt文件中第二段截取出來,
u_n=`awk -v uu=$u '$1==uu {print $2}' $f` #求用戶名中的行數,並截取/tmp/user_number.txt文件中第二段
35.2 根據名字得數字優化
#!/bin/bash f=/tmp/user_number.txt j_n() { while : do n=$[RANDOM%100] if awk '{print $2}' $f|grep -qw $n then continue else break fi done } while : do read -p "Please input a username: " u if [ -z "$u" ] then echo "請輸入用戶名." continue fi if [ $u == "q" ] || [ $u == "Q" ] then exit fi u1=`echo $u|sed 's/[a-zA-Z0-9]//g'` if [ -n "$u1" ] then echo "你輸入的用戶名不符合規範,正確的用戶名應該是大小寫字母和數字的組合" continue else if [ -f $f ] then u_n=`awk -v uu=$u '$1==uu {print $2}' $f` if [ -n "$u_n" ] then echo "用戶$u對應的數字是:$u_n" else j_n echo "用戶$u對應的數字是:$n" echo "$u $n" >>$f fi else j_n echo "用戶$u對應的數字是:$n" echo $u $n >> $f fi fi done
注意 :
if awk '{print $2}' $f|grep -qw $n #表示查看/tmp/user_number.txt文件第二端,是否已經出現了$n隨機數?
3六、題目要求 : 一個數字的行
系統logrotate工具,能夠完成日誌切割、歸檔。寫一個shell腳本實現相似的歸檔功能。 舉例: 假如服務的輸出日誌是1.log,要求天天歸檔一個,1.log次日就變成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5。
#!/bin/bash cd /data/logs log=1.log mv_log() { [ -f $1 ] && mv $1 $2 } [ -f 1.log.5 ] && rm -f 1.log.5 for i in `seq 4 -1 1` do j=$[$i+1] mv_log $log.$i $log.$j done mv 1.log 1.log.1
實例 :
統計行中出現的數字
注意 :
echo $line |sed 's/[^0-9]//g' |wc -L #統計全部的行,將全部的非數字所有刪除,只剩下數字,並計算數字的個數。
3七、題目要求 : 日誌切割歸檔
系統logrotate工具,能夠完成日誌切割、歸檔。寫一個shell腳本實現相似的歸檔功能。 舉例: 假如服務的輸出日誌是1.log,要求天天歸檔一個,1.log次日就變成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5。
#!/bin/bash cd /data/logs log=1.log mv_log() { [ -f $1 ] && mv $1 $2 } [ -f 1.log.5 ] && rm -f 1.log.5 for i in `seq 4 -1 1` do j=$[$i+1] mv_log $log.$i $log.$j done mv 1.log 1.log.1
實例 :
建立/data/logs目錄 , 而後在1.log裏面寫入111
往2.log日誌裏面寫入222,按照順序,依次在日誌裏面寫入對應的數字,如:3.log裏面寫333.
查看腳本是否有問題,在1.log日誌文件中寫入000.而後執行 「cat *」命令,查看運行結果。應該系統日誌只有兩個,因此顯示的結果到222,就結束了。
注意 :
log=1.log #log是定義的變量
mv_log() #定義的函數
[ -f $1 ] && mv $1 $2 #若是$1存在,就把$1改爲$2
[ -f 1.log.5 ] && rm -f 1.log.5 #若是1.log.5存在,就刪除1.log.5
寫一個shell腳本,把192.168.0.0/24網段在線的ip列出來。
#!/bin/bash for i in `seq 1 254` do if ping -c 2 -W 2 192.168.0.$i >/dev/null 2>/dev/null then echo "192.168.0.$i 是通的." else echo "192.168.0.$i 不通." fi done
實例 :
有兩個IP地址,測試一個通的,返回ok,一個不通的,什麼都不返回。
執行腳本,查看腳本運行的結果。由於這個網段,不通,因此所有都不通
注意 :
for i in `seq 1 254` #ping的IP地址範圍1-254
if ping -c 2 -W 2 192.168.0.$i >/dev/null 2>/dev/null #把能ping通的IP地址寫入到/dev/nul,錯誤的也寫入/dev/null 。-c 2表示ping兩次,-W 2 表示ping的時間爲兩秒
寫一個shell腳本,檢查指定的shell腳本是否有語法錯誤,如有錯誤,首先顯示錯誤信息,而後提示用戶輸入q或者Q退出腳本,輸入其餘內容則直接用vim打開該shell腳本。
#!/bin/bash sh -n $1 2>/tmp/sh.err if [ $? -ne 0 ] then cat /tmp/sh.err read -p "請輸入q/Q退出腳本。" c if [ -z "$c"] then vim $1 exit 0 fi if [ $c == q ] || [ $c == Q ] then exit 0 else vim $1 exit 0 fi else echo "腳本$1沒有語法錯誤." fi
實例 :
腳本運行結果。
注意 :
sh -n $1 2>/tmp/sh.err #將錯誤的輸出到/tmp/sh.err
if [ $? -ne 0 ] #$?不等於0,說明有語法錯誤。
40、題目要求 : 格式化數字
輸入一串隨機數字,而後按千分位輸出。 好比輸入數字串爲「123456789」,輸出爲123,456,789。
#!/bin/bash n=`echo $1|wc -L` for d in `echo $1|sed 's/./& /g'` do n2=$[$n%3] if [ $n2 -eq 0 ] then echo -n ",$d" else echo -n "$d" fi n=$[$n-1] done |sed 's/^,//' echo
實例 :
sed實現數字之間的自動空一格
腳本正確執行的結果
注意 :
n=`echo $1|wc -L` #n表示計算數字的長度,$1是數字串。
for d in `echo $1|sed 's/./& /g'` #sed實現數字的自動空一格,&表明前面的點。
n2=$[$n%3] #$[$n%3] 表示$n除以3,而後添加逗號間隔。
if [ $n2 -eq 0 ] #0表示$n2可以被3整除
echo -n ",$d" #能被3整除的,添加逗號間隔。
echo -n "$d" #不能被3整除的,不添加逗號間隔。
來源 :https://github.com/aminglinux/shell100/blob/master/13.md