Bash程式設計基礎知識學習
一、bash的由來
1 、什麼是Bash 什麼是Shell Bash 是GNU Bourne-Again SHell,是目前大多數Linux發行版采用的Shell。
Shell 是*nix提供給使用者使用的界面。一個作業系統的底層是獨立運作的,
使用者界面和底層分開,可以最大限度的保證系統穩定。Shell就是一個特殊的程式,負責接受使用者的指令,并把系統的響應傳回給使用者。
Bash Shell
一般不需要自己安裝,在安裝發行版的同時都會安裝好。
Shell的存在是和登陸相關的,從使用者名密碼驗證通過以後,Shell就啟動了,知道你退出,Shell就結
束了運作。除了Bash Shell之外,還有很多其他的Shell
你可在任何程式設計語言中使用變量,但是在腳本程式設計中它們是沒有類型的,簡稱弱類型程式設計語言,在這個
變量中可以保含一個數字,一個字元串,一個單詞等。你并不需要聲明這個變量,它會在引用這個變量
時建立它。
使用變量來實作一個簡單的Hello World
#!/bin/bash
STR="Hello World!"
echo $STR
二、bash特性之檔案名通配(globbing):
*: 任意長度的任意字元
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}
"":弱引用,裡面的變量會被替換;
'':強引用,裡面的所有字元都是字面量,直接輸出;
環境變量:對目前shell程序及其子shell有效,對其它的shell程序無效;
定義:export VAR_NAME=VALUE
導出:export VAR_NAME
Export LANG=en 修改字型,隻對目前程序有效
使用者可自義環境變量
bash有許多内置的環境變量
撤消變量:unset VAR_NAME
隻讀變量:readonly VAR_NAME
局部變量: local
對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、顯示本次共對多少個檔案執行了行數統計;
腳本
執行結果
練習:寫一個腳本
1、顯示/etc/passwd檔案中位于檔案的第偶數行的使用者名;并顯示共有多少個這樣的使用者;
腳本
結果
七、bash當中的關鍵詞法基礎
1、數值測試條件符和字元串操作符
2、字元串測試
3、邏輯與或運算
-a 與 -o 或 ! 非 、 && 且 || 且 前面執行完了,執行
後面的,前面錯誤後面就不執行啦。
組合條件測試:在多個條件間實作邏輯運算
與:[ condition1 -a condition2 ]
condition1 && condition2
或:[ condition1 -o condition2 ]
condition1 || condition2
非:[ -not condition ]
! condition
練習:提示使用者輸入一個使用者名,如果使用者存在,就顯示使用者的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 檔案名:如果檔案存在且為塊特殊檔案則為真
練習:寫一個腳本,完成如下任務:
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
轉載于:https://blog.51cto.com/1983939925/1534951