gnu linux额外支持的运算符,《Shell编程从入门到精通》张昊-chap1-8
緣起
20190314開始復習及學習吧;
張昊編著;
內容
目錄 i(9/314)
全書11章
chap1 第1個Shell程序 1(13/334)
1.1、第一道菜
[echo.sh]
#!/bin/sh
cd /tmp
echo "hello world!"
(1)每一行代碼是啥意思;(2)如何運行程序?
1.2、如何運行程序
1.2.1 選婿:位于第一行的#!
匹配解釋器。
解釋器路徑可以用whereis bash查。
自刪除腳本
#!/bin/rm
# 運行這個腳本時,什么也不會發生,只是刪自已
WHATEVER=65
echo "This line will never print!"
exit $WHATEVER #腳本不會在這退出
1.2.2 找茬:程序執行的差異
source echo.sh時,改變了目錄。
1.2.3 shell的命令種類
(1)內建命令
(2)shell函數
(3)外部命令
要知道source執行的差異,不會創建子進程,直接在父進程中執行。
1.3、Linux Shell的變量
1.3.1、變量
測試全局變量和局部變量的適用范圍
#!/bin/sh
num=123
func1()
{
num=321
echo $num
}
Func2()
{
local num=456 #局部變量
echo $num
}
echo $num
func1
echo $num
func2
echo $num
1.3.2、用echo輸出變量
echo 掌握各種轉義字符
1.3.3、環境變量的相關操作
export命令
bash的啟動文件/登出文件
/etc/profile
/etc/bashrc
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_logout
unset命令
env命令
1.3.4、shell中的一些常用環境變量
1.4、Linux Shell是解釋型語言
1.4.1、編譯型語言和解釋型語言
1.4.2、Linux Shell編程的優勢
1.5、小結
chap2 shell編程基礎 15(27/334)
2.1、向腳本傳遞參數
2.1.1、Shell腳本的參數
Shell編程中的函數
testfunc()
{
echo "$# parameters";
echo "$@";
}
shell編程中參數引用
0,1,2...
*
@
#
$
!
?
-
在
2.1.2、參數的用途
[ps.sh]
#! /bin/sh
ps -eLf | grep $1
mv和mkdir命令
2.2、I/O重定向
2.2.1、標準輸入、標準輸出與標準錯誤
cat命令后面的主要參數
2.2.2、管道與重定向
>、>、|
head命令
2.2.3、文件描述符
2.2.4、特殊文件的妙用
/dev/null
/dev/zero
/dev/tty
read命令,我基本沒在命令中用過,最多編程中有用
2.3、基本文本檢索
grep相關命令
2.4、Unix/Linux系統的設計與shell編程
2.4.1、一切皆文件
Linux文件的后綴名
Linux文件類型
ls命令
2.4.2、UNIX編程的基本原則
2.5、小結
chap3 編程的基本元素 39(51/334)
3.1、再識變量
[variable.sh]
shell中有3種變量:
用戶變量
位置變量:在對參數判斷和命令返回值判斷時使用。也叫系統變量
環境變量
3.1.1、用戶變量
3.1.2、位置變量
也叫系統變量,直接引用只能$0~$9,超過要用括號,即${10}
[process.sh]
[Process2.sh]
#!/bin/sh
if[ $# -ne 2 ];
then
echo "Usage: $0 string file";
exit 1;
fi
grep $1 $2;
if[ $? -ne 0 ];
then
echo "Not Found \"$1\" in $2";
exit 1;
fi
echo "found \"$1\" in $2";
3.1.3、環境變量
3.1.4、啟動文件
3.2、函數
0
當shell執行函數時,并不獨立創建子進程。
shell執行命令的順序
函數的使用規則
自動加載
3.2.1、函數定義
unset -f funcname 刪除函數
[user_login.sh]
#!/bin/bash
function user_login()
{
if who | grep $1 >/dev/null
then
echo "User $1 is on."
else
echo "User $1 is off."
fi
}
3.2.2、函數的參數和返回值
[演示函數的返回值]
#! /bin/bash
add()
{
let "sum=$1+$2"
return $sum
}
3.3、條件控制與流程控制
3.3.1、if/else語句
3.3.2、退出狀態
$?返回上一條語句的退出狀態
退出狀態值
0:成功
>0:在重定向或單詞展開期間()失敗
1~125:退出失敗
126:命令找到,但無法執行命令文件
127:命令無法找到
>128:命令因收到信號而死亡
3.3.3、退出狀態與邏輯操作
3.3.4、條件測試
3.4、循環控制
3.4.1、for循環
3.4.2、while/until循環
[遍歷PATH路徑]
path = $PATH
while [ -n $path ];
do
ls -ld ${path%%:*} #ls -ld顯示path的第一個目錄
path = ${path#*:} #截去path中第一個目錄和冒號
done
3.4.3、跳出循環
break
3.4.4、循環實例
[例3.17 命令行參數處理]
[例3.18 getopt的使用]
author=false
list=false
file=""
while getopt alf: opt
do
case $opt in
f) file=$OPTARG #將-f參數的下一個參數截取至file變量
;;
l) list = true
;;
a) author = true
;;
esac
done
shift ${{OPTIND - 1}} #刪除選項,留下參數
getopt分析命令行標志和參數
3.5、小結
chap4 正則表達式 66(78/334)
0
grep、sed、awk、more、vi
4.1、什么是正則表達式
4.1.1 正則表達式的廣泛應用
4.1.2 如何學習正則表達式
讀例子;理解后再修改和實踐
4.1.3 如何實踐正則表達式
不斷修改、測試
4.2、正則基礎
4.2.1 元字符
都支持的meta字符
^:錨定行或字符串的開始
$:錨定行或字符串的結束
.
*
[...]
\
不同的meta字符
grep程序支持的meta字符plus
4.2.2 單個字符
一般字符
轉義的meta字符
.(點號)字符
方括號表達式
4.2.3 單個表達式匹配多個字符
4.2.4 文本匹配錨點
4.2.5 運算符優先級
4.2.6 更多差異
后向引用
分組
交替
4.3、正則表達式的應用
4.3.1、擴展
ed命令的演化成grep和sed
[例4.9 單詞的開頭結尾匹配]
GNU支持的額外正則表達式運算符
4.3.2 案例研究:羅馬數字
[例4.11 檢驗百位數]
4.3.3 案例研究:解析電話號碼
4.4、小結
chap5 基本文本處理 87(99/334)
0
sort、uniq、cut、join、head、tail、grep、wc、fmt、fold、pr、tr
5.1、排序文本
5.1.1、sort命令的行排序
例5.1 使用sort命令按照ASCII順序排序文本 sort file.txt
例5.2 字典序 sort -d file.txt
例5.3 忽略大小寫差異 sort -d -f file.txt
5.1.2、sort命令的字段排序
sort -t: -k3 -n /etc/group
5.1.3、sort小結
例5.5 sort命令不穩定性演示
5.2、文本去重
uniq
5.3、統計文本行數、字數以及字符數
wc
5.4、打印和格式化輸出
5.4.1、使用pr打印文件
5.4.2、使用fmt命令格式化文本
5.4.3、使用fold限制文本寬度
5.5、提取文本開頭和結尾
head與tail
5.6、字段處理
5.6.1、字段的使用案例
5.6.2、使用cut取出字段
5.6.3、使用join連接字段
5.6.4、其他字段處理方法
awk
5.7、文本替換
5.7.1、使用tr替換字符
5.7.2、其他選擇
sed、awk、perl、python
5.8、一個稍微復雜的例子
5.8.1、實例描述
5.8.2、取出記錄的ip字段和id字段
5.8.3、將記錄按照ip順序排序
5.8.4、使用uniq統計重復ip
5.8.5、根據訪問次數進行排序
5.8.6、提取出現次數最多的100條
5.9、小結
chap6 文件和文件系統 118(130/334)
0
ls、cat、chown、chgrp、chmod、umask、mkdir、touch、find、xargs、comm、diff、vimdiff、fdisk、mkfs、df、mount
6.1、文件
6.1.1、列出文件
6.1.2、文件的類型
6.1.3、文件的權限
chown和chgrp,以及chmod
6.1.4、文件的修改時間
用touch更新文件的訪問和修改時間
6.2、尋找文件
6.2.1、find命令的參數
6.2.2、遍歷文件
[例6.10 xargs使用]
find /tmp -type f -print | xargs file
6.3、比較文件
6.3.1、使用comm比較排序后文件
comm file1 fiel2
6.3.2、使用diff比較文件
6.3.3、其他文本比較方法
vimdiff
6.4、文件系統
6.4.1、什么是文件系統
6.4.2、文件系統與磁盤分區
6.4.3、linux分區格式的選擇與安全性
6.4.4、文件系統與目錄樹
6.4.5、文件系統的創建與掛載
6.5、小結
chap7 流編輯 155(167/334)
7.1、什么是sed
7.1.1 挑選編輯器
VI是交互式編輯器。
sed是流編輯器,可以對從管道這樣的標準輸入接收的數據進行編輯。
7.1.2 sed的版本
sed --version
7.2、sed示例
7.2.1 sed的工作方式
sed是基于行的,不修改任何輸入文件,將結果寫入標準輸出(stdout)。
sed -e 'd' /tmp/passwd.bak # d是刪除,全部刪除
sed -e '5d' /tmp/passwd.bak # 刪除第5行
7.2.2 sed工作的地址范圍
7.2.3 規則表達式
7.3、更強大的sed功能
7.3.1 替換
sed -e 's/power/jiechen/g' /tmp/a.c #s是替換,g是全局
7.3.2 地址范圍的迷惑
7.4、組合命令
7.4.1 組合多條命令
sed -n -e '=;p' /tmp/passwd.piece
7.4.2 將多條命令應用到一個地址范圍
7.5、實際的例子
sed -e 's/$/\r/' myunix.txt > mydos.txt
7.6、sed實踐 167
7.6.1 第一步 替換名字
7.6.2 第二步 刪除前3行
7.6.3 第三步 顯示5~10行
7.6.4 第四步 刪除包含lane的行
7.6.5 第五步 顯示生日在november-december之間的行
7.6.6 第六步 把3個星號(*)添加到以fred開頭的行
7.6.7 第七步 用jose hasretired取代包含jose的行
7.6.8 第八步 把popeye的生日改成11/14/46
7.6.9 第九步 刪除所有空白行
7.6.10 第十步 腳本
7.7、小結
chap8 文本處理利器awk 176(188/334)
8.1、來個案例
awk '{print $0}' /etc/fstab # print $0是打印整行,print和print $0效果是一樣的
awk常常用于處理字段,我個人理解為列處理
8.2、基本語法
8.2.1 多個字段
8.2.2 使用其他字段分隔符
awk -F ":" '{print "USER: "$1 "\tSHELL: "$7}' /tmp/passwd.piece
‘-F’設置的是awk的初始化變量FS,FS默認的字段分格符是空白字符,現在改成冒號
8.3、awk語言特性
8.3.1 awk代碼結構
8.3.2 變量與數組
8.3.3 算術運算和運算符
8.3.4 判斷與循環
8.3.5 多條記錄
8.4、用戶自定義函數
8.4.1 自定義函數格式
8.4.2 引用傳遞和值傳遞
8.4.3 遞歸調用
8.5、字符串與算術處理
8.5.1 格式化輸出
8.5.2 字符串函數
8.5.3 算術函數
8.6、案例分析
8.6.1 生成數據報表
8.6.2 多文件聯合處理
8.6.3 檢驗passwd格式的正確性
8.6.4 sed/awk單行腳本
8.7、小結 222
收獲
履歷
20190314過了一遍chap1和2,還是有一些知識點不知道的。
shell中的參數引用就不熟。
20190315過了一遍chap3-5。
chap03來看,還是自已讀、寫shell有點少,語法有些點不懂外,寫得就更少,要從基礎的實踐一下,覺得門入得還不深。
chap04正則基本都會用到,但各種細節和元字符并沒有完全了解。
畢竟沒有處理過文本,chap5里的命令大部分是我沒有接觸的,更沒說對參數的了解了,但基本上屬于一講還是能懂的啊。
20190316過了一遍chap6
find里的xargs參數;以及comm命令,我用得確實不多。
20190318過了一遍chap7、08
熟悉了一下sed的各個參數,例子場景不錯,但我還沒有實踐呢。
chap08只是簡單看看,原來'awk'還可以自成函數,這個反正是不記得了,不清楚以前看沒看過呢。awk要好好學學
總結
以上是生活随笔為你收集整理的gnu linux额外支持的运算符,《Shell编程从入门到精通》张昊-chap1-8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式机器学习_229页CMU博士张昊毕
- 下一篇: 南开大学张昊计算机,张昊(东北大学工商管