Shell
用戶與系統內核之間交流平臺
Shell類型
/bin/sh
/bin/bash(系統默認bash)
/bin/tcsh
/bin/csh
/etc/shells 放置當前系統可用shell
爲什麼需要shell編程
1.減少繁瑣工作的重複進行,減少錯誤
2.提高工作效率
3.事態的批量化進行
Bash特點功能
1.查看命令歷史(1000條)
history 查看歷史命令
history -c 清空歷史命令
/etc/profile
2.別名
alias h5='head -5'
unalias h5
3.管道符重定向
ps aux | grep '3306'
echo "passewd" | passwd --stdin username
ls > list.txt
ls -l >> list.txt
mail -s test [email protected] < list.txt
find / -user yuxiang -type f > all 2> error
4.命令序列的使用技巧
在linux中,可以使用控制字符(;,&&,||,&)
&:將程序後臺執行
firefox & 可以用ctrl+z將進程後臺執行
jobs 查看後臺任務
fg n 將後臺任務拿到前臺
;:組合多個命令,命令間沒有任何邏輯關係,順序執行
[root@server ~]# ls /tmp;ls /root;ls /home
&&:組合多個命令,前一個命令執行成功才能執行後一個
make && make install
[root@server ~]# ls -lh initial-setup-ks.cfg && ls .
||:組合多個命令,前一個執行失敗,纔會執行後一個
[root@server ~]# id yuxiang &> /dev/null && echo "hi,yuxiang" || echo "No such user"
5.花括號{}使用技巧
通過花括號可以生成命令行或者腳本所需的字串
括號中可以包含連續的序列或使用逗號分割多個項目
連續的序列需要包括一個起點和一個終點,倆者之間用“..”分割
[root@server ~]# mkdir /tmp/dir{1,2,3}
[root@server ~]# mkdir /tmp/{dir4,dir5,dir6}
[root@server ~]# mkdir /tmp/dir{7..9}
[root@server ~]# rm -rf /tmp/dir{1..9}
[root@server ~]# echo user{1,5,9}
user1 user5 user9
[root@server ~]# echo {0..10}
0 1 2 3 4 5 6 7 8 9 10
[root@server ~]# echo {0..10..2}
0 2 4 6 8 10
[root@server ~]# echo {0..10..3}
0 3 6 9
[root@server ~]# echo {2..-1}
2 1 0 -1
[root@server ~]#
變量
變量是用來存儲非固定值的載體,它具有一個值,以及零個或多個屬性
創建變量語法格式:
name=[value]
1.變量如果沒有指定值(value),變量將被賦值爲空字符串
2.變量定義後調用《$變量名》來調用變量
3.變量的名稱爲字母,數字,下劃線組成
4.但首字母不能爲數字,=號間無空格
5.變量名無硬性的大小寫要求,建議使用大寫或首字母大寫
6.變量的值可修改,屬性可以通過typeset進行修改
NAME="魚老闆"
echo $NAME
typeset -r NAME #設置變量屬性只讀 -r
7.可以利用declare創建一個空變量,暫時不賦值
[root@server ~]# declare NUMBER #預先定義變量NUMBER
[root@server ~]# typeset -i NUMBER #設置NUNBER屬性爲整數型
[root@server ~]# NUMBER=test #強制賦值給變量
[root@server ~]# echo $NUMBER #打印變量結果爲0
0
[root@server ~]# NUMBER=200 #賦值整數成功
[root@server ~]# echo $NUMBER
200
8.通過read命令設置變量
read從標準輸入中讀取變量值(類似於python中的input)
使用-p選項添加相應的提示信息
[root@server ~]# read SAY
hello ervery
[root@server ~]# echo $SAY
hello ervery
[root@server ~]# read -p "plese tail me do you have girl friand:" SAY
plese tail me do you have girl friand:sorry,I do
[root@server ~]# echo $SAY
sorry,I do
[root@server ~]#
9.set 查看當前系統中設置的所有變量及值:set |grep ...
unset #刪除變量
unset 變量名
[root@server ~]# set | grep SAY
SAY='sorry,I do'
[root@server ~]# unset SAY
[root@server ~]# set | grep SAY
_=SAY
[root@server ~]#
變量的作用範圍
使用name=[value]創建變量,默認在當前shell中有效,子進程不會繼承這樣的變量
使用export命令將變量放置到環境變量中,此時可全局使用
export可以直接定義環境變量並賦值
也可以先定義一個普通的用戶變量,然後通export轉換爲環境變量
環境變量
Bash爲我們預設了很多環境變量,實際操作中我們可以直接調用這些變量(Bash手冊)
SHELL 查看當前系統的默認Bash
HOSTNAME 查看系統的主機名
BASHPID 查看當前Bash進程的進程號
UID 查看當前用戶的ID號
HOME 查看當前用戶的家目錄
PWD 查看當前工作目錄
PS1 主命令提示符
PS2 次命令提示符
RANDOM 0-32767之間的隨機數
PATH 命令搜索路徑
#path
添加PATH路徑:
PATH=$PATH:/root #追加
注意:絕對不能用下列方法
PATH=/root #此操作代表覆蓋
位置變量(主要體現在腳本中)
位置變量使得腳本中命令可以調用腳本時不同位置的參數,參數之間一般用空格隔開
$0 代表當前shell程序的文件名稱
$1 代表shell程序的第一個參數
$2 代表shell程序的第二個參數
以此類推($1-$9)
$# 代表shell程序所有參數的個數
$*和$@ 都代表所有參數的內容,區別是$*將所有參數作爲一個整體,而$@將所有參數作爲個體看待
$$ 代表當前進程的ID號
%? 代表程序的退出代碼(0代表執行成功,非0代表執行失敗)
[root@server ~]# cat weizhi.sh
#!/bin/bash
#This is test script for parme!
echo "This is the file name:$0"
echo "This is the first parm:$1"
echo "This sis the second parm:$2"
echo "This is the number of all parm:$#"
echo "This is the all parm:$*"
echo "This is the all parm:$@"
echo "This is PID:$$"
echo "This is parm over:$?"
[root@server ~]#
[root@server ~]# bash weizhi.sh a_1 b_2 c_3 d_4
This is the file name:weizhi.sh
This is the first parm:a_1
This sis the second parm:b_2
This is the number of all parm:4
This is the all parm:a_1 b_2 c_3 d_4
This is the all parm:a_1 b_2 c_3 d_4
This is PID:5224
This is parm over:0
[root@server ~]#
變量的展開與替換
#一下四組用於需要確定變量是否正確設置環境
${varname:-work} #當varname存在且不爲空,則返回varname值,否則返回word
${varname:=word} #當varname存在且不爲空,返回varname值,否則返回word ##同時對var進行賦值操作
${varname:?message} #當varname存在且不爲空,返回varname值,否則顯示varname:message
${varname:+word} #當varname存在且不爲空,返回word,否則返回null
[root@localhost ~]# NAME=BJTLXY
[root@localhost ~]# echo $NAME
BJTLXY
[root@localhost ~]# echo ${NAME:-no user};echo ${NAME}
BJTLXY
BJTLXY
[root@localhost ~]# echo ${NAME:=dana};echo ${NAME}
BJTLXY
BJTLXY
[root@localhost ~]# echo ${NAMEs:=dana};echo ${NAME}
dana
BJTLXY
[root@localhost ~]# echo ${NAME:?shuo sha lie};echo $NAME
BJTLXY
BJTLXY
[root@localhost ~]# echo ${NAMEs:?shuo sha lie};echo $NAME
dana
BJTLXY
[root@localhost ~]# echo ${NAMES:?shuo sha lie};echo $NAME
-bash: NAMES: shuo sha lie
[root@localhost ~]# echo ${NAMEses:+huanglaoban};echo $NAME
BJTLXY
[root@localhost ~]# echo ${NAME:+huanglaoban};echo $NAME
huanglaoban
BJTLXY
[root@localhost ~]#
#下面六組主要用於需要對變量的值做修改後輸出的場景
${varname#key} #從頭開始刪除關鍵字(key),執行最短匹配
${varname##key} #從頭開始刪除關鍵字,執行最長匹配
${varname%key} #從尾部開始刪除關鍵字,執行最短匹配
${varname% %key} #從尾部開始刪除關鍵字,執行最長匹配
${varname/old/new} #將old替換爲new,替換第一個出現的old
${varname//old/new} #將old替換爲new,替換所有
[root@localhost ~]# USR=$(head -1 /etc/passwd)
[root@localhost ~]# echo $USR
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${USR#*:}
x:0:0:root:/root:/bin/bash
[root@localhost ~]# echo $USR
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${USR##*:}
/bin/bash
[root@localhost ~]# echo ${USR%:*}
root:x:0:0:root:/root
[root@localhost ~]# echo ${USR%%:*}
root
[root@localhost ~]# echo ${USR/root/admin}
admin:x:0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${USR//root//admin}
/admin:x:0:0:/admin://admin:/bin/bash
[root@localhost ~]#
數組
一組具有相同數據類型的集合
數據類型:
數值類型:
字符串類型:
bash提供一維數組的變量功能,數組中所有便利那個都會被編錄成索引,數組的索引從0開始
創建數組:
1.name[subscript]=value
2.name=(value1………………valuen) #用空格隔開
3.declare -a <name> 定義一個空數組
獲取數組的值
可以使用echo ${name[subscript]} 通過索引得到數組的值
如果subscript是@或者*,則將調用所有的數組成員
如果使用${#name[subscript]}可以返回${name[subscript]}長度
如果是*或@,則返回數組中元素個數
[root@localhost ~]# A[1]=11
[root@localhost ~]# A[2]=22
[root@localhost ~]# A[3]=33
[root@localhost ~]# echo ${A[0]}
[root@localhost ~]# echo ${A[1]}
11
[root@localhost ~]# echo ${A[-1]}
33
[root@localhost ~]# A[-1]=99
-bash: A[-1]: bad array subscript
[root@localhost ~]# A[6]=66
[root@localhost ~]# echo ${A[*]}
11 22 33 66
[root@localhost ~]# echo ${A[@]}
11 22 33 66
[root@localhost ~]# echo ${#name[*]}
0
[root@localhost ~]# echo ${#name[@]}
0
[root@localhost ~]# echo ${#A[@]}
4
[root@localhost ~]# echo ${#A[1]}
2
[root@localhost ~]# echo ${A[0]},${A[1]},${A[2]},${A[3]}
,11,22,33
[root@localhost ~]# A[0]=00
[root@localhost ~]# echo ${A[0]},${A[1]},${A[2]},${A[3]}
00,11,22,33
[root@localhost ~]#
[root@localhost ~]# B=(aa bb cc)
[root@localhost ~]# echo ${B[0]},${B[1]},${B[2]}
aa,bb,cc
[root@localhost ~]# echo ${B[0]}:${B[1]}:${B[2]}
aa:bb:cc
[root@localhost ~]# echo 'length if B_0 is ${#B[0]}' #請注意此處的錯誤
length if B_0 is ${#B[0]}
[root@localhost ~]# echo 'length of B_0 is' ${#B[0]}
length of B_0 is 2
[root@localhost ~]# echo 'length of B_1 is' ${#B[1]}
length of B_1 is 2
[root@localhost ~]# echo ${#B[*]}
3
[root@localhost ~]#
數值型數組:(一對括號表示,元素之間空格隔開)
arr_num=(1 2 3 4 5 6)
字符型數組:
arr_string=('aa' 'bb' 'cc' 'dd' )
數組常用操作:
獲取數組的長度:
arr_length=${#arr_num[*]}
arr_length=${#arr_string[@]}
列出索引下標:
echo ${!arr_num[@]}
讀取某個下標的值:
arr_index_2=${arr_num[2]}
對某個下標進行賦值
下標存在:相當與修改原有的值
arr_num[2]=100
下標不存在,按照升序走
arr_num[23]=100
刪除操作:
清除某個元素
unset arr_num[1]
清除整個數組:
unset arr_num
數組的切片:
格式:${數組名[@/*]:開始下標:取數數值}
echo ${arr_string[*]:2:3}
數組的遍歷:
for v in ${arr_string[@]};do
echo $v;
done