shell相比標准開發語言比如JAVA,C,C++來說還是比較簡單的,其實就是一堆命令的集合而已,初學者從簡單的shell腳本學起,至於shell編程還是要有編程思想在里面,因此,循序漸進很重要,先研究格式語法,再研究編程,今天就列舉一些shell里的概念,以便我們理解shell編程。
1、腳本聲明
在寫body之前要對shell腳本進行聲明,告訴操作系統,這是一個shell文件,不聲明的話系統默認為用bash來執行腳本。格式如下
#!/bin/bash(這里的bash可以換成sh、dash、tcsh、csh等)
2、腳本注釋
注釋格式和一般的編程語言類似,為:#+內容
3、腳本文件名稱規范
我們可以用.sh結尾,這是比較規范的寫法,但是注意,其實linux里這個.sh不作為識別文件類型的參照,僅僅是用來標記這是一個腳本文件而已,方便我們維護。
4、腳本執行方式
source [文件名]
. [文件名]
./ [文件名] (注意這種方式文件需要有執行權限)
bash/dash/sh [文件名]
5、管道符號
管道符號的意思是把上一條命令的執行結果作為下一條命令的參數
例如:cat /etc/passwd | grep "bash" | wc -l (統計下passwd文件下有"bash"的記錄有多少行)
6、重定向
<0 /dev/stdin 標准輸入
1> /dev/stdout 標准輸出 >> 追加而不是覆蓋
2> /dev/stderr 標准錯誤輸出 2>> 追加而不是覆蓋
&> 混合輸出 &>> 追加而不是覆蓋
注意:符號里的 0、1、2數字可以省略
例:
ls > file (意思是把ls查詢出來的內容放入file文件里,而不是顯示在屏幕上)
ls &> /dev/null (把結果放入黑洞設備,不顯示出來)
例:
cat test.txt 和 cat < test.txt 文件是一個意思
7、自定義變量
由用戶自己定義、修改和使用,變量名以字母或下划線開頭、區分大小寫
例1:
name=Tom
echo $name
Tom
例2:
name='zhang san'
echo $name
zhang san
例3:
name=bb
Name="$nameLY"
echo Name
bbLY
例4:
Name='$nameLY'
echo Name
$nameLY
例5:
TIME=`data`
echo $TIME
2016年10月25日星期五 12:32:55 CST
例6:
TIME=$(data)
echo $TIME
2016年10月25日星期五 12:32:55 CST
例7:交互定義變量
輸入:read -p "please input your name:"NAME
交互:please input your name:zhangsan
輸入:echo $NAME
輸出:zhangsan
例子總結:""識別里面的變量、''把里面當一個字符串、``把里面的命令執行結果定義
8、預定義變量
由bash預先定義好的一類特殊變量,用戶只能用不能改。
~] #cat mybak.sh
#!/bin/bash
tar zcf $* $>/dev/null
echo "已執行$0腳本"
echo "共完成$#個對象的備份"
echo"具體的內容包括:$*"
~] #./mybak.sh /etc/passwd /etc/shadow
已執行./mybak.sh腳本
共完成2個對象的備份
具體的內容包括:/etc/passwd /etc/shadow
解析:$*或$@保存腳本要處理的參數、$0保存腳本名稱、$#保存了腳本要處理的參數個數、$?保存着命令或腳本的運行狀態碼
9、位置變量
$n(n為1-9)就是位置變量
~] #vi test.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
~] #source test.sh zhangsan cloud yes
./test.sh
zhangsan
cloud
yes
注:$0是預定義變量,保存腳本名稱
10、環境變量
使用env命令可以查看當前工作環境下的環境變量,PATH變量用於設置可執行程序的默認搜索路徑,環境變量的全局配置為/etc/profile每個用戶還有自己獨立的配置文件 ~/.bash_profile。把路徑可執行文件的路徑寫到PATH變量中,就可以直接用路徑里的可執行文件。
例如:apachectl start
方法1:PATH=$PATH:/root (臨時生效,/root為可執行文件的存放路徑,這句話意思是把/root這個目錄添加到PATH變量里,是臨時寫入內存的)
方法2:echo "PATH=$PATH:/root" >> /etc/profile (永久生效)
11、變量的作用范圍
默認情況下新定義的變量只在當前shell環境中有效,因此稱為局部變量,當進入子程序或者新的shell環境時,局部變量將無法再次使用,為了解決這個問題,可以用export指定為全局變量。
格式1:export 變量名
格式2:export 變量名=變量值
例:
~] #NAME=zhangsan
~] #echo $NAME
zhangsan
~] #bash
~] #echo $NAME
"輸出為空"(因為切換shell環境了,而且變量沒有指定為全局變量)
12、運算
例:
~] #A=11
~] #B=22
~] #C=$A+$B
~] #echo $C
11+22
注:shell中輸出的值,linux默認為字符串。
那個為了使運算得以進行,可以這樣:
expr [變量] [運算符] [變量2]
+加法 -減法 \*乘法(\是轉意符,把*轉意為乘) /除法 %求模、取余
例:
~] #x=35
~] #y=16
~] #c=`expr $x + $y` (注:+ 左側和右側必須有空格)
~] #echo $c
51