天天看點

shell程式設計

1.source指令

source 配置檔案    # 立即是配置檔案生效
. 配置檔案         # ./ 是目前檔案夾  .後加空格效果等于source
      

2.配置檔案

/etc/profile       #對每個使用者起作用
/etc/profile.d/*.sh
/etc/bashrc
~/bash_profile    #每個使用者的配置檔案
~/.bashrc     
~/.bash_logout    #退出執行

PS1變量
umash
PATH
umask
      

![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/20369CE2-564A-4E06-A944-684EC910E649.png)

3.登入提示資訊(issue隻對本機,如果issue.net遠端登入)

![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/C9BED461-9647-4109-9A04-0EAACC857562.png)

![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/7E325742-2430-4127-96A3-0C6B6A035821.png)

4.退出歡迎

/etc/motd   #遠端和本地都可以
      

5.echo指令

mac@MacBook-Air  ~/Desktop  echo -e "\e[1;31m 我喜歡你蘭老師,我要追你 \e[0m"
 我喜歡你蘭老師,我要追你
 \n #換行
 \t #table
      
30m 31m 32m 33m 34m 35m 36m 37m
黑色 紅色 綠色 黃色 藍色 洋紅 青色 白色

一、Bash的基礎功能

  • 曆史别名和快捷鍵
    alias mvn="/Users/liuxin/Desktop/apache-maven-3.2.1/bin"
          
  • 輸出重定向
    • 鍵盤輸出 /dev/stdin 0
    • 顯示輸出 /dev/stdout 1
    • 錯誤輸出 /dev/stderr 2
    • 覆寫重定向 >
    • 追加重定向 >>
    • 輸出報錯資訊 2>
    • 指令 >~/text 2>&1 如果指令正确就寫到text中,錯誤就輸出到2裡然後在輸出到1裡面
    • 指令&>~/text 等同于上一個,簡單寫法
    • 指令>檔案1 2>檔案2 把正确的放檔案1,錯誤的放到檔案2
  • 多指令順序執行
    • ; 多個指令順序執行 【缺點就是錯誤了,後面也執行】
    • && 連接配接服 【如果錯就不執行】
    • 指令1&&指令2 【指令1對就執行指令2,不對就不執行2了】
    • 指令1||指令2 【 指令1錯誤了,就執行指令2,對了就不執行指令2
    • ls && echo yes || echo no 【 如果正确就yes如果錯了就no
  • 輸入重定向(crtl+d檢視)
    • -c 統計位元組數
    • -w 統計單詞數
    • -i 統計行數
    • wc < access.log 或者wc access.log 統計檔案
    • Wc << ddy 當輸入的内容中遇到ddy就結束,開始統計
  • Shell統配符号
    • ? 比對一個任意字元
    • * 比對0個或多個
    • [] 比對中括号中任意一個
    • [-] 比對中括号中範圍 [a-z]任何一個 一個
    • [^] 不比對中括号中範圍 [^a-z]
  • 管道福
    • 指令1 | 指令2 【指令1的内容,作為指令2的條件】
    • ls -i /etc | more 【分螢幕檢視】
  • 黑洞
    • ls &>/dev/null 所有資訊,都扔了不看

二、Bash變量

  • export 變量名=變量值
  • Bash 進入子shell 然後export y=123 然後set就能看到y的變量
    mac@MacBook-Air  ~/Desktop  bash
    bash-3.2$ export y=123
    bash-3.2$ set
          
  • Locale 檢視語系 等同于 echo $LANG
    mac@MacBook-Air  ~/Desktop  echo $LANG
    zh_CN.UTF-8
          
  • 位置參數變量
    $n n為數字,$0代表指令本身,$1-$9 代表第一到第九個參數,十以上參數,需要大括号${10}
    $* 這個變量代表指令行中所有的參數,$* 把所有參數看成一個整體
    $@ 這個把指令行中參數差別對待,可以周遊
    $# 這個變量代表指令行中所有參數的個數
    $? 傳回零代表執行成功,反之失敗
    $$ 目前程序号
    $! 背景運作程序号
    #!bin/shell
    num1=$1
    num2=$2
    sum=$(($num1+$num2))  # 雙括号,如果是單括号,是輸出字元串,雙括号是計算
    echo $sum
          
    #!bin/shell
    #在目前目錄下建立num1目錄,然後進入num1目錄建立num2目錄
    num1=$1
    num2=$2
    cd ./
    mkdir $1
    cd ./$1
    mkdir $2
          

![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/6021D4E2-A302-455B-9162-B78530DCA613.png)

#!bin/bash

for i in "$@"
    do
        echo "$i"
    done
      
  • Read 鍵盤接受變量
參數 解釋
-p 提示資訊
-t 秒數
-n 字元限制
-s 隐藏輸入
#!/bin/bash
read -p "please input your name:" name
echo "你好,$name 先生"
      
#!/bin/bash
#時間限制30秒
read -p "please input your name in 30s:" -t 30 name
echo "你好,$name 先生"
      
#!/bin/bash
#隐藏輸入
read -p "please input your password:" -s password
echo "你好,$name 先生"
      
#!/bin/bash
#隻允許接受一個字元,如果不是一個就終止運作
read -p "please input [y|n] end:" -n 1 pw
echo "退出成功"
      

四、bash運算符

  • declare 聲明變量類型
    declare [+/-] [選項] 變量名
    > - :給變量設定類型屬性
    > + :取消變量的類型屬性
    > -a:将變量聲明為數組型
    > -i:将變量聲明為整數類型(integer)
    > -x:将變量聲明為環境變量
    > -r:将變量聲明為隻讀變量
    > -p:顯示指定變量的被聲明的類型
          
    movie[0]=1
    movie[1]=2
    declare -a movie[2]=3
    echo ${movie}
    echo ${movie[2]}
    echo ${movie[*]}
          
  • 字元串截取指令
    • cut 字段提取
      • -f 列号:提取第幾列
      • -d 分隔符: 按照指定分隔符分割 預設是table
    mac@MacBook-Air  ~/Desktop/ssh  cat student
    UID   NAME
    1 liuxin
    2 ayu
    3 haoliang
    4 sunxiao
    # 提取包含i的行數,但是不包含sun
    mac@MacBook-Air  ~/Desktop/ssh  grep i student | grep -v sun
    1 liuxin
    3 haoliang
    # 截取第二列 預設是table分隔符
    mac@MacBook-Air  ~/Desktop/ssh  grep i student | grep -v sun | cut -f 2
    liuxin
    haoliang
    mac@MacBook-Air  ~/Desktop/ssh  grep i student | grep -v sun | cut -f 2
    liuxin
    haoliang
          
    #包含bin/bash的行
    mac@MacBook-Air  ~/Desktop/ssh  grep bin/bash /etc/passwd
    _mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
    #通過:分割的第五列
    mac@MacBook-Air  ~/Desktop/ssh  grep bin/bash /etc/passwd | cut -f 5 -d ":"
    Setup User
          
    • printf
    • awk
    • grep
      • -v 取反

五、邏輯判斷語句

![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/709FED10-B1FA-4C82-BDAB-890B9BFFB681.png)

  • -e 檔案是否存在
  • -d 目錄是否存在
    test -e /root/bin/install.log
    test -d /root
    
    [-e /root/bin/install.log]
    [-d /root]
          
  • 檔案權限判斷![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/26D69B84-DA59-46BF-BB4F-5E56861F8CE8.png)
  • 兩個檔案之間進行比較

    ![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/10E950D3-F1F7-4127-BC5F-9A50BB809069.png)

  • 兩個整數之間比較

    ![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/E55462AA-4FC2-4CC5-9982-84210E1CCE84.png)

  • 字元串判斷

    ![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/17CAD21B-0719-4764-8A2E-EF4C9767CFED.png)

  • 多重判斷![](/Users/mac/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/1213327162/QQ/Temp.db/5107B155-D778-44F1-ADCF-F5EA62B13314.png)

六、流程控制語句

  • if [];then
      程式
    fi
    ---
    if[]
      then
      程式
    fi
          
    read -p "請輸入你的項目名:" projectName
    read -p "請輸入動物名:" groupId
    read -p "請輸入服務名:" categoryId
    echo -e "\e[1;31m 正在為你建立 $projectName 項目... \e[0m "
    pro=$projectName
    animal=$groupId
    category=$categoryId
    mkdir $pro && $pro建立完整 || $pro 建立失敗
    cd $pro
    mkdir src
    cd src
    mkdir main
    mkdir test
    cd main
    mkdir java
    mkdir resources
    cd java
    mkdir $animal
    cd $animal
    mkdir $category
    mkdir domain
    mkdir base
    mkdir config
    mkdir dao
    mkdir manager
    mkdir modle
    mkdir rest
    mkdir service
    mkdir util
    cd dao
    mkdir impl
    cd ../modle
    mkdir do
    mkdir dto
    mkdir vo
    cd ../service
    mkdir impl
    cd ../../resources
    mkdir config
    cd ../
    touch application.properties
    touch application-test.properties
    touch application-pro.properties
    touch application-stg.properties
          

第一個腳本

#!/bin/bash
#建立項目
read -p "請輸入你的項目名:" projectName
read -p "請輸入動物名:" groupId
read -p "請輸入服務名:" categoryId
if [-z $projectName]
    then
    read -p "請檢查輸入的内容是否為空,輸入yes退出" -n 1 pw
fi

if [-z $groupId]
    then
    read -p "請檢查輸入的内容是否為空,輸入yes退出" -n 1 pw
fi
    
if [-z categoryId]
    then
    read -p "請檢查輸入的内容是否為空,輸入yes退出" -n 1 pw
fi
pro=$projectName
animal=$groupId
category=$categoryId
mkdir $pro
cd $pro
mkdir src
cd src
mkdir main
mkdir test
cd main
mkdir java
mkdir resources
cd java
mkdir $animal
cd $animal
mkdir $category
mkdir domain
mkdir base
mkdir config
mkdir dao
mkdir manager
mkdir modle
mkdir rest
mkdir service
mkdir util
cd dao
mkdir impl
cd ../modle
mkdir do
mkdir dto
mkdir vo
cd ../service
mkdir impl
cd ../../../resources
mkdir config
touch application.properties
touch application-test.properties
touch application-pro.properties
touch application-stg.properties
cd ../../../
find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
echo -e "\033[41;37m 已經為你建立完成 $pro 項目 \033[0m"