經過本章學習咱們能夠學會如下內容:
linux
一 什麼是shell以及shell的好處
shell
二 shell腳本的格式以及變量的使用方法編程
三 test測試語句和if流程控制vim
四 case-for-while語句的使用方法bash
五 中雙小括號的使用方法編程語言
六 循壞嵌套使用方法ide
一 什麼是shell以及shell的工做方式:oop
shell簡單來講能夠當作人與計算機之間的翻譯官,他做爲用戶與linux系統內部的通訊媒介,除了可以支持各類變量與參數外,還能夠提供循壞、分之等高級編程語言纔有的控制結構特性。
學習
shell的工做方式有二種:測試
交互式:用戶每輸入一條命令就當即執行。
批處理:用戶先編好一個完整的shell腳本,shell會一次執行腳本的多個命令。
二 shell腳本的格式以及變量的使用方法
建立shell腳本的步驟:
第一步:建立一個包含命令和控制結構的shell文件,通常是後綴.sh
第二部:修改文件的權限使它能夠執行,通常使用chmod U+x 再加文件名
第三步:執行腳本
方法一: ./加腳本名稱(經常使用這一種)
方法二:使用絕對路徑
方法三:bash加文件名
舉例說明:建立一個腳本,查詢一下他的路徑和包含的文件內容。
[root@baiyijie jiaoben]# vim example01.sh 建立腳本名稱
[root@baiyijie jiaoben]# chmod +x example01.sh加上執行權限
[root@baiyijie jiaoben]# ./example01.sh 運行腳本
our first example
we are currently in the following directory.
/root/jiaoben
this directory contains the following files
example01.sh
[root@baiyijie jiaoben]# cat example01.sh查看腳本內容
#!/bin/bash
#this is to show what a example looks like.
echo "our first example"
echo # this inserts an empty line in output .
echo "we are currently in the following directory."
pwd
echo
echo "this directory contains the following files"
ls
shell變量的使用方法:
用戶定義變量:由字母或者下劃線開頭,由字母或者下劃線組成,大小寫字母意義不一樣,變量長度沒有限制。
使用變量值時:要在變量名前加上前綴"$"
舉例說明:2VAR就是非法變量
變量賦值:賦值號 = 二邊沒有空格
舉例說明:
[root@localhost ~]# A=aaa變量賦值這種正確的
[root@localhost ~]# A = AAA 這種錯誤
-bash: A: command not found
[root@localhost ~]# echo $A 使用變量
aaa
[root@localhost ~]# A=`date` 將一個命令的執行結果賦予變量注意加``
[root@localhost ~]# echo $A
Thu Mar 22 10:33:58 CST 2018
[root@localhost ~]# B=$(ls -l) B的變量賦值就是一個ls -l的命令
[root@localhost ~]# echo $B
total 40 -rw-------. 1 root root 1409 Mar 14 22:00 anaconda-ks.cfg -rwxr-xr-x. 1 root root 75 Mar 16 15:26 backup.sh -rwxr-xr-x. 1 root root 115 Mar 19 16:00 baojing.sh -rwxr-xr-x. 1 root root 195 Mar 16 17:00 caipiao.sh drwxr-xr-x. 2 root root 24 Mar 22 10:11 jiaoben drwxr-xr-x. 4 root root 49 Mar 19 20:38 lianxi -rwxr-xr-x. 1 root root 184 Mar 20 15:46 mizhi.sh -rwxr-xr-x. 1 root root 113 Mar 20 15:05 pingfang.sh -rwxr-xr-x. 1 root root 235 Mar 20 21:26 sanjiao.sh -rwxr-xr-x. 1 root root 44 Mar 19 14:17 shifen.sh -rwxr-xr-x. 1 root root 92 Mar 19 15:53 wokao.sh -rwxr-xr-x. 1 root root 112 Mar 20 15:19 xingqitian.sh drwxr-xr-x. 2 root root 6 Mar 18 13:48 zuoye
[root@localhost ~]# A=$B A賦值變量B的內容
[root@localhost ~]# echo $A
total 40 -rw-------. 1 root root 1409 Mar 14 22:00 anaconda-ks.cfg -rwxr-xr-x. 1 root root 75 Mar 16 15:26 backup.sh -rwxr-xr-x. 1 root root 115 Mar 19 16:00 baojing.sh -rwxr-xr-x. 1 root root 195 Mar 16 17:00 caipiao.sh drwxr-xr-x. 2 root root 24 Mar 22 10:11 jiaoben drwxr-xr-x. 4 root root 49 Mar 19 20:38 lianxi -rwxr-xr-x. 1 root root 184 Mar 20 15:46 mizhi.sh -rwxr-xr-x. 1 root root 113 Mar 20 15:05 pingfang.sh -rwxr-xr-x. 1 root root 235 Mar 20 21:26 sanjiao.sh -rwxr-xr-x. 1 root root 44 Mar 19 14:17 shifen.sh -rwxr-xr-x. 1 root root 92 Mar 19 15:53 wokao.sh -rwxr-xr-x. 1 root root 112 Mar 20 15:19 xingqitian.sh drwxr-xr-x. 2 root root 6 Mar 18 13:48 zuoye
[root@localhost ~]# A=date 看這裏不加``會有什麼後果
[root@localhost ~]# echo $A
date 只輸出date
這裏要說一下單引號和雙引號的區別:
單引號之間的內容原封不動的指定給了變量
雙引號取消了空格的做用,特殊符號的含義保留。
列出全部的變量用set
位置變量和特殊變量
位置變量:shell 解釋執行用戶的命令時,將命令執行的第一個字做爲命令名,而其餘字做爲參數,由出如今命令行上的位置肯定的參數稱爲位置參數。位置變量:使用$N來表示。
舉例說明:
[root@localhost ~]# ./example.sh file1 file2 file3
$0 這個程序的文件名 example.sh
$n 這個程序的第n個參數值。n=1..n
特殊變量:
有些變量一開始執行腳本的時候就會設定,且不能被修改,但咱們不叫它只讀的系統變量,而叫它特殊變量,這些變量當一執行程序就有了,如下是一些特殊變量:
$*這個程序的全部參數
$#這個程序參數的個數
$$這個程序的PID
$!執行上一個後臺程序的PID
$?執行上一個指令的返回值
舉例說明:寫一個腳本表示出程序的全部參數進程ID和程序參數的個數。
[root@baiyijie jiaoben]# vim z.sh
[root@baiyijie jiaoben]# chmod +x z.sh
[root@baiyijie jiaoben]# ./z.sh
表示這個程序的全部參數
0 表示這個程序的參數的個數
3486 表示程序進程的ID
3488 執行上一個就太指令的PID
3486 表程序的進程ID
[root@baiyijie jiaoben]# ./z.sh aaa bbb ddd cccc加入一些參數
aaa bbb ddd cccc 表示這個程序的全部參數
4 表示這個程序的參數的個數
3489 表示程序進程的ID
3491 執行上一個就太指令的PID
3489 表程序的進程ID
[root@baiyijie jiaoben]# cat z.sh查看腳本
#!/bin/bash
echo "$* 表示這個程序的全部參數"
echo "$# 表示這個程序的參數的個數"
touch /tmp/a.txt
echo "$$ 表示程序進程的ID"
touch /tmp/b.txt &
echo "$! 執行上一個就太指令的PID"
echo "$$ 表程序的進程ID"
三 test測試語句和if流程控制
&& 表明條件性的AND
|| 表明條件性的OR
test也能夠寫成[]
數值測試:-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
IF語法:
if條件
then
語句
fi
擴展; 分號,表示二個命令寫在一行,互不影響。
if語法:
if 條件 ;then
命令1
else
命令2
fi
舉例說明;寫一個腳本,能夠判斷他是目錄,或者是普通文件,或者是設備文件。
[root@localhost ~]# vim fuza.sh
[root@localhost ~]# chmod +x fuza.sh
[root@localhost ~]# ./fuza.sh 執行腳本
./fuza.sh: line 1: i#/bin/bash: No such file or directory
input a file name 讓我輸入一個文件名
/etc 輸入/etc
/etc is a dir 系統判斷他是一個目錄
[root@localhost ~]# ./fuza.sh
./fuza.sh: line 1: i#/bin/bash: No such file or directory
input a file name
/etc/passwd
/etc/passwd is file
[root@localhost ~]# ./fuza.sh
./fuza.sh: line 1: i#/bin/bash: No such file or directory
input a file name
hhhk
hhhk is an unknow file
[root@localhost ~]# ./fuza.sh
./fuza.sh: line 1: i#/bin/bash: No such file or directory
input a file name
/dev/sda
/dev/sda is a device file 說它是一個設備文件
[root@localhost ~]# cat fuza.sh
i#/bin/bash
echo "input a file name"
read file_name
if [ -d $file_name ] ; then
echo "$file_name is a dir"
elif [ -f $file_name ] ;then
echo "$file_name is file"
elif [ -c $file_name -o -b $file_name ] ; then
echo "$file_name is a device file"
else
echo "$file_name is an unknow file"
fi
四 case-for-while語句的使用方法
case: 流程控制語句,適用於多分支。
格式:
case 變量 in
字符串1)命令列表1
;;
....
字符串n)命令列表n
;;
esac
舉例說明:
製做一個菜單,能夠選擇bcd,分別表明backup copy delete
文字部分
[root@localhost lianxi]# vim case.sh
[root@localhost lianxi]# chmod +x case.sh
[root@localhost lianxi]# ./case.sh 執行腳本
****************************
Please selet you operation:
1 Copy
2 Delete
3 Backup
*****************************
C 我輸入C
your seletion is copy 說我選擇的是copy
[root@localhost lianxi]# ./case.sh
****************************
Please selet you operation:
1 Copy
2 Delete
3 Backup
*****************************
D
your seletion is delete
[root@localhost lianxi]# ./case.sh
****************************
Please selet you operation:
1 Copy
2 Delete
3 Backup
*****************************
B
your seletion is backup
[root@localhost lianxi]# cat case.sh
#!/bin/bash
echo "****************************"
echo "Please selet you operation:"
echo " 1 Copy"
echo " 2 Delete"
echo " 3 Backup"
echo "*****************************"
read op
case $op in
C)
echo "your seletion is copy"
;;
D)
echo "your seletion is delete"
;;
B)
echo "your seletion is backup"
;;
*) # 參數*, 匹配全部參數。
echo "invalide selection"
;;
esac
whlie 是循壞語句,用在循壞中
格式:
while 條件
do
命令
done
話很少說,繼續舉例說明:
算出一到十的平方,用腳本寫出來。
腳本內容:
文字說明:
[root@localhost ~]# vim pingfang.sh
[root@localhost ~]# chmod +x pingfang.sh
[root@localhost ~]# ./pingfang.sh
1
4
9
16
25
36
49
64
81
100
[root@localhost ~]# cat pingfang.sh
#!/bin/bash
num=1
while [ $num -le 10 ] 當變量小於10的時候執行下面的動做
do
square=`expr $num \* $num` 變量的值相乘。中間要用轉移符
echo $square
num=`expr $num + 1` 每次執行加一下
done
五 中雙小括號的使用方法
使用(())擴展shell中算數運算的使用方法,使用[]的時候,必須保證運算符與算數之間有空格,四則運算也只能藉助expr命令來完成,咱們今天的說的(())結構語句,就是對shell中算數及賦值運算的擴展。
舉例說明:
依次輸出小於100之內2的冪值,輸出的結果應該爲:2 4 8 16。
腳本的內容:
文字解釋:
[root@localhost ~]# vim mizhi.sh
[root@localhost ~]# chmod +x mizhi.sh
[root@localhost ~]# ./mizhi.sh
the while loop example
value of the variable is : 1
value of the variable is : 2
value of the variable is : 4
value of the variable is : 8
value of the variable is : 16
value of the variable is : 32
value of the variable is : 64
the loop execution is finished
[root@localhost ~]# cat mizhi.sh 查看一下腳本內容
#!/bin/bash
echo "the while loop example"
echo
var1=1
while ((var1<100)) 注意這裏能夠省去$
do
echo "value of the variable is : $var1"
((var1=var1*2)) 這裏也是能夠省去$
done
echo
echo "the loop execution is finished"
六 循壞嵌套使用方法
顧名思義就是在一個腳本中使用循壞嵌套來實現更簡單的用法。
舉例說明;使用特殊符號打印三角形。要求整個程序要有交互,運行時能夠自動輸入打印的行數和用於描繪三角形的特殊符號。
腳本內容:
文字解釋
[root@localhost ~]# vim sanjiao.sh
[root@localhost ~]# chmod +x sanjiao.sh
[root@localhost ~]# ./sanjiao.sh
please enter the line number:6
please enter the char number:*
*
**
***
****
*****
******
[root@localhost ~]# cat sanjiao.sh
#!/bin/bash
read -p "please enter the line number:" line
read -p "please enter the char number:" char
a=1
while [ $a -le $line ]
do
b=1
while [ $b -le $a ] 當變量b的值小於等於變量a的值時,執行do
do
echo -n "$char" 輸出
b=`expr $b + 1` 變量b的值加一
done
echo
a=`expr $a + 1`
done
[root@localhost ~]#
寫了這麼多,你也看出來了。沒有什麼捷徑,捷徑就是一天一個腳本,遲早你就會成功。