歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux私房菜基礎篇第三版-第十一章 認識與學習BASH

Linux私房菜基礎篇第三版-第十一章 認識與學習BASH

日期:2017/3/1 11:42:31   编辑:關於Linux

1、中介模型:硬件、kernel、使用者:

\

2、shell功能:提供用戶操作系統的接口,需要可以呼叫其他軟件,如man、mkfs都是應用程序;
3、/bin/sh (已經被 /bin/bash 所取代)
 /bin/bash (就是 Linux 預備的 shell)
 /bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,兼容亍 bash)
 /bin/tcsh (整合的 C Shell ,提供更多的功能)
 /bin/csh (已經被 /bin/tcsh 所取代)
 /bin/zsh (基亍 ksh 發展出來的,功能更強大的 shell)
4、命令編修能力history:能記憶使用過的指令,被放在家目錄的.bash_history;
注意:~/.bash_history記錄的是前一次登入以前所執行過的指令,而本次的則暫存在內存,需注銷系統後才會被記錄。(黑客入侵,若指令與系統有關,其直接輸入MySQL的密碼在指令列上面)
5、tab:命令與檔案補全;
6、命令別名設定功能:alias
如:alias lm=‘ls -al’ 這樣以後只輸入lm就相當於在使用ls -al;
7、工作控制、前景與背景控制;
8、程序化腳本:shell scripts;
9、通配符:*
如 ls /usr/bin/ABC*
10、Bash shell的內建命令:type 可查看指令是來自內建還是外部
man bash 查看bash的說明文件,很重要
type [-tpa] name (t顯示意義如file外部指令,alias別名,builtin內建指令;p外部則顯示完整名;將含有name的指令都列出);
例: type ls
type -t ls
type -a ls
type cd
11、環境變量:用來讀入系統中,系統需要這些變量提供數據的存取。如PATH、HOME、MAIL、SHELL等。
12、變量的取用與設定:echo
變量取用前需要用【$】的符號;
例:echo $variable
echo $PATH
echo ${PATH}
echo ${HOME}
echo $myname
myname=Shawn
echo $myname
13、變量設定規則:

a、變量=兩邊不能有空格,C語言則可;
b、開頭不能是數字;
c、變量需空格,則用"",可保留原本特性,''為純文本;
d、反單引號指令【`】(1左邊鍵),在【`】之內的指令會被先執行;
e、擴增變量用“$+變量名”:【PATH="$PATH":/home/bin】;
f、變量變成環境變量(才可在其他子程序執行):【export PATH】;
g、取消變量:【unset myname】
例:
name=Shawn\'s \name (反斜槓\跳脫特殊字符,可忽略單引號和空格)
name="$name"yes
name=${name}yes
例:設定變量用在下個shell中
name=Shawn
export name
bash
echo $name
exit
概念:父程序(當前程序)——子程序(啟用另一個程序)——父程序的自定義變量無法再子程序中


應用,需要加上export,從變量改為環境變量。


14、取得核心版本信息指令:uname -r
name=Shawn
echo $name
myname="$name its me" 此處的$name相當於是C語言中的%s
echo $myname
myname='$name it's me'
echo $myname
設定常用變量目錄,避免出錯,和減少每次輸入時間
例:work="/cluster/server/work/xiamen_2016/11/6"
cd $work
15、選用的變量賦值方式:version=${uname -r}
不選用: version=`uname -r` 因為【`】容易看錯。
16、shell默認的環境變量查詢:env和export
TERM 終端使用的環境類型
SHELL 當前環境下,使用的Shell是哪一個程序
HISTSIZE 記錄命令筆數,默認為1000
MAIL 用戶取用的mailbox位置,使用mail,系統將讀取郵件信箱檔案mailbox
PATH 執行文件指令搜尋路徑
LANG 語系
RANDOM 隨機隨機數,默認0-32767,就是/dev/random這個檔案
PWD 工作目錄
HOME 家目錄
_=/bin/env 上次使用指令的最後一個參數
例:生成隨機0-9的數值,declare -i number=$RANDOM*10/32768;echo $number
知識點:declare (為宣告數值類型)
17、set:觀察所有變量(含環境變量與自定義變量)
a、PS1 提示字符的設定
符號意義:
o \d :可顯示出『星期 月 日』癿日期格式,如:"Mon Feb 2"
o \H :完整的主機名。丼例杢說,鳥哥的練習機為『www.vbird.tsai』
o \h :僅取主機名在第一個小數點之前的名字,如鳥哥主機則為『www』後面省略
o \t :顯示時間,為 24 小時格式癿『HH:MM:SS』
o \T :顯示時間,為 12 小時格式癿『HH:MM:SS』
o \A :顯示時間,為 24 小時格式癿『HH:MM』
o \@ :顯示時間,為 12 小時格式癿『am/pm』樣式
o \u :目前使用者的賬號名稱,如『root』;
o \v :BASH 的版本信息,如鳥哥癿測試主板本為 3.2.25(1),僅取『3.2』顯示
o \w :完整的工作目錄名稱,由根目錄寫起的目錄名稱。但家目錄會以 ~ 取代;
o \W :刟用 basename 凼數叏得工作目錄名稱,所以僅會列出最後一個目錄名。
o \# :下達得第幾個指令。
o \$ :提示字符,如果是 root 時,提示字符為 # ,否則就是 $ 啰~
例:PS1='[\u@\h \w \A #\#]\$'
b、$:本shell的PID,即線程代號
例:顯示線程代號 echo $$
c、?:指上一個執行指令所傳回的值,執行成功傳回0,否則為【錯誤代碼】,即非0數值。
d、OSTYPE,HOSTTYPE,MACHTYPE:主機硬件與核心的等級
e、export:自定義變量轉成環境變量
父程序與子程序概念:第一個bash父程序,觸發子程序,原父程序睡著;
子程序需要exit或logout將其結束掉方可回到父程序;
理解模型:實線虛線圖形
f、影響顯示結果的語系變量(locale):
locale -a
locale
語系檔案位置: /usr/lib/locale/
整體系統默認的語系定義位置:/etc/sysconfig/i18n 執行結果表明沒有?
big5:大五碼
utf8:萬國碼 若從windows將文檔轉到Linux上出現亂碼,可更改大便干的軟件編碼。
18、變量的有效范圍:
環境編程=全局變量global;(類似C語言的定義)
自定義變量=局部變量local
問題核心:內存配置的關系
19、變量鍵盤讀取、數組與宣告:read、array、declare
a、read [-pt] varible 提示字符/等待秒數
例1:read atest
Hello World
echo $atest
Hello World
例2:read -p "Please keyin your name:" -t 30 named
20、declare [-aixr] variable a數組/i整型/x變成環境變量/r只讀設定
bash對變量的基本定義:A、默認為字符串,所以需要指定變量類型;
B、bash環境的數值運算,預設最多僅能達到整數形態。
例1:sum環境變量:
declare -x sum
export |grep sum
例2:只讀:declare -r sum
例3:將sum變成非環境變量的自定義變量
declare +x sum 將-變為+,可進行取消動作
declare -p sum 單獨列出變量類型
數組變量類型:
數組的設定方式:
var[index]=content
例:var[1]="small min"
var[2]="bing min"
var[3]="nice min"
echo "${var[1]},${var[2]},${var[3]}"
21、與文件系統及程序的限制關系:ulimit
ulimit [-SHacdfltu] 配額 S嚴格/H警告/a列出所有限額/c錯誤寫成檔案/f最大檔容/d最大斷裂內存容量/l鎖定內存量/t最大CPU時間/單用戶最大程序數量
例1:ulimit -a
ulimit -f 10240 僅能建立10MB容量檔案
dd if=/dev/zero of=123 bs=1M count=20 結果會失敗,因為超過了設置限度。
注意:一般身份,只能繼續減小檔案容量,而不能增加容量,若要管控ulimit,可用pam。
22、變量內容的刪除、取代與替換:
刪除目錄范圍:從【/】到【:】之間
#: 最短那個;
##: 最長那個。
%: 最後面開始刪除
%%: 只留第一個目錄

\

例:先用path自定義變量設定與PATH相同
path=${PATH}
echo $path
echo ${path#/*local/bin:} 刪除從左邊開始到/bin的內容
echo ${path#/*:} #從前面開始刪
echo ${path##/*:} 僅剩最後一個
echo ${path%/:*bin}
echo ${path%%/:*bin}
例:有變量MAIL,位置在/var/spool/mail/root,欲刪掉僅剩/root
echo ${MAIL##/*/}
若僅刪/root
echo ${MAIL%/*}
取代:
echo ${path/sbin/SBIN} 兩/間為舊,後面為新
echo ${path//sbin/SBIN} 所有符合的內容都將被取代
變量的測試與內容替換:new_var=${old_var-content
例1:判斷變量username是否存在,若不存在給予內容root。
echo $username
username=${username-root}
echo $username
username="Shawn"
username=${username-root}
echo $username
例2:user未設定或為空字符串,將其設定為root。
username=""
username=${username-root} 【-】後面接關鍵字
echo $username
username=${username:-root} 加上【:】後若變量內容為空或未設定,後面內容將替換
echo $username

\

23、命令別名設定:alias,unalias
例:簡化命令
alias lm='ls -al | more' 相當於lm代替了後面的指令
查看目前的指令別名:
alias
移出指令:
unlias
DOS時期指令表示:清屏、列出目錄檔案,
alias cls='clear'
alias dir='ls -l'
24、歷史命令:history
history [n] n筆指令
history [-C] 清除所有histfiles,
history [-raw] histfiles r將讀到的寫入記憶/增入histfiles,若無則寫入~/.base_history/記憶寫入histfiles,強行寫入
例1:history
history 5
history -w
echo $HISTSIZE
例2:
history
假設出現:10 manrm
11 alias
執行命令:!10 執行第10行指令
!! 執行上一個指令
!al 執行最近以al開頭的指令
25、無法記錄時間的問題:
可以透過~/.bash_logout進行history的紀錄,並加上date的時間參數
26、指令搜尋順序:
1. 以相對/絕對路徑執行指令,例如『 /bin/ls 』或『 ./ls 』;
2. 由 alias 找到該指令來執行;
3. 由 bash 內建的(builtin) 指令來執行;
4. 透過 $PATH 這個發量癿順序搜尋到的第一個指令來執行。
例:alias echo='echo -n'
type -a echo
27、進站與歡迎信息:
cat /etc/issue
更改:vim /etc/issue
CentOS release 5.3 (Final) (terminal: \l)
Date: \d \t Kernel \r on an \m
Shawn Welcome to you!
遠程登錄程序中用/etc/issue.net
告知登錄者信息:
vim /etc/motd
Hello everyone, Our server will be maintained at 2009/02/28 0:00 ~ 24:00.
Please don't login server at that time. ^_^

\
28、bash的環境配置文件
需分清login shell 與non-login shell
login shell只讀的兩個配置文件:
a、/etc/profile 系統整體設定,勿改為好;
可被呼叫的數據:
/etc/inputrc
/etc/profile.d/*.sh
/etc/sysconfig/i18n
b、~/.bash_profile 或~/.bash_login 或~/.profile 個人設定(三選一,且依次讀)
讀入環境配置文件指令:source
source 配置文件檔名
例:將配置文件讀進shell環境中,更改後可不注銷,直接讀取
source ~/.bashrc
. ~/.bashrc 此兩行指令相同

\
/etc/bashrc定義以下數據:
依據不同的 UID 規范出 umask 的值;
依據不同 UID 規范出提示字符 (就是 PS1 發量);
呼叫 /etc/profile.d/*.sh 的設定。

例:cat ~/.bashrc 顯示預設內容。
若~/.bashrc被誤刪的問題:
復制/etc/skel/.bashrc到家目錄,修訂內容,並使用source呼叫~/.bashrc

~/.bashrc(non-login shell)
此時,bash配置文件僅會讀~/.bashrc
例:cat ~/.bashrc 顯示預設內容
/etc/bashrc 定義的數據:
a、依據不同的 UID 規范出 umask的值;
b、依據不同的 UID 規范出提示字符 (就是 PS1 發量);
c、呼叫 /etc/profile.d/*.sh 的設定。
29、其他配置:
/etc/man.config 規定了當下達man時,該去何處查看數據的路徑設定,核心MANPATH變量設定
如以talball安裝時,就需要將/usr/local/softpackage/man放到/etc/man.config
注意:SuSE則用/etc/manpath.config 可用[tab]進行文件名補齊
~/.bash_history 保存歷史記錄
~/.bash_logout: 注銷bash後,系統繼續做什麼才離開
30、終端機的環境設定:stty與set
stty [-a] 將目前所有的stty參數列出來
重要的代表意義:
eof 結束輸入
erase 向後刪除字符
intr 送出中斷到run
kill 刪除目前指令列上所有文字
quit 送出quit到run
start 重啟output
stop 停止輸出
susp 送出一個terminal stop給run
例:stty erase ^h 表示用ctrl+[h]代替原來的刪除字符erase
set [-uvCHhmBx] u顯示錯誤信息/v顯示原始內容/v指令內容/h與歷史命令有關/H同上/m與工作管理有關/B與[]作用有關/C如使用>,檔案存在則不被覆蓋
例:顯示目前所有的set設定值:
echo $-
set -u
echo $Shawn
set -x
echo $HOME
cat /etc/inputrc
cat /DIR_COLORS*
cat /etc/termcap
bash默認的組合鍵如下圖:

\
31、通配符與特殊符號:
利用通配符配合ls找檔案:
例:LANG=C 設定語系
ll -d /etc/cron* 加d顯示目錄
ll -d /etc/Shawn 找出Shawn的文件名
ll -d /etc/*[0-9] 找出含數字文件名
ll -d /etc/[^a-z]* 找出開頭非小寫字母文件名
cp -a /etc/[^a-z]* /tmp 將上題找到的檔案復制到/tmp

\
特殊符號:
\

\

32、數據流重導向:將數據傳導到其他地方去;
傳送所用特殊字符:
a、標准輸入: 代碼——0 < << 原本鍵盤輸入改用檔案內容取代/結束輸入字符
b、標准輸出: 代碼——1 > >> (>覆蓋/>>累加)
c、標准錯誤輸出: 代碼——2 2> 2>>
檔案建立方式:不存在,則系統自動建立;存在則先清空再寫入;>輸出將覆蓋。
例:將stdout與stderr分存到不同的檔案去
find /home -name .bashrc > list_right 2> list_error

\
33、/dev/null垃圾桶黑洞裝置與特殊寫法:
find /home -name .bashrc 2> /dev/null 丟棄錯誤數據,顯示正確數據
find /home -name .bashrc list 2>&1
例1:用cat指令來建立一個檔案的簡單流程:
cat > catfile
abcd
test
ctrl+[d]
cat > catfile
例2:用 stdin 取代鍵盤的輸入以建立新檔案的簡單流程:
cat >catfile < ~/.bashrc
ll catfile ~/.bashrc
例3:cat > catfile << "eof"

\

34、命令執行判斷依據:;,&&,||
1、分號;:連續下指令 如 cmd;cmd

2、command1 && command2 || command3 後兩個需方肯定可以執行成功的指令

\

35、管線命令(pipe):|
每個管線後面接的第一個數據必定是指令!且能接受標准輸入數據!

\
攫取命令:cut,grep 它是一行一行分析

cut -d 分隔符 -f fields 【cut主要用途:同一行裡面的數據分解】
cut -c 字符區間
例1:echo $PAHT
echo $PATH | cut -d ':' -f 3,5
例2:export
export | cut -c 12- 取第12字符後的所有字符
last 輸出【賬號/終端機/來源/日期時間】
例3:last | cut -d '' -f 1
grep [-acinv] [--color=auto] '搜尋字符串' filename 【分析一行信息】 a文本搜尋/c次數/i忽略大小寫/n輸出行/v反選/關鍵字加顏色
例1:last | grep 'root' 取出有出現root那行
例2:last | grep -v 'root' 與上相反
例3:last | grep 'root' | cut -d '' -f1 有root就取出,僅取第一欄
例4:grep --color='MANPATH' /etc/man.config 取出後面檔案含MANPATH的那些行
36、排序命令:sort、wc、uniq
a、sort [-fbMnrtuk] [file or stdin] f忽略大小寫/b最前面忽略空格符/M月份排序/n純數字/r反向/u相同數據僅一行/t分隔符,預設[tab]/k以區間排序
需先讓語系統一: LANG=C
例1:cat /etc/passwd | sort 以a開設排序
例2:cat /etc/passwd | sort -t ':' -k 3 以第三欄排序
例3:cat /etc/passwd | sort -t ':' -k 3 n 數字排序
例4:last | cut -d '' -f1 | sort 取出賬號,加以排序
b、uniq [-ic] i忽略大小寫/c進行計數
例1:last | cut -d '' -f1 | sort | uniq
last | cut -d '' -f1 | sort | uniq -c 每個人登錄總次數 結果不對?
c、wc [-lwm] l僅列出行/w列字/m字符
例1:cat /etc/man.config |wc 顯示行、字數、字符數
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 計算登入總人次(但後兩行非賬號內容) 第一個grep排除空行,第二個grep排除wtmp,再來計算行數即可。
37、雙向重導向:tee [-a] file a累加 將數據放入file中
(相當於一個顯示屏幕,一個存入檔案)
例1:last | tee last.list | cut -d " " -f1
ls -l /home | tee ~/homefile | more
ls -l / | tee -a ~/homefile | more 沒有-a則會被覆蓋哦
38、字符轉換命令:tr,col,join,paste,expand
1、tr [-ds] SET1 ... d刪除字符串/s取代重復字符
例1:last | tr '[a-z]' '[A-Z]' 所有小寫變大寫(‘’可用可不用)
cat /etc/passwd | tr -d ':' 刪除冒號
例2:cp etc/passwd /root/passwd && unix2dos /root/passwd unix2dos不存在?
file /etc/passwd /root/passwd
cat /root/passwd | tr -d '\r' > /root/passwd.linux \r指DOS斷行符
ll /etc/passwd /root/passwd*
2、col [-xb] x將tab轉成對等空格鍵/b反斜槓時保留最後字符

例1:cat -A /etc/man.config cat -A顯示所有特殊案件
cat /etc/man.config | col -x | cat -A | more
例2:man col > /root/col.man 將col轉成純文本
vi /root/col.man 為何結果不一樣呢?
man col | col -b > /root/col.man
3、join [-ti12] file1 file2 t相同檔案聯成一行/i忽略大小寫/1第一檔案用那字段分析/2第二檔案同上
功能:主要用於處理相關文件,注意需先對檔案進行排序sort處理!
例:head -n 3 /etc/passwd /etc/shadow
join -t ':' -1 4 /etc/passwd -2 3 /etc/group
4、paste [-d] file1 file2 d接分隔符/若file寫成-,表示來自標准輸入的資料!
例:paste /etc/passwd /etc/shadow 同一行貼在一起,中間以[tab]隔開
cat /etc/passwd | paste /etc/passwd /etc/shadow - | head -n 3 讀出,貼上,取前三行
5、expand [-t] file t後接數字 功能:將 [tab] 鍵轉成空格鍵
例:grep '^MANPATH' | /etc/man.config | head -n 3 取出行首,其標志為^。
grep '^MANPATH' | /etc/man.config | head -n 3 | cat -A (cat可將所有符號列出)
grep '^MANPATH' | /etc/man.config | head -n 3 | \
expand -t 6 - | cat -A 將[tab]設定成6個字符
6、分割命令 split [-bl] file PREFIX b分割成的檔案大小/l行數分割/前導符
例:cd /tmp;split -b 300k /etc/termcap termcap
ll -k termcap*
cat termcap* >> termcapback 用數據流重導向,將分割的檔案合並為一個
ls -al / | split - | 10 - lsroot 每10行記錄成一個檔案
wc -l | lsroot*
備注:Windows下難以操作檔案分割
7、參數代換: xargs [-0epn] command 0有特殊字符/e結束/p執行前詢問/n次數
功能:在產生某個指令的參數,讀入stdin的數據,將其分隔成參數

單詞:distribution 分布、wildcard 通配符
Copyright © Linux教程網 All Rights Reserved