SHELL 腳本編程基礎

Shell 語言是最精簡的語言linux

什麼是shell
咱們將shell稱做命令解釋器(將命令轉換成二進制語言,又將二進制語言轉化成命令行)
shell不須要考慮效率,能實現功能就好shell

Linux支持的shell
主流shell:bash shell
[root@vm ~]#
[root@vm ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[root@vm ~]# 編程

一、echo命令
[root@vm ~]# echo 【選項】 【輸出內容】
選項:
-e:支持反斜線控制的字符轉換
-n:輸出內容後不會換行vim

[root@vm ~]#
[root@vm ~]# echo -e "\a" #警告音centos

[root@vm ~]#
[root@vm ~]# echo -e "\ \a"
\
[root@vm ~]#
[root@vm ~]# echo -e "\" #\符號表示轉義符,即把原來特殊字符的特殊意義去掉,讓他變成一個普通的字符(如將具備特殊意義的美圓$符號,變成一個普通的$符號)
\
[root@vm ~]#
[root@vm ~]# echo -e "1\t2"
1 2
[root@vm ~]#
[root@vm ~]# echo -e "ab\bc" #在這個輸出中,在b側右邊有\b,在輸出的時候,會向左將b刪掉,因此只剩下了ac
ac
[root@vm ~]#
[root@vm ~]# echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
[root@vm ~]#
[root@vm ~]# echo -e "\e[1;31m abcd \e[0m" #將abcd四個字母按照紅色輸出。解釋一下這個命令 \e[1 是標準格式,表明顏色輸出開始,\e[0m表明顏色輸出結束。31m用來定義字符顏色是紅色,echo可以識別的顏色以下:30m爲黑色、31m爲紅色、32m爲綠色、33m爲黃色、34m爲藍色、35m爲洋紅色、36m爲青色、37m爲白色
abcd
[root@vm ~]#
[root@vm ~]# echo -e "\e[1;42m bcde \e[0m" #這條命令會給bcde四個字符加入一個綠色的背景,echo可使用的背景顏色以下:40m爲黑色、41m爲紅色、42m爲綠色、43m爲黃色、44m爲藍色、45m爲洋紅、46m爲青色、47m爲白色
bcde
[root@vm ~]# 數組

二、腳本執行方法
[root@vm ~]# vim hello_world.sh #編寫一個腳本
[root@vm ~]# cat hello_world.sh #查看腳本內容
#!/bin/bash
echo "hello world"
[root@vm ~]#
[root@vm ~]# sh hello_world.sh
hello world
[root@vm ~]#
[root@vm ~]# chmod +x hello_world.sh #賦予腳本可執行權限
[root@vm ~]# ll
-rwxr-xr-x 1 root root 32 Nov 16 22:07 hello_world.sh
[root@vm ~]#
[root@vm ~]# ./hello_world.sh #執行該腳本
hello world
[root@vm ~]#
[root@vm ~]# /root/hello_world.sh #經過絕對路徑執行
hello world
[root@vm ~]#
[root@vm ~]# sh hello_world.sh #不須要可執行權限便可執行
hello world
[root@vm ~]#
[root@vm ~]# . hello_world.sh #不須要可執行權限便可執行
hello world
[root@vm ~]#
[root@vm ~]# bash hello_world.sh #不須要可執行權限便可執行
hello world
[root@vm ~]# bash

三、bash的基本功能
1)歷史命令
按上下箭頭能夠翻出歷史命令;
[root@vm ~]# history #在命令行執行history也能夠查看執行過的歷史命令
-c :清空歷史命令(這個通常不推薦使用)
-w :執行這個命令能夠在不正常退出Linux系統的狀況下保存執行過的歷史命令,若是不這樣的話那就得用戶註銷才能實現該功能
[root@vm ~]# echo $HISTSIZE #系統默認保存1000條歷史命令
1000
[root@vm ~]# 網絡

2).符號的意義
. 一個單獨的點 表示source命令;
.bashrc 文件名前面加一個點表示隱藏文件
./ 目錄前面加一個點表示該目錄爲當前目錄
[root@vm ~]#
[root@vm ~]# cd ./ #切換到當前目錄
[root@vm ~]# pwd #查看當前所在的位置
/root
[root@vm ~]# tcp

3)bash經常使用快捷鍵ide

[root@vm ~]#
[root@vm ~]# abcdefghijklmnopqrstuvwxyz #敲這麼一長串命令,此時咱們能夠看到光標在最右邊

此時咱們同時按住Ctrl+A鍵,而後發現光標居然跑到命令最前面第一個字符的位置去了

此時咱們同時按住Ctrl+E鍵,而後發現光標居然跑到命令最後面的位置去了

此時咱們同時按住Ctrl+U鍵,而後發現命令居然所有消失了,使用Ctrl+U刪除光標前的內容

此時咱們同時按住Ctrl+Y鍵,而後發現命令居然又所有恢復回來了,使用Ctrl+Y粘貼被Ctrl+U刪掉的內容

此時咱們同時按住Ctrl+K鍵,而後發現命令居然又所有消失了,使用Ctrl+K刪除光標後的內容

4)輸入輸出重定向
bash的標準輸入輸出

輸出重定向
將命令的標準輸出再也不輸出到屏幕上,而是將輸出直接輸出到文件裏邊,改變了輸出方向,因此叫作輸出重定向

[root@vm ~]#
[root@vm ~]# pwd > test.txt #標準正確輸出(將正確的命令輸出到文本中)
[root@vm ~]# cat test.txt
/root
[root@vm ~]#
[root@vm ~]# hjgfjjgfn > 1.txt #將一個錯誤的命令的執行結果輸出到文本中的時候發現會報錯
-bash: hjgfjjgfn: command not found
[root@vm ~]#
[root@vm ~]# hjgfjjgfn 2> 1.txt #只有在>號前面加一個2纔會將標準錯誤輸出到文本中
[root@vm ~]# cat 1.txt
-bash: hjgfjjgfn: command not found
[root@vm ~]#
[root@vm ~]# husigv > 2.txt 2>&1 #將標準錯誤輸出到文本中將原文本覆蓋掉
[root@vm ~]# cat 2.txt
-bash: husigv: command not found
[root@vm ~]#
[root@vm ~]# lkhjhhjsgvjk >> 2.txt 2>&1 #將標準錯誤輸出到文本中在原文本後面進行追加
[root@vm ~]# cat 2.txt
-bash: husigv: command not found
-bash: lkhjhhjsgvjk: command not found
[root@vm ~]#

輸入重定向
[root@vm ~]# wc 【選項】 【文件名】
-c:統計字節數
-w:統計單詞數
-l:統計行數

5)多命令執行

案例:
使用 ;
[root@vm ~]#
[root@vm ~]# ls ; pwd #兩條命令互不影響
hello_world.sh
/root
[root@vm ~]#
[root@vm ~]# lkhf ; ls
-bash: lkhf: command not found
hello_world.sh
[root@vm ~]#

使用&&
[root@vm ~]#
[root@vm ~]# ls && pwd
hello_world.sh
/root
[root@vm ~]#
[root@vm ~]# hlksg && pwd #兩個條件同時知足才能執行
-bash: hlksg: command not found
[root@vm ~]#

使用 ||
[root@vm ~]#
[root@vm ~]# ls || pwd
hello_world.sh
[root@vm ~]# hjjlk || pwd #兩個條件只有知足一個才執行,不能同時知足
-bash: hjjlk: command not found
/root
[root@vm ~]#

聯合使用 && + ||
[root@vm ~]#
[root@vm ~]# pwd && echo true || echo false #判斷命令是否正確
/root
true
[root@vm ~]#
[root@vm ~]# hgslk && echo true || echo false
-bash: hgslk: command not found
false
[root@vm ~]#

6)管道符 |
管道符:將前一個命令的輸出結果做爲後一個命令的輸入
行提取命令grep

[root@vm ~]#
[root@vm ~]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@vm ~]#

[root@vm ~]# netstat -an | grep ESTABLISHED #提取全部已經成功創建網絡鏈接的行
tcp 0 0 172.30.16.85:39248 100.100.30.26:80 ESTABLISHED
tcp 0 36 172.30.16.85:22 223.104.39.67:2859 ESTABLISHED
[root@vm ~]#
[root@vm ~]# netstat -an | grep ESTABLISHED | wc -l #統計已經成功創建網絡鏈接的行
2
[root@vm ~]#

7)通配符

8)bash中其餘特殊符號

[root@vm ~]#
[root@vm ~]# name=zhangsan
[root@vm ~]# echo $name
zhangsan
[root@vm ~]# echo '$name' #美圓符號在單引號中沒有特殊意義
$name
[root@vm ~]# echo "$name" #美圓符號在雙引號中有特殊意義
zhangsan
[root@vm ~]#
[root@vm ~]# today=date #不加反引號的話,系統不知道date是一個命令
[root@vm ~]# echo $today
date
[root@vm ~]#
[root@vm ~]# today=date #加上反引號的話,系統就會把date當作一個命令來執行
[root@vm ~]# echo $today
Tue Nov 17 22:45:24 CST 2020
[root@vm ~]#

注意:
只有想把date這種相似的命令先運行,接着再把該命令的運行結果賦值給變量的時候,才須要給命令添加反引號;
在shell中推薦用 $() 來代替反引號,避免出錯

[root@vm ~]# ls
hello_world.sh
[root@vm ~]#
[root@vm ~]# look=$(ls) #在Linux中 $() 和反引號的做用如出一轍,並且能夠避免看錯
[root@vm ~]# echo $look #將ls看到的內容賦值給look變量
hello_world.sh
[root@vm ~]#

小括號和大括號的區別:

[root@vm ~]#
[root@vm ~]# (name=wangwu;echo $name) #在小括號中執行命令的時候實際上是在子shell中執行,命令一旦執行完畢就會退出子shell,進入父shell中,因此在括號中打印出來的值和在括號外邊打印出來的值是不同的
wangwu
[root@vm ~]# echo $name
zhangsan
[root@vm ~]#
[root@vm ~]#
[root@vm ~]# { name=wangwu;echo $name; } #直接在父shell中執行,至關於不加括號同樣
wangwu
[root@vm ~]# echo $name
wangwu
[root@vm ~]#

\ :轉義符,將特殊符號的特殊意義給去掉,使特殊字符變成普通字符
[root@vm ~]#
[root@vm ~]# echo "$name"
wangwu
[root@vm ~]# echo "\$name"
$name
[root@vm ~]#

四、Bash的變量和運算符

1)變量的定義

[root@vm ~]#
[root@vm ~]# 1name=zhaoliu #變量不能以數字開頭,不然會報錯
-bash: 1name=zhaoliu: command not found
[root@vm ~]# name1=zhaoliu
[root@vm ~]#
[root@vm ~]# name = wangbadan #定義變量的時候,等號兩邊不能加空格
-bash: name: command not found
[root@vm ~]#

變量值是會覆蓋的,最後一次命名的值會將原來命名的變量值覆蓋掉
[root@vm ~]#
[root@vm ~]# name=1
[root@vm ~]# echo $name
1
[root@vm ~]# name=2
[root@vm ~]# echo $name
2
[root@vm ~]#
[root@vm ~]# num=123
[root@vm ~]# num="$num"456
[root@vm ~]# echo $num
123456
[root@vm ~]#

2)變量的分類

3)變量的查看
Set 【選項】
選項: -u
-u :若是設定了此選項,當調用未被聲明的變量的時候會報錯(默認是沒有任何提示的)
[root@vm ~]#
[root@vm ~]# echo $hihi #在執行一個不存在的變量的時候,發現變量值輸出老是爲空

[root@vm ~]#
[root@vm ~]# set -u
[root@vm ~]# echo $hihi #當執行了 set -u 這個命令的時候,發現變量的輸出值有顯示了
-bash: hihi: unbound variable
[root@vm ~]#

4)變量的刪除
unset 變量名
[root@vm ~]#
[root@vm ~]# name=zhangsan
[root@vm ~]# echo $name
zhangsan
[root@vm ~]# unset name
[root@vm ~]# echo $name
-bash: name: unbound variable
[root@vm ~]#

5)變量的比較
用戶自定義變量只能在當前shell中執行;而用戶自定義環境變量不只能夠在當前shell中執行,同時還能夠在子shell中執行

6)環境變量

環境變量的設置(重點)
使用 export 聲明的變量就是環境變量
[root@vm ~]#
[root@vm ~]# export age="25" #聲明一個名爲age的環境變量,變量值爲25
[root@vm ~]# echo $age #查看環境變量的值
25
[root@vm ~]#

環境變量的查詢和刪除
env命令和set命令的區別是:set命令能夠查看全部變量,而env命令只能查看環境變量
[root@vm ~]#
[root@vm ~]# name=wangwu #定義一個名爲name的變量
[root@vm ~]# echo $name
wangwu
[root@vm ~]# unset name #刪除這個變量
[root@vm ~]# env | grep name #查詢這個變量是否還存在
[root@vm ~]#

PATH變量 (重點)
PATH變量爲系統自帶的環境變量
PATH變量的做用是指明系統查找文件的路徑
[root@vm ~]#
[root@vm ~]# echo $PATH #查看PATH環境變量的值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vm ~]#
PATH變量的值是用「:」冒號分隔的路徑,這些路徑就是系統查找命令的路徑,也就是說當咱們輸入了一個程序名,若是沒有寫入路徑的話,系統就會到PATH變量定義的路徑中去尋找,是否有能夠執行的程序。若是找到的話就執行,不然會報「命令沒有發現的錯誤」。

那麼是否是咱們把本身寫的腳本拷貝到PATH變量定義的路徑中,咱們本身寫的腳本文件也能夠不用輸入路徑而直接運行呢?
[root@vm ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vm ~]#
[root@vm ~]# ll #查看腳本是否具備可執行的權限
total 4
-rw-r--r-- 1 root root 32 Nov 16 22:07 hello_world.sh
[root@vm ~]#
[root@vm ~]# chmod +x hello_world.sh #賦予腳本可執行的權限
[root@vm ~]# cp ./hello_world.sh /usr/bin/ #將該腳本從當前目錄拷貝至PATH變量所包含的目錄中
[root@vm ~]# hello_world.sh #在不輸入絕對路徑的狀況下直接執行該腳本程序,發現執行成功
hello world
[root@vm ~]#

那麼咱們是否是能夠經過修改PATH變量的值,而不是把腳本程序複製到 /usr/bin 目錄中,固然是能夠的。咱們只要經過變量的疊加就能實現
[root@vm ~]#
[root@vm ~]# rm -rf /usr/bin/hello_world.sh #先將原來拷貝到/usr/bin/目錄下的腳本文件刪除
[root@vm ~]# ls
hello_world.sh
[root@vm ~]#
[root@vm ~]# pwd #查看本身寫的腳本所在的當前路徑
/root
[root@vm ~]#
[root@vm ~]# PATH="$PATH":/root/ #將當前腳本所在的路徑加入到PATH變量的值中,默認以冒號進行分隔
[root@vm ~]# echo $PATH #查看當前PATH環境變量的值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/
[root@vm ~]#
[root@vm ~]# hello_world.sh #在沒有作任何拷貝的狀況下,直接執行本身編寫的腳本,發現腳本執行成功
hello world
[root@vm ~]#

PS1變量:命令提示符變量

[root@vm ~]#
[root@vm ~]# echo $PS1 #查看PS1變量的值
[\u@\h \W]\$
[root@vm ~]#

LANG語系變量
LANG變量定義了Linux系統的主語系環境,這個變量的默認值是 en_US.UTF-8
[root@vm ~]# echo $LANG #默認爲英文字符集
en_US.UTF-8
[root@vm ~]#
[root@vm ~]# locale -a | wc -l #目前 Linux 共支持789種語系
789
[root@vm ~]#
[root@vm ~]# locale #顯示系統當前已經安裝的語言程序
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[root@vm ~]#

位置參數變量

[root@linux ~]#
[root@linux ~]# vi count.sh
[root@linux ~]# cat count.sh
#!/bin/bash

a=$1
b=$2

sum=$(( $a + $b ))

echo $sum

[root@linux ~]#
[root@linux ~]# chmod +x count.sh #賦予腳本可執行權限
[root@linux ~]# ./count.sh 22 33 #執行腳本,並將22和33這兩個參數傳遞給$1和$2($1表明第一個參數,$2表明第二個參數,以此類推……)
55
[root@linux ~]#
[root@linux ~]# vi count.sh
[root@linux ~]# cat count.sh
#!/bin/bash

a=$1
b=$2

sum=$(( $a + $b ))

echo $sum

echo $0 #加入這行內容,在執行腳本

[root@linux ~]#
[root@linux ~]# ./count.sh 11 22 #寫入腳本中$0,默認會輸出執行命令自己
33
./count.sh
[root@linux ~]#
[root@linux ~]# vi para.sh
[root@linux ~]# cat para.sh
#!/bin/bash

echo "\$ is $"
echo "\$@ is $@"
echo "\$# is $#"

[root@linux ~]# chmod +x para.sh
[root@linux ~]# ./para.sh 11 22 33 #輸入參數
$ is 11 22 33
$@ is 11 22 33
$# is 3
[root@linux ~]#
[root@linux ~]# ./para.sh 1 2 3 4
$
is 1 2 3 4
$@ is 1 2 3 4
$# is 4
[root@linux ~]#
[root@linux ~]#
[root@linux ~]# vi for.sh
[root@linux ~]# cat for.sh #在in後面有幾個參數,就會循環幾回,第一次將1賦給i,第二次將2賦給i,第三次將3賦給i
#!/bin/bash

for i in 1 2 3
do
echo $i
done

[root@linux ~]#
[root@linux ~]# chmod +x for.sh #賦予可執行權限
[root@linux ~]# ./for.sh #執行腳本,輸出內容
1
2
3
[root@linux ~]#
[root@linux ~]# vi para2.sh
[root@linux ~]# cat para2.sh
#!/bin/bash

for I in "$*"
do
echo $i
done

echo ----------------------

for x in "$@"
do
echo $x
done

[root@linux ~]# chmod +x para2.sh
[root@linux ~]# ./para2.sh 11 22 33 #輸入3個參數並執行腳本,可得知$與$@的區別(第一個循環只循環了一次,由於不論你有幾個參數,在$看來都只是一個總體,因此只會循環一次;第二個循環循環了4次,由於$@會把每一個參數都區別對待,有4個參數因此就會循環4次。
11 22 33

11
22
33
[root@linux ~]#

預約義變量

[root@linux ~]#
[root@linux ~]# pwd
/root
[root@linux ~]# echo $? #查看上一條命令是否執行成功
0
[root@linux ~]#
[root@linux ~]# jkkhlgas
-bash: jkkhlgas: command not found
[root@linux ~]# echo $? #只要是命令執行失敗的話,$?的返回值就爲非0的數
127
[root@linux ~]#
[root@linux ~]#
[root@linux ~]# echo $$ #輸出當前進程的進程ID號
1151
[root@linux ~]#
[root@linux ~]# echo $! #輸出後臺運行的最後一個進程的進程id號

[root@linux ~]#

五、接收鍵盤輸入

[root@linux ~]#
[root@linux ~]# vi read.sh
[root@linux ~]# cat read.sh
#!/bin/bash

read -t 30 -p "please input a num1: " num1
read -t 30 -p "please input a num2: " num2

sum=$(( $num1 + $num2 ))

echo $sum

[root@linux ~]# chmod +x read.sh #賦予腳本可執行權限
[root@linux ~]# ./read.sh #執行腳本
please input a num1: 1
please input a num2: 2
3
[root@linux ~]#
[root@linux ~]# ./read.sh
please input a num1: 10
please input a num2: 20
30
[root@linux ~]#

六、shell 的運算符
1)數值運算的方法
若是咱們須要進行數值運算,能夠採用如下3種方法中的任意一種:
使用declare 聲明變量類型
既然全部變量的默認類型是字符串型,那麼只要咱們把變量聲明爲整數型不就能夠運算了嗎?使用declare命令就能夠實現聲明變量的類型。 命令以下:

[root@centos ~]#
[root@centos ~]# a=1 #定義變量a
[root@centos ~]# b=2 #定義變量b
[root@centos ~]# c=$a+$b #定義變量c等於$a+$b 的值
[root@centos ~]# echo $c #直接查看變量c的值,結果發現查看失敗(由於在shell中,全部的變量類型都爲字符型,不會把它當成數值型)
1+2
[root@centos ~]#
[root@centos ~]# declare -i c=$a+$b 使用declare將變量 c 指定爲數值型變量
[root@centos ~]# echo $c #查看變量c的值
3
[root@centos ~]#

2)數組變量類型

[root@centos ~]#
[root@centos ~]# name[0]="zhangsan" #定義數組name中第一個變量0的值爲張三
[root@centos ~]# name[1]="wangwu" #定義數組name中第一個變量0的值爲王五
[root@centos ~]# name[2]="maqi" #定義數組name中第一個變量0的值爲馬七
[root@centos ~]# echo ${name[*]} #查看數組中各個變量的值
zhangsan wangwu maqi
[root@centos ~]#

3)環境變量
咱們其實也可使用declare命令把變量聲明爲環境變量,和export命令的做用是同樣的
[root@centos ~]#
[root@centos ~]# declare -x test=123 #使用declare命令將test定義爲環境變量
[root@centos ~]# echo $test #查看test環境變量的值
123
[root@centos ~]#

4)只讀屬性
注意一旦給變量設置了只讀屬性,那麼這個變量既不能修改變量的值,也不能刪除變量,甚至不能使用「+r」選項取消只讀屬性,命令以下:
[root@centos ~]#
[root@centos ~]# declare -r test #將test變量賦予只讀屬性
[root@centos ~]# declare -p #查看變量
declare -rx test="123"
[root@centos ~]#
[root@centos ~]# unset test #此時嘗試刪除test變量,發現報錯沒有辦法刪除
-bash: unset: test: cannot unset: readonly variable
[root@centos ~]#
[root@centos ~]# test=456 #嘗試將test變量的值更改成456,結果顯示只有只讀權限,無權作修改
-bash: test: readonly variable
[root@centos ~]#

5)查詢變量屬性和取消變量屬性
變量屬性的查詢使用「-p」選項,變量屬性的取消使用「+」選項。命令以下:
[root@centos ~]#
[root@centos ~]# declare -p #查詢全部變量

6)使用expr或let數值運算工具
要想進行數值運算的第二種方法是使用expr命令,這種命令就沒有declare複雜了
[root@centos ~]#
[root@centos ~]# a=11 #定義變量a爲11
[root@centos ~]# b=22 #定義變量b爲22
[root@centos ~]# c=$(expr $a + $b) #定義變量c的值爲$(expr $a + $b)
[root@centos ~]# echo $c #查看變量c的值
33
[root@centos ~]#
[root@centos ~]# let d=$a+$b #使用let命令定義一個變量
[root@centos ~]# echo $d #查看變量d的值
33
[root@centos ~]#

7)使用"$((運算式))" 或 「[運算式]」方式運算
生產環境推薦使用 $((運算式)) 這種運算
其實這是一種方式"$(())"和"$[]" 這兩種括號按照我的習慣使用便可
[root@centos ~]#
[root@centos ~]# a=22
[root@centos ~]# b=33
[root@centos ~]# c=$(( $a+$b )) #定義一個變量c等於$a+$b 的值
[root@centos ~]# echo $c #查看變量$c的值
55
[root@centos ~]#

8)shell的經常使用運算符

七、四則運算練習
[root@centos ~]#
[root@centos ~]# vi count4.sh #編寫腳本
[root@centos ~]# cat count4.sh #查看腳本內容
#!/bin/bash

read -t 30 -p "please input num1: " num1
read -t 30 -p "please input num1: " num2
read -n1 -t 30 -p "please input operato[+-/]: " oper
echo -e "\n"
[ "$oper" == "+" ] && echo "$(( $num1 + $num2 ))"
[ "$oper" == "-" ] && echo "$(( $num1 - $num2 ))"
[ "$oper" == "
" ] && echo "$(( $num1 * $num2 ))"
[ "$oper" == "/" ] && echo "$(( $num1 / $num2 ))"

[root@centos ~]# chmod +x count4.sh #賦予腳本可執行權限
[root@centos ~]# ./count4.sh #執行腳本
please input num1: 22 #輸入數字
please input num1: 33 #輸入數字
please input operato[+-*/]: + #輸入運算符

55
[root@centos ~]#
[root@centos ~]# vi count4.sh #修改一下腳本內容
[root@centos ~]# cat count4.sh #查看腳本內容
#!/bin/bash

read -t 30 -p "please input num1: " num1
read -t 30 -p "please input num1: " num2
read -n1 -t 30 -p "please input operato[+-/]: " oper
echo -e "\n"
[ "$oper" == "+" ] && echo "$(( $num1 + $num2 ))" && exit
[ "$oper" == "-" ] && echo "$(( $num1 - $num2 ))" && exit
[ "$oper" == "
" ] && echo "$(( $num1 * $num2 ))" && exit
[ "$oper" == "/" ] && echo "$(( $num1 / $num2 ))" && exit

echo "請輸入正確運算符"
[root@centos ~]#
[root@centos ~]# ./count4.sh #執行一次正確的運算腳本
please input num1: 11
please input num1: 22
please input operato[+-/]:

242
[root@centos ~]#
[root@centos ~]# ./count4.sh #執行一次錯誤的運算腳本,對比效果
please input num1: 55
please input num1: 22
please input operato[+-*/]: c

請輸入正確運算符
[root@centos ~]#

八、變量的測試與內容置換

[root@centos ~]#
[root@centos ~]# y=""
[root@centos ~]# x=${y-new}
[root@centos ~]# echo $x

[root@centos ~]#
[root@centos ~]# y=1 #當y爲1的時候
[root@centos ~]# x=${y-new}
[root@centos ~]# echo $x #查看x的值
1
[root@centos ~]#

九、環境變量配置文件【重點內容】
1)source 命令
source 配置文件
或者
. 配置文件

2)環境變量配置文件
登陸時生效的環境變量配置文件
在Linux系統登陸時主要生效的環境變量配置文件有如下5個(按照生效順序排列):
/etc/profile #對全部用戶都生效
/etc/profile.d/*.sh #對全部用戶都生效
~/.bash_profile #只對當前用戶生效
~/.bashrc #只對當前用戶生效
/etc/bashrc #對全部用戶都生效

在用戶登錄過程先調用 /etc/profile 文件:

由/etc/profile文件調用/etc/profile.d/*.sh文件:

由/etc/profile文件調用~/.bash_profile文件:

由~/.bash_profile文件調用~/.bashrc文件

由~/.bashrc文件調用了/etc/bashrc文件:

3)在註銷時生效的環境變量配置文件

4)其它配置文件
還有一些環境變量配置文件,最多見的就是~/.bash_history文件,也就是歷史命令保存文件。

十、shell 登陸信息
/etc/issue

能夠支持的轉義符咱們能夠經過 man agetty 命令查詢,在下表中咱們列出常見的轉義符做用:

十一、定義bash快捷鍵
[root@centos ~]#
[root@centos ~]# stty -a #查詢全部的快捷鍵
speed 38400 baud; rows 35; columns 191; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[root@centos ~]#

SHELL 腳本編程基礎

相關文章
相關標籤/搜索