天天看點

Bash程式設計基礎知識學習第一節

Bash程式設計基礎知識學習

一、bash的由來

1 、什麼是Bash 什麼是Shell Bash 是GNU Bourne-Again SHell,是目前大多數Linux發行版采用的Shell。

Shell 是*nix提供給使用者使用的界面。一個作業系統的底層是獨立運作的,

使用者界面和底層分開,可以最大限度的保證系統穩定。Shell就是一個特殊的程式,負責接受使用者的指令,并把系統的響應傳回給使用者。

Bash Shell

一般不需要自己安裝,在安裝發行版的同時都會安裝好。

Shell的存在是和登陸相關的,從使用者名密碼驗證通過以後,Shell就啟動了,知道你退出,Shell就結

束了運作。除了Bash Shell之外,還有很多其他的Shell

Bash程式設計基礎知識學習第一節

你可在任何程式設計語言中使用變量,但是在腳本程式設計中它們是沒有類型的,簡稱弱類型程式設計語言,在這個

變量中可以保含一個數字,一個字元串,一個單詞等。你并不需要聲明這個變量,它會在引用這個變量

時建立它。 

使用變量來實作一個簡單的Hello World 

#!/bin/bash 

STR="Hello World!" 

echo $STR

二、bash特性之檔案名通配(globbing):

Bash程式設計基礎知識學習第一節
*: 任意長度的任意字元
p*d, pad, pbd, pd
*ab*c
?: 比對任意單字元
[]: 比對指定範圍内的任意單字元
[abc], [a-z], [0-9], [0-9a-z]
[^]:比對指定範圍以外的任意單字元
[^0-9a-z]
字元集合:
[:space:] : 所有空白字元
[:punct:] : 所有标點符号
[:lower:] :所有小寫字母
[:upper:] :所有大寫字母
[:digit:]  :數字
[:alnum:] :數字和字母
[:alpha:] : 所有字母      

三、輸入輸出

>>  /dev/null      cat  /path/file  <<  /somewhere/file

練習:寫一腳本

1、添加10個使用者:tuser601-tuser610

如果使用者不存在,才添加,并以綠色顯示添加成功;如果存在,則以紅色顯示已經有此使用者;

2、顯示一共添加了多少個使用者;

#!/bin/bash
#
declare -i count=0
for i in {501..510}; do
if id tuser$i &> /dev/null; then
echo -e "\033[31mtuser$i\033[0m exists."
else
useradd tuser$i
echo -e "add user \033[32mtuser$i\033[0m successfully."
let count++
  fi
done
echo "Total add $count users."      

檔案:檔案系統(核心)

标準輸入:0
鍵盤
标準輸出:1
螢幕
錯誤輸出:2
螢幕
重定向意味着:
改變其标準位置
輸出重定向:
COMMAND > POSITION:覆寫輸出
COMMAND >> POSITION: 追加輸出
錯誤重定向:
COMMAND 2> POSITION:覆寫輸出
COMMAND 2>> POSITION: 追加輸出
合并重定向:
COMMAND &> POSITION
COMMAND > POSITION 2> &1
bash的重要特性:變量      

四、bash變量類别:

本地變量:隻對目前shell程序有效的變量;對其它shell程序無效,包目前shell程序的子程序;

VAR_NAME=VALUE

變量指派:向變量的存儲空間儲存資料

變量引用:${VAR_NAME}

Bash程式設計基礎知識學習第一節

"":弱引用,裡面的變量會被替換;

'':強引用,裡面的所有字元都是字面量,直接輸出;

Bash程式設計基礎知識學習第一節
環境變量:對目前shell程序及其子shell有效,對其它的shell程序無效;
定義:export VAR_NAME=VALUE
導出:export VAR_NAME
Export LANG=en 修改字型,隻對目前程序有效
使用者可自義環境變量
bash有許多内置的環境變量
撤消變量:unset VAR_NAME
隻讀變量:readonly VAR_NAME
局部變量:  local      
Bash程式設計基礎知識學習第一節
對shell腳本中某代碼片斷有效;通常用于函數本地;
local VAR_NAME=VALUE
位置變量:
$1, $2, ..., ${10}
特殊變量:
$?
檢視目前shell程序中的所有變量:set
檢視目前shell程序中的所有環境變量:export, printenv, env
登入類型:
五、腳本在電腦中執行次序
互動式:
直接通過終端輸入賬号和密碼登入;
使用su -l USERNAME 或 su - USERNAME;
非互動式:
su USERNAME
圖形界面下打開的終端
執行腳本
通過編輯配置檔案修改的配置生效?
1、退出并重新登入;
2、讓bash重讀此配置檔案;
. FILE
source FILE
互動登入的使用者:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> 
/etc/bashrc
非互動登入的使用者:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
文法高亮:
:syntax on|off
搜尋高亮:
:set hlsearch
:set nohlsearch
配置檔案:
全局:/etc/vimrc
使用者:~/.vimrc      

六、shell腳本格式:

第一行,頂格:
shebang
#!/bin/bash
#!/usr/bin/python
其它的以#開頭的行均為注釋,會被解釋器忽略      

練習:寫一個腳本

1、腳本可以接受一個以上的檔案路徑作為參數;

2、顯示每個檔案所擁的行數;

3、顯示本次共對多少個檔案執行了行數統計;

腳本

Bash程式設計基礎知識學習第一節

執行結果

Bash程式設計基礎知識學習第一節

練習:寫一個腳本

1、顯示/etc/passwd檔案中位于檔案的第偶數行的使用者名;并顯示共有多少個這樣的使用者;

腳本

Bash程式設計基礎知識學習第一節

結果

Bash程式設計基礎知識學習第一節

七、bash當中的關鍵詞法基礎

1、數值測試條件符和字元串操作符

Bash程式設計基礎知識學習第一節

2、字元串測試

Bash程式設計基礎知識學習第一節

3、邏輯與或運算

-a 與  -o 或  ! 非  、   &&   且   ||   且  前面執行完了,執行
後面的,前面錯誤後面就不執行啦。
組合條件測試:在多個條件間實作邏輯運算
與:[ condition1 -a condition2 ]
condition1 && condition2
或:[ condition1 -o condition2 ]
condition1 || condition2
非:[ -not condition ]
! condition      
Bash程式設計基礎知識學習第一節
Bash程式設計基礎知識學習第一節

練習:提示使用者輸入一個使用者名,如果使用者存在,就顯示使用者的ID号和shell;否則顯示使用者不

存在;  顯示完成之後不退出,再次重複前面的操作,直到使用者輸入q或quit為止;

read -p "Plz enter a username: " userName
  while [ "$userName" != 'q' -a "$userName" != 'quit' ]; do
  if id $userName &> /dev/null; then
      grep "^$userName\>" /etc/passwd | cut -d: -f3,7
  else
  echo "No such user."
  fi
  read -p "Plz enter a username again: " userName
  Done      

練習:求100以内所有偶數之和;要求使用取模方法;

#!/bin/bash
declare -i counter=1
declare -i sum=0
while [ $counter -le 100 ]; do
    if [ $[$counter%2] -eq 0 ]; then
        let sum+=$counter
    fi
    let counter++
done
echo $sum      

2、檔案測試:

-e 檔案名:如果檔案存在則為真
-r 檔案名:如果檔案存在且可讀則為真
-w 檔案名:如果檔案存在且可寫則為真
-x 檔案名:如果檔案存在且可執行則為真
-s 檔案名:如果檔案存在且至少有一個字元則為真
-d 檔案名:如果檔案存在且為目錄則為真
-f 檔案名:如果檔案存在且為普通檔案則為真
-c 檔案名:如果檔案存在且為字元型特殊檔案則為真
-b 檔案名:如果檔案存在且為塊特殊檔案則為真      
Bash程式設計基礎知識學習第一節

練習:寫一個腳本,完成如下任務:

1、分别複制/var/log下的檔案至/tmp/logs/目錄中;
2、複制目錄時,才使用cp -r
3、複制檔案時,使用cp
4、複制連結檔案,使用cp -d
5、餘下的類型,使用cp -a
if [ -d $1 ];then
cp -r /var/log/$1 /tmp/logs
elif [ -d $1 ];then
cp -r /var/log/$1 /tmp/logs
if [ -f $1 ];then
cp  /var/log/$1 /tmp/logs
else
cp -a /var/log/$1 /tmp/logs
fi      
Bash程式設計基礎知識學習第一節

轉載于:https://blog.51cto.com/1983939925/1534951

繼續閱讀