Shell筆記
shell基礎
1、shell在Windows和Linux中都有命令轉換器的作用,另外它還是一門編程語言
2、shell編程第一行都有加上#!/bin/bash,它的作用是告訴系統這是一個shell程序
3、Windows中的shell程序在Linux中無法正常執行,這是因為二者的回車符不一樣,可以使用dos2unix來對程序進行轉換
4、history語句 查看此次登錄的命令的歷史記錄
-c 清除所有的歷史記錄,包括~/.bash_history文件內的
-w 將此次登錄的歷史記錄保存進 ~/.bash_history文件
上下鍵調用以前的歷史命令
!n 調用第n條歷史命令
!! 執行上一條歷史命令
!字符串 執行上一條以該字符串開頭的命令
5、alias 給命令起別名
alias vi=‘vim‘
以上只是臨時生效,一旦退出將失效
要想將別名永久生效,就需要改變~/.bashrc文件,將起別名的命令寫入此文件,別名將永久生效
unalias 刪除別名
6、Bash常用快捷鍵
ctrl+U 刪除或剪切光標之前的命令
ctrl+K 刪除或剪切光標之後的命令
ctrl+Y 粘貼ctrl+U或ctrl+K剪切的命令
ctrl+R 在歷史命令中搜索
ctrl+D 退出當前終端
7、輸入、輸出重定向
(1)輸入重定向:
命令&>文件 命令&>>文件
&的作用是不論命令正確或是錯誤,都把輸出保存到文件中
>的作用是以覆蓋的方式保存到文件 >>的作用是以追加的方式保存到文件
命令>>文件1 2>>文件2 將正確輸出和錯誤輸出分別追加保存到兩個文件中(以覆蓋保存的方式也可以,但是當保存一個文件時,另一個文件會被清空)
(2)輸出重定向:(使用頻率很低)
命令 < 文件
例:wc命令 統計行數、單詞數、字符數
wc < 文件
wc << 字符 以字符為結尾統計
8、多命令執行和管道符
多命令執行:
(1)常見的多命令執行符
命令1;命令2··· 單純的連接多個命令
命令1&&命令2··· 當命令1正確執行時才執行命令2
命令1||命令2··· 當命令1不正確執行時才執行命令2
(2)命令 && echo yes || echo no
判斷命令是否正確執行
管道符:
(1)命令1 | 命令2
命令1的正確輸出作為命令2的操作對象
9、通配符和其他特殊符號
(1)通配符
?代表一個字符 *代表任意字符(包含空字符)
[]代表指定範圍內的一個字符
例:[0-9]代表0到9內的一個數字
[^0-9]代表非數字的一個字符
(2)Bash中其他特殊符號
‘‘單引號 在單引號中的符號都只是符號,沒有任何特殊含義
""雙引號 在雙引號中特殊字符都沒有特殊含義,但是"$"、"`"和"\"是例外,擁有“調用變量的值”、“引用命令”和“轉義符”的特殊含義
$() 用來引用系統命令
例:echo $(date) 將date命令執行的結果賦值給echo
Bash變量:用戶自定義變量》環境變量》位置參數變量》預定義變量
用戶自定義變量對用戶沒有任何限制
環境變量中的系統環境變量,用戶不能改變變量名,只能改變變量值。除此之外,用戶可以自己自定義環境變量。
位置參數變量屬於預定義變量中的一類,都是不能改變變量名,只能改變變量值。
10、Bash變量——用戶自定義變量
(1)Bash中,變量的默認類型是字符串型,如果要進行數值運算,則必須指定變量類型為整形
(2)等號兩邊不能有空格,如果值中有空格,則需要用單引號或雙引號括起來
(3)變量的值可以疊加,疊加規則如下:
例:aa=123
aa="$aa"456
aa=${aa}789
(4)環境變量名建議大寫,便於區分
(5)set查看系統中所有變量
(6)unset 刪除變量
11、Bash變量——環境變量
(1)export 變量名=變量值 申明環境變量
env 查詢環境變量
unset 刪除變量
(2)系統常見的環境變量
PATH:系統查找命令的路徑
在Linux中如果要執行一個程序(命令也是一個程序),必須使用絕對路徑或是相對路徑,但是我們平時使用的命令的開頭並沒有路徑,原因就在於系統會自動在環境變量PATH中所包含的路徑內尋找。如果我們想要使自己編寫的程序也可以直接通過文件名來執行,只需要將我們的文件移動到PATH中默認的路徑中(但這種方式不太推薦),或者修改環境變量PATH,例如PATH="$PATH":/home/pi/
PS1:定義系統提示符的變量
自定義變量和環境變量區別:用戶自定義變量只在當前的shell中生效,而環境變量會在當前shell和這個shell所有子shell中生效。如果把環境變量寫入相應的配置文件,那麽這個環境變量就會在所有的shell中生效。
12、Bash變量——位置參數變量
$n $0代表命令本身,$n代表第n個參數,當n大於9時,形式變為${n}
$* 這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體
$@ 這個變量也代表命令行中所有的參數,[email protected]
$# 這個變量代表命令行中所有參數的個數
13、Bash變量——預定義變量
(1)$? 最後一次執行的命令的返回狀態。如果這個變量為0,就證明上一條命令正確執行。如果這個變量非0(具體數值有程序自己來決定),則證明上一條命令執行錯誤。
$$ 當前進程的進程號(PID)
$! 後臺運行的最後一個程序的進程號(PID)
(2)接受鍵盤輸入
read [選項] [變量名]
選項:-p "提示信息" 在等待read輸入時,輸出提示信息
-t 秒數 指定等待時間
-n 字符數 read命令只接受指定的字符數,就會執行,不需要再按回車
-s 隱藏輸入的數據,用於機密信息的輸入
14、Bash的運算符——數值運算與運算符
在shell中進行數值運算
方法一:
declare 聲明變量類型
declare [+/-] [選項] 變量名
選項:- 給變量設定類型屬性
+ 取消變量的類型屬性
-i 將變量聲明為整形
-x 將變量聲明為環境變量
-p 顯示指定變量的被聲明的類型
例:declare -i cc=$aa+$bb
方法二:
$((運算式))或$[運算式]
例:cc=$(($aa+$bb))
15、環境變量配置文件
(1)source命令
source 配置文件 或 . 配置文件 令配置文件立即生效(註意:.和配置文件中間有空格)
shell編程
1、正則表達式
(1)正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配。
通配符用來匹配符合條件的文件名,通配符是完全匹配。因為ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配。
(2)基礎正則表達式
* 前一個字符匹配0次或任意多次
. 匹配除換行符外任意一個字符
^ 匹配行首。例如:^hello會匹配以hello開頭的行
$ 匹配行尾。例如:hello$會匹配以hello結尾的行
[] 匹配中括號中指定的一個字符
[^] 匹配除中括號內字符以外的任意一個字符
\ 轉義符。用於取消特殊符號的含義
\{n\} 表示其前面的字符恰好出現n次
\{n,\} 表示其前面的字符至少出現n次
\{n,m\} 表示其前面的字符至少出現n次,至多出現m次
例:grep -n "^$" test.txt 匹配空白行(-n的作用是顯示行號)
grep "^[^a-zA-Z]" test.txt 匹配不要字母開頭的行
grep處理的是行,而cut,awk處理的都是列
2、字符截取命令——cut命令
cut [選項] 文件名
選項:
-f 列號 提取第幾列
-d 分隔符 安裝指定分隔符分割列
cut主要和grep配合使用,來提取特定的數據
cut只能用來提取用制表符,逗號,冒號,句號等符號作為分隔的文件,不能提取用空格來分隔的文件。
3、字符截取命令——awk命令
(1)awk ‘條件1{動作1} 條件2{動作2}···‘ 文件名
條件:一般使用關系表達式作為條件
x>10 x>=10 x<10
動作:格式化輸出
流程控制語句
註意:在awk中,print後面自帶換行,printf則需要手動添加
例:awk ‘{printf $1 "\t" $2 "\n"}‘ test.txt
awk ‘BEGIN{FS=":"} {print $1 "\t" $3} END{print "The End!"}‘ test.txt
awk的默認分隔符是空格和制表符,使用FS可以指定分隔符
cat text.txt | grep -v Name | awk ‘$6>86{print $2}‘ (grep -v Name 輸出不含Name的行)
4、字符截取命令——sed命令
(1)sed是一種幾乎包括在所有UNIX平臺(包括Linux)的輕量級流編輯器。sed是主要用來將數據進行選取、替換、刪除、新增的命令。
(2)sed [選項] ‘[動作]‘ 文件名
選項:-n 一般sed命令會把所有數據都輸出到屏幕上,如果加上此選項,則只會把經過sed命令處理的行輸出到屏幕上
-e 允許對輸入數據應用多條sed命令編輯
-i 用sed的修改結果直接修改源文件,而不是由屏幕輸出
動作:a 追加,在當前行後添加一行或多行。添加多行時,除最後一行外,每行末尾需要用\代表數據未完結
c 行替換,用c後面的字符串替代原數據行。替換多行時,除最後一行外,每行末尾需要用\代表數據未完結
i 插入,在當前行前插入一行或多行。插入多行時,除最後一行外,每行末尾需要用\代表數據未完結
d 刪除,刪除指定的行
p 打印,輸出指定的行
s 字符串替換,用一個字符串替換另一個字符串。格式為"行範圍s/舊字符串/新字符串/g"
例:sed -n ‘2p‘ test.txt 打印第二行
sed ‘2,4d‘ test.txt 刪除第二行到第四行
sed ‘2a hello‘ test.txt 在第二行後追加hello
sed ‘2i hello\world‘ test.txt 在第二行前插入兩行數據(如果追加兩行數據,\後面需要按回車)
sed ‘1,4c hello\world‘ test.txt 數據替換
sed -e ‘1s/one/two/g;3s/three/four/g‘ test.txt 把第一行的one替換為two,同時把第二行的three替換為four(註意:必須是字符串,不能是字符串裏的幾個字符)
sed -i ‘3s/one/two/g‘ test.txt sed的操作直接寫入源文件
5、字符處理命令
(1)排序命令sort
sort [選項] 文件名
選項:-f 忽略大小寫
-n 以數值型進行排序,默認使用字符串型排序
-r 反向排序
-t 指定分隔符,默認分隔符是制表符
-k n[,m] 按照指定的字段範圍排序。從第n字段開始,m字段結束(默認到行尾)
例:sort test.txt
sort -n -t ":" -k 3,3 test.txt 以:為分隔符的第三個字段按數值型排序
一般選項都不加
(2)統計命令wc
wc [選項] 文件名
選項:-l 只統計行數
-w 只統計單詞數
-m 只統計字符數
6、條件判斷
(1)按照文件類型進行判斷
-d 判斷該文件是否存在,並且是否為目錄文件
-e 判斷該文件是否存在
-f 判斷該文件是否存在,並且是否為普通文件
-L 判斷該文件是否存在,並且是否為符號鏈接文件
兩種判斷格式:test -e test.txt
[ -e test.txt ] 前後必須都空格
例:[ -f ~/test.txt ] && echo yes || echo no
(2)按照文件權限進行判斷
-r 判斷文件是否存在,並且該文件是否擁有讀權限
-w 判斷文件是否存在,並且該文件是否擁有寫權限
-x 判斷文件是否存在,並且該文件是否擁有執行權限
(3)兩個文件之間進行比較
文件1 -nt 文件2 判斷文件1的修改時間是否比文件2早
文件1 -ot 文件2 判斷文件1的修改時間是否比文件2晚
文件1 -ef 文件2 判斷文件1和文件2的lnode號是否一致,可以理解為兩個文件是否為同一個文件
(4)兩個整數之間比較
整數1 -eq 整數2 判斷整數1是否和整數2相等
整數1 -ne 整數2 判斷整數1是否和整數2不相等
整數1 -gt 整數2 判斷整數1是否大於整數2
整數1 -lt 整數2 判斷整數1是否小於整數2
整數1 -ge 整數2 判斷整數1是否大於等於整數2
整數1 -le 整數2 判斷整數1是否小於等於整數2
例:[ 33 -gt 55 ] && echo yes || echo no
(5)字符串的判斷
-z 字符串 判斷字符串是否為空
-n 字符串 判斷字符串是否存在
字符串1 == 字符串2 判斷字符串1是否和字符串2相等
字符串1 != 字符串2 判斷字符串1是否和字符串2不相等
例:[ -z "$name" ] && echo yes || echo no
[ $aa == $bb ] && echo yes || echo no
(6)多重條件判斷
判斷1 -a 判斷2 邏輯與,判斷1和判斷2都成立,最終結果才為真
判斷1 -o 判斷2 邏輯或,判斷1和判斷2有一個成立,最終結果就為真
! 判斷 邏輯非,使判斷式取反
例:[ -n $aa -a $aa -gt 23 ] && echo yes || echo no
7、流程控制——if語句
(1)單分支if條件語句
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
例:rate=$(df -h | grep "/dev/root" | awk ‘{print $5}‘ | cut -d "%" -f 1)
if [ $rate -ge 80 ]
then
echo "/dev/root is full."
fi
(2)雙分支if條件語句
if [ 條件判斷式 ]
then
條件成立時,執行的程序
else
條件不成了時,執行的程序
fi
(3)多分支if條件語句
if [ 條件判斷式1 ]
then
當條件判斷式1成立時,執行程序1
elif [ 條件判斷式2 ]
then
當條件判斷式2成立時,執行程序2
···省略更多條件···
else
當所有條件都不成立時,最後執行此程序
fi
註意:shell中的多分支if條件語句當一個條件判斷式為真並且執行了相應的程序後並不會退出,而是繼續執行,因此最後在每個執行程序後面都加上exit(()
8、流程控制——case語句
case $變量名 in
"值1")
如果變量的值等於值1,則執行程序1
;;
"值2")
如果變量的值等於值2,則執行程序2
;;
···省略其他分支···
*)
如果變量的值不是以上的值,則執行此程序
;;
easc
例:
read -p "Please input your name: " -t 20 name
read -p "Please choose your sex(M/W): " -t 15 sex
case $sex in
M)
echo "Hello, Mr $name"
;;
W)
echo "Hello, Mrs $name"
;;
*)
echo "Your sex is error!"
;;
easc
9、流程控制——for循環
(1)語法一
for 變量 in 值1 值2 值3···
do
程序
done
例:打印~/sh目錄下的以.sh結尾的文件名
#!/bin/bash
cd ~/sh
ls *.sh > ls.log
num=1
for i in $(cat ls.log)
do
echo "$num $i"
num=$(($num+1))
done
rm -rf ls.log
(2)語法二 for ((初始值;循環控制條件;變量變化)) do 程序 done 例: #!/bin/bash s=0 for ((i=1;i<=100;i=i+1)) do s=$(($s+$i)) done echo "The sum 1+2+3···+99+100 is:$s" 10、流程控制——while循環與until循環 (1)while循環 while [ 條件判斷式 ] do 程序 done 例: #!/bin/bash sum=0 i=1 echo "This is a program that from 1 add to num" read -p "Please input the num: " -t 30 num while [ $i -le $num ] do sum=$(($sum + $i)) i=$(($i + 1)) done echo "from 1 add to $num, the sum=$sum" (2)until循環 until循環和while循環相反,until循環時只要條件判斷式不成立則進行循環。一旦循環條件成立,則終止循環。 until [ 條件判斷式 ] do 程序 done 例: #!/bin/bash sum=0 i=1 echo "This is a program that from 1 add to num" read -p "Please input the num: " -t 30 num until [ $i -gt $num ] do sum=$(($sum + $i)) i=$(($i + 1)) done echo "from 1 add to $num, the sum=$sum"
Shell筆記