shell是一個命令解釋器,偵聽用戶指令,啓動這些指令進程,並將結果返回。(交互式shell)
同時shell也是一種程序設計語言,它有變量\關鍵字,各種流程控制語句。有自己的語法結構。
shell也有很多種,最常見的是bash,它是rhel默認的shell
查看shell信息
cat /etc/shells
echo $SHELL--查看當前shell
bash --version--查看當前shell版本
修改用戶shell
1.vim /etc/passwd 最後一個字段
2.chsh -s /bin/ksh tan2
bash初始化
用戶登錄時,要執行幾個文件
/etc/profile
~/.bash_profile
/etc/bashrc
~/.bashrc
~/.bash_logout
工作時:
~/.bash_history命令歷史
與.bash_history相關的設置在/etc/profile中
命令歷史調用:
!!執行前一個命令
!n執行編號爲n的命令
!-n倒數第n個歷史命令
!cmd 執行最近以cmd開頭的命令
esc + .上次命令的最後參數
禁用命令歷史
1.將/etc/profile中的HISTSIZE=0
2.刪除.bash_history 再創建一個同名的指向/dev/null的軟鏈接
bash中同時執行多條命令
1.有條件執行
命令用&&或||
&&前一個執行成功,才執行後一個
||前一個執行不成功,才執行後一個
2.無條件執行
命令依次寫,用分號隔開.
3.在子shell中執行,(),執行完之後再退出來,將結果返回主shell
(cd /etc/X11;ls)
命令執行的返回值
Linux每個進程執行完退出後,都會給父進程一點信息,叫返回狀態,
範圍一般爲0~255的整數
0表示成功無錯誤,其他的表示各種各樣的問題
查看返回值狀態:$?
()可以改變執行順序
命令行的替換
{}字符展開
touch hello{1,2,3}.c
$變量替代(取變量值)
${}變量替代(取變量值),安全取變量
$ (())數學運算
echo $((3*5))
``或$()命令替換(取命令執行的結果)
mkdir `echo root`
先執行echo root
再執行mkdir root
或者 mkdir $(echo $USER)
創建Shell步驟
1.創建一個腳本文件(第一行 #!/bin/bash)
2.設置其可執行權限
3.執行
如果沒有執行權限可以:
bash 文件名
source 文件名
shell調試
bash [option] 文件名
bash -x /test 顯示過程,顯示參數,變量值
-n檢查語法
1.輸入密碼,再回顯
read 讀數據,再將數據保存在變量中
格式:read [option] varname
-p提示
-s輸入時不顯示
-t n設置超時,如果幾秒內不輸入,就自動跳過
1 #!/bin/bash
2
3 read -s -p "Enter your password: " password
4 echo "\n"
5 echo "your password is: "
6 echo $password
2.從鍵盤輸入兩個數,顯示其中較大的那個:
if條件判斷
格式:
if [ 條件 ]; then
commands
fi
-----------------------------------
if [ 條件 ]
then
commands
fi
條件判斷:
數值
-gt大於
-ge大於等於
-lt小於
-le小於等於
-eq等於
-ne不等於
4 read -p "input a " a
5 read -p "input b " b
6 read -p "input c " c
7
8 if [ $a -le $b ];then
9 a=$b
10 fi
11 if [ $a -le $c ];then
12 a=$c
13 fi
14 echo $a
15
3.從鍵盤輸入用戶名,輸完之後顯示 hello,xx,如果5秒還沒輸入,就顯示hello 當前用戶名
if [ 條件 ]; then
commands
else
commands
fi
----------------------------------------------------------------
4.輸入一個IP,判斷這個主機是否能夠ping通,並給出提示
4 read -p "input the IP : " ip
5
6 echo
7 if ping -c 1 $ip > /dev/null
8 then
9 echo "ok"
10 else
11 echo "not"
12 fi
13 echo
14
---------------------------------------------------------------
Shell變量
shell變量分爲:局部變量和環境變量
環境變量中又有:
普通環境變量
位置參數
特定變量參數
局部變量:只存在於創建它的shell中,不能被子shell繼承
環境變量:能被子shell繼承
export B="abc" 定義爲環境變量
C="abc"缺省爲局部變量
查看變量
set查看所有變量
env查看環境變量
環境變量中系統內置的變量
$?命令執行的退出狀態
$$當前shellID
$PPID父進程ID
$!最新的後臺進程
$0當前執行程序的名字
$1第一個參數
$2~$10第二個到第十個參數
$#參數的個數
$*位置參數的內容
-----------------------------------------
./t5.sh 10.1.1.1
這樣的形式
3 if [ $# -ne 1 ]
4 then
5 echo "Wrong!! Usage [./t5.sh][10.1.1.1]"
6 exit
7 fi
8
9 echo $1
10 if ping -c 1 $1 > /dev/null
11 then
12 echo "Yeeeeeeeeeh!"
13 else
14 echo "Noooooooooo!"
15 fi
16
------------------------------------------------
變量定義:
varname=values
變量名由字母、數字、下劃線,但不能以數字開頭
.不能出現在變量中,一旦出現立刻結束
變量區分大小寫
賦值
1.賦值時=兩邊不能有空格
2.如果變量其值含有空格,要用引號括起來
變量運算
字符運算:
字符連接:無符號連接
計算長度:${#varname}
取子串:${varname:+/-n:n}
+/-就是字符串的左右多少個,後面n代表取幾個
-----------------------------------------------------------------------
條件測試:
字符:
= 等於
!=不等於
\>大於
\<小於
-z長度是否爲0(即判斷字符是否爲空)
-n長度是否不爲0(即判斷字符是否不爲空)
爲兩個變量賦值(交互式輸入read,輸入內容爲字符),顯示其值比較大的
3 read -p "input str1 " str1
4 read -p "input str2 " str2
5
6 if [ $str1 \> $str2 ]
7 then
8 echo "********************"
9 echo $str1
10 else
11 echo "********************"
12 echo $str2
13 fi
------------------------------------------------------------------
文件:
-b filename判斷是否爲塊設備
-c filename判斷是否爲字符設備
-d filename 判斷是否爲目錄
-e filename判斷文件是否存在
-f filename 判斷是否爲普通文件
任意輸入一個文件名(含路徑),判斷是否存在並給出相應提示,如果不存在就創建它,並提示創建了該文件
read -p "input a file name(include path) :" filename
if [ -e $filename ]
then
echo
echo $filename "exist!"
exit 1
else
echo $filename "has been created !"
exec mkdir $filename
fi
----------------------------------------------------------------------------