shell 一

1.shell是什麼

shell是一種腳本語言
能夠使用邏輯判斷、循環等語法
能夠自定義函數
shell是系統命令的集合
shell腳本能夠實現自動化運維,能大大增長咱們的運維效率

2.shell腳本結構和執行

開頭須要加#!/bin/bash
以#開頭的行做爲解釋說明
腳本的名字以.sh結尾,用於區分這是一個shell腳本
[root@feature1 ~]# cat 1.sh
#!/bin/bash
touch /tmp/1.txt
chmod 600 /tmp/1.txt
mv /tmp/1.txt /tmp/2.txt
[root@feature1 ~]# bash 1.sh
[root@feature1 ~]# bash -x 1.sh
+ touch /tmp/1.txt
+ chmod 600 /tmp/1.txt
+ mv /tmp/1.txt /tmp/2.txt
[root@feature1 ~]# bash -n 1.sh
#-n 查看有沒有語法錯誤
執行方法有兩種
chmod +x 1.sh; ./1.sh
bash 1.sh
查看腳本執行過程 bash -x 1.sh
查看腳本是否語法錯誤  bash -n 1.sh

3.date命令

date  +%Y-%m-%d, date +%y-%m-%d 年月日
date  +%H:%M:%S = date +%T 時間


[root@feature1 ~]# date +%Y-%m-%d
2019-03-08
[root@feature1 ~]# date +%Y
2019
[root@feature1 ~]# date +%y
19
[root@feature1 ~]# date +%m
03
[root@feature1 ~]# date +%d
08
[root@feature1 ~]# date +%M
43
[root@feature1 ~]# date +%H
15
[root@feature1 ~]# date +%S
41
[root@feature1 ~]# date +%F
2019-03-08
[root@feature1 ~]# date +%T
15:43:51
[root@feature1 ~]# date +%Y@%m@%d
2019@03@08


date +%s  時間戳
[root@feature1 ~]# date +%s
1552031164

date -d @1504620492
[root@feature1 ~]# date -d @1
Thu Jan  1 08:00:01 CST 1970
[root@feature1 ~]# date -d @1552031164
Fri Mar  8 15:46:04 CST 2019


date -d "+1day"  一天後
date -d "-1 day"  一天前
date -d "-1 month" 一月前
date -d "-1 min"  一分鐘前

[root@feature1 ~]# date -d "+1day"
Sat Mar  9 15:48:31 CST 2019
[root@feature1 ~]# date -d "-1day"
Thu Mar  7 15:48:40 CST 2019
[root@feature1 ~]# date -d "-1hour"
Fri Mar  8 14:48:47 CST 2019
[root@feature1 ~]# date -d "+hour"
Fri Mar  8 16:48:52 CST 2019
[root@feature1 ~]# date -d "+week"
Fri Mar 15 15:48:59 CST 2019


date +%w, date +%W 星期
[root@feature1 ~]# date +%w
5
[root@feature1 ~]# date +%W
09
[root@feature1 ~]# date -d "-70day" +%W
52
[root@feature1 ~]# date -d "-50day" +%W
02

4.shell腳本中的變量

當腳本中使用某個字符串較頻繁而且字符串長度很長時就應該使用變量代替
使用條件語句時,常使用變量    if [ $a -gt 1 ]; then ... ; fi
引用某個命令的結果時,用變量替代   n=`wc -l 1.txt`
寫和用戶交互的腳本時,變量也是必不可少的  
read -p "Input a number: " n; echo $n   若是沒寫這個n,能夠直接使用$REPLY
內置變量 $0, $1, $2…    $0表示腳本自己,$1 第一個參數,$2 第二個 ....       $#表示參數個數
[root@feature1 ~]# a=`date +%w`
[root@feature1 ~]# echo $a
[root@feature1 ~]# a=$(date +%W)
[root@feature1 ~]# echo $a
09
[root@feature1 ~]# read -p "請輸入一個數字:" n
請輸入一個數字:8
[root@feature1 ~]# echo $n
8
[root@feature1 ~]# read -p "請輸入一個數字:"
請輸入一個數字:6
[root@feature1 ~]# echo $REPLY
6

[root@feature1 ~]# vim 2.sh
#!/bin/bash
echo "\$1=$1"
echo "第二個參數是$2"
echo "第二個參數是$3"
echo "本腳本一共有$#個參數"

[root@feature1 ~]# sh 2.sh 1 2 3 a
$1=1
第二個參數是2
第二個參數是3
本腳本一共有4個參數

[root@feature1 ~]# sh 2.sh aa bb cc dd
$1=aa
第二個參數是bb
第二個參數是cc
本腳本一共有4個參數
[root@feature1 ~]# sh 2.sh aa bb cc dd 55
$1=aa
第二個參數是bb
第二個參數是cc
本腳本一共有5個參數
[root@feature1 ~]# sh 2.sh aa bb
$1=aa
第二個參數是bb
第二個參數是
本腳本一共有2個參數

[root@feature1 ~]# cat 2.sh
#!/bin/bash
echo "\$1=$1"
echo "第二個參數是$2"
echo "第二個參數是$3"
echo "本腳本一共有$#個參數"
echo 「\$0是$0」
[root@feature1 ~]# sh 2.sh 2 o
$1=2
第二個參數是o
第二個參數是
本腳本一共有2個參數
「$0是2.sh」
[root@feature1 ~]# chmod +x 2.sh
[root@feature1 ~]# ./2.sh
$1=
第二個參數是
第二個參數是
本腳本一共有0個參數
「$0是./2.sh」

數學運算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
[root@feature1 ~]# a=1
[root@feature1 ~]# b=2
[root@feature1 ~]# c=$(($a+$b))
[root@feature1 ~]# echo $c
3
[root@feature1 ~]# c=$[$a+$b]
[root@feature1 ~]# echo $c
3
# $(($a+$b))=$[$a+$b]

5.shell中的邏輯判斷

格式1:if 條件 ; then 語句; fi
格式2:if 條件; then 語句; else 語句; fi
格式3:if …; then … ;elif …; then …; else …; fi
邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意處處都是空格

[root@feature1 ~]# vim if1.sh
#!/bin/bash
a=10
if [ $a -gt 5]
then
    echo ok
fi
[root@feature1 ~]# sh -x if1.sh
+ a=10
+ '[' 10 -gt '5]'
if1.sh: line 3: [: missing `]'
#直接命令行也是能夠的。換行用;
[root@feature1 ~]# a=10; if [ $a -gt 5 ]; then echo ok; fi
ok
[root@feature1 ~]# a=10
[root@feature1 ~]# if [ $a -gt 5 ]
> then
> echo ok
> fi
ok
[root@feature1 ~]# if [ $a -gt 5 ]; then echo ok; fi
[root@feature1 ~]# if [ $a -gt 5 ]; then echo ok; else echo "not ok"; fi
ok

[root@feature1 ~]# vim if1.sh
[root@feature1 ~]# cat if1.sh
#!/bin/bash
a=10
if [ $a -gt 5]
then
    echo ok
else
    echo "not ok"
fi

[root@feature1 ~]# vim if2.sh
[root@feature1 ~]# cat if2.sh
#!/bin/bash
a=2
if [ $a -gt 5 ]
then
    echo ok
elif [ $a -gt 3 ]
then
    echo "very ok"
else
    echo "not ok"
fi
[root@feature1 ~]# sh -x if2.sh
+ a=2
+ '[' 2 -gt 5 ']'
+ '[' 2 -gt 3 ']'
+ echo 'not ok'
not ok

#邏輯判斷的嵌套
[root@feature1 ~]# vim if3.sh
[root@feature1 ~]# cat if3.sh
#!/bin/bash
a=10
if [ $a -gt 5 ]
then
   if [ $a -lt 20 ]
then
       echo "ok"
   else
       echo "very ok"
   fi
else
    echo "not ok"
fi
[root@feature1 ~]# sh -x if3.sh
+ a=10
+ '[' 10 -gt 5 ']'
+ '[' 10 -lt 20 ']'
+ echo ok
ok



能夠使用 && || 結合多個條件
if [ $a -gt 5 ] && [ $a -lt 10 ]; then  == if [ $a -get 5 -a $a -lt 10]
if [ $b -gt 5 ] || [ $b -lt 3 ]; then == if [$b -gt 5 -0 $ -lt 3]

6.if 判斷文件、目錄屬性

[ -f file ]判斷是不是普通文件,且存在
[ -d file ] 判斷是不是目錄,且存在
[ -e file ] 判斷文件或目錄是否存在
[ -r file ] 判斷文件是否可讀
[ -w file ] 判斷文件是否可寫
[ -x file ] 判斷文件是否可執行
[root@feature1 ~]# if [ -f 1.sh ]; then echo 1; fi
1
[root@feature1 ~]# if [ -d 1.sh ]; then echo 1; fi
[root@feature1 ~]# ls -l /tmp/mysql.sock
srwxrwxrwx. 1 mysql mysql 0 Mar  5 09:38 /tmp/mysql.sock
[root@feature1 ~]# if [ -d /tmp/mysql.sock ]; then echo 1; fi
[root@feature1 ~]# if [ -f /tmp/mysql.sock ]; then echo 1; fi
[root@feature1 ~]# if [ -d /tmp/mysql.sock ]; then echo 1; fi
[root@feature1 ~]# if [ -e /tmp/mysql.sock ]; then echo 1; fi
1
[root@feature1 ~]# if [ -e /tmp/ ]; then echo 1; fi
1
[root@feature1 ~]# if [ -e /tmp/12 ]; then echo 1; fi
#判斷/root/ 下有沒有ab.sh 沒有的話 執行echo "1111">ab.sh
[root@feature1 ~]# if [ -f /root/ab.sh ]; then echo 1; else echo "1111" >ab.sh; fi
[root@feature1 ~]# cat ab.sh
1111
root用戶對文件的讀寫比較特殊,即便一個文件沒有給root用戶讀或者寫的權限,root用戶照樣能夠讀或者寫

7.if判斷的一些特殊用法

  • if [ -z "$a" ] 這個表示當變量a的值爲空時會怎麼樣
  • if [ -n "$a" ] 表示當變量a的值不爲空
[root@feature1 ~]# a=
[root@feature1 ~]# echo $a

[root@feature1 ~]# if [ -z "$a" ]; then echo "a爲空"; fi
a爲空
[root@feature1 ~]# a=1
[root@feature1 ~]# if [ -z "$a" ]; then echo "a爲空"; fi
#加!是取反
[root@feature1 ~]# if [ ! -z "$a" ]; then echo "a不爲空"; fi
a不爲空
[root@feature1 ~]# if [ -n "$a" ]; then echo "a不爲空"; fi
a不爲空
[root@feature1 ~]# ls 123
[root@feature1 ~]# echo $?
0
[root@feature1 ~]# ls 35
ls: cannot access 35: No such file or directory
[root@feature1 ~]# echo $?
2

[root@feature1 ~]# if ! ls 35 ; then echo "指令執行不成功"; fi
ls: cannot access 35: No such file or directory
指令執行不成功
[root@feature1 ~]# if ! ls 35 &>/dev/null; then echo "指令執行不成功"; fi
指令執行不成功
  • if grep -q '123' 1.txt; then 表示若是1.txt中含有'123'的行時會怎麼樣 if [ ! -e file ]; then 表示文件不存在時會怎麼樣
[root@feature1 ~]# if grep -q '123' 1.sh ; then echo "1.sh文件中包含有123關鍵字"; fi
  • if (($a<1)); then …等同於 if [ $a -lt 1 ]; then… [ ] 中不能使用<,>,==,!=,>=,<=這樣的符號
[root@feature1 ~]# if (($a>2)); then echo "a大於2"; fi
[root@feature1 ~]# a=10
[root@feature1 ~]# if (($a>2)); then echo "a大於2"; fi
a大於2
相關文章
相關標籤/搜索