Shell指令碼學習筆記

滴水微瀾發表於2017-03-19

Shell簡介:

Shell是一個命令直譯器,也可以看做為一種系統軟體,提供了使用者與核心之間進行互動的一種通道,它解釋由使用者輸入的命令並且把它們送到核心去執行,執行效率高。

  1 #!/bin/bash
  2 
  3 # 第一個指令碼
  4 # chmod +x ./test.sh   使指令碼具有執行許可權
  5 # ./test.sh            在當前目錄下執行指令碼
  6 # /bin/sh test.sh      指定直譯器,執行指令碼
  7 
  8 #echo "hello World!"
  9 
 10 
 11 #----------------------------------------------#
 12 # 第二個指令碼
 13 # 宣告變數、給變數賦值、宣告變數為只讀型別
 14 your_name="zhoufei"
 15 echo $your_name
 16 echo ${your_name}
 17 
 18 your_name="google"
 19 echo ${your_name}
 20 
 21 #readonly your_name
 22 your_name="宣告為只讀變數"
 23 
 24 # 字串
 25 # ''輸出純字串,有變數也失效
 26 # ""裡面可以包含變數
 27 your_name2='baidu'
 28 str="hello I know your are \"${your_name2}\" ! \n"
 29 echo ${str}
 30 
 31 # 字串拼接
 32 your_name3="baidu3"
 33 greeting="I like "${your_name3}"! ---"
 34 greeting2="I like "$your_name3" ! \n"
 35 echo ${greeting} ${greeting2}
 36 
 37 # 字串長度
 38 echo "${your_name3} 長度是:${#your_name3}"
 39 
 40 # 子字串
 41 your_name4='獲取這個字串的後三位'
 42 echo ${your_name4:8:3}
 43 
 44 # 查詢子字串
 45 your_name5="runoob is a great company"
 46 #echo `expr index "${your_name5}" is`
 47 
 48 # 陣列
 49 echo "----------陣列---------"
 50 array_name=(name1 name2 name3)
 51 echo "這是一個陣列-${array_name[@]}"
 52 array_name[3]='name4'
 53 echo "這是一個陣列-${array_name[@]}"
 54 echo "陣列的長度:${#array_name[@]}"
 55 echo "陣列中第0個元素的長度:${#array_name[0]}"
 56 
 57 # Shell傳遞引數 $n
 58 echo "----------Shell傳遞引數---------"
 59 echo 'Shell傳遞引數驗證如下:'
 60 echo "檔名:$0"
 61 echo "第一個引數:$1"
 62 echo "第二個引數:$2"
 63 echo "指令碼執行的程式ID號:$$"
 64 
 65 # Shell運算子
 66 # expr 是一個計算工具,完成表示式的求值操作
 67 val1=`expr 1 + 1`
 68 echo "expr 運算子的執行結果是$val1"
 69 
 70 # 算術運算子
 71 echo "----------算術運算子---------"
 72 a=10
 73 b=20
 74 val2=`expr $a + $b`
 75 val3=`expr $a - $b`
 76 val4=`expr $a \* $b`
 77 val5=`expr $a / $b`
 78 val6=`expr $a % $b`
 79 echo "a + b : $val2"
 80 echo "a - b : $val3"
 81 echo "a * b : $val4"
 82 echo "a / b : $val5"
 83 echo "a % b : $val6"
 84 if [ $a == $b ]; then
 85     echo "a 等於 b"
 86 fi
 87 if [ $a != $b ]; then
 88     echo "a 不等於 b"
 89 fi
 90 
 91 # 關係運算子
 92 echo "----------關係運算子---------"
 93 if [[ $a -eq $b ]]; then
 94     echo "a 等於 b"
 95 fi
 96 if [[ $a -ne $b ]]; then
 97     echo "a 不等於 b"
 98 fi
 99 if [[ $a -gt $b ]]; then
100     echo "a 大於 b"
101 fi
102 if [[ $a -lt $b ]]; then
103     echo "a 小於 b"
104 fi
105 if [[ $a -ge $b ]]; then
106     echo "a 大於等於 b"
107 fi
108 if [[ $a -le $b ]]; then
109     echo "a 小於等於 b"
110 fi
111 
112 # 布林運算子 !、-o、-a
113 echo "----------布林運算子---------"
114 if [[ $a != $b ]]; then
115     echo "a 不等於 b"
116 fi
117 if [ $a -lt $b -o $a -eq $b ]; then
118     echo "a 大於等於 b"
119 fi
120 if [ $a -gt 1 -a $b -lt 10 ]; then
121     echo "a > 1 並且 b < 10"
122 else
123     echo "a > 1 並且 b < 10 是錯誤的!"
124 fi
125 
126 # 邏輯運算子 && ||
127 echo "----------邏輯運算子---------"
128 if [[ $a -gt 1 && $a -lt 100 ]]; then
129     echo "a 大於1 並且 a 小於100 成立"
130 else
131     echo "a 大於1 並且 a 小於100 不成立"
132 fi
133 if [[ $a -le 10 || $a -gt 100 ]]; then
134     echo 'a 小於等於10 或者 a 大於 100 有一個成立'
135 else
136     echo 'a 小於等於10 或者 a 大於 100 都不成立'
137 fi
138 
139 # 字串運算子
140 echo "----------字串運算子---------"
141 string1='string1'
142 string2='string2'
143 if [[ $string2 = $string1 ]]; then
144     echo "string1 等於 string2"
145 else
146     echo "string1 不等於 string2"
147 fi
148 if [[ $string2 != $string1 ]]; then
149     echo "string2 不等於 string1"
150 fi
151 if [[ -z $string1 ]]; then
152     echo "string1 長度是:0"
153 fi
154 if [[ -n $string1 ]]; then
155     echo "string1 長度不是:0"
156 fi
157 if [[ $string1 ]]; then
158     echo "string1 不為nil"
159 fi
160 
161 # 檔案測試運算子
162 echo "----------檔案測試運算子---------"
163 file1='假如為:檔案'
164 file2='假如為:資料夾'
165 if [[ -d $file2 ]]; then
166     echo '檢測檔案為資料夾'
167 fi
168 if [[ -f $file1 ]]; then
169     echo '檢測檔案為普通檔案'
170 fi
171 if [[ -s $file1 ]]; then
172     echo '檢測檔案為空'
173 fi
174 if [[ -e $file1 ]]; then
175     echo '檢測檔案為存在的'
176 fi
177 
178 # echo命令
179 echo "----------echo命令---------"
180 echo "It is a test"
181 echo "\"It is a test\""
182 echo "下面換行 \n"
183 echo -e "下面不換行 \c"  # -e 開啟轉義 \c 不換行
184 echo "字串重定向到檔案中" > myfile
185 echo '字串原樣輸出 $a'
186 echo `date` #顯示執行結果
187 
188 # printf命令
189 # printf  format-string  [arguments...]
190 # %s %c %d %f都是格式替代符
191 # %-10s 指一個寬度為10個字元(-表示左對齊,沒有則表示右對齊),任何字元都會被顯示在10個字元寬的字元內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
192 # %-4.2f 指格式化為小數,其中.2指保留2位小數。
193 # \n換行  \r回車
194 echo "----------printf命令---------"
195 echo 'Hello, Shell,能夠自動換行'
196 printf "Hello, Shell,不能自動換行,需要手動加換行符 \n"
197 printf "%-10s %-8s %-4s\n" 姓名 性別 體重
198 printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.12345
199 printf "%-10s %-8s %-4.2f\n" 楊過 男 77.12345
200 
201 # test命令
202 # Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字元和檔案三個方面的測試。
203 echo "----------test命令---------"
204 test1=100
205 test2=101
206 testString1='testString1'
207 testString2='testString2'
208 if test $test1 -lt $test2 ; then
209     printf "%s\n" test1小於test2 
210 fi
211 if test -z testString1 ; then
212     printf "testString1長度為0"
213 else
214     printf "testString1長度不為0 ,:%s\n" testString1
215 fi
216 if test -e ./test1.sh ; then
217     printf "檔名:test1.sh 存在\n"
218 else
219     printf "檔名:test1.sh 不存在\n"
220 fi
221 
222 # Shell流程控制
223 echo "----------Shell流程控制---------"
224 # if else-if else
225 if [[ $a == $b ]]; then
226     echo "a 等於 b"
227 elif [[ $a -gt $b ]]; then
228     echo "a 大於 b"
229 elif [[ $a -lt $b ]]; then
230     echo "a 小於 b"
231 else
232     echo "沒有符合條件的"
233 fi
234 num1=$[2*3]
235 num2=$[1+5]
236 if  test $num1 -eq $num2 ; then
237     echo "num2 等於 num1"
238 else
239     echo "num1 不等於 num2"
240 fi
241 # for 迴圈
242 for loop in  1 2 3 4 5 6; do
243     # echo "當前輸入的值是:$loop"
244     printf "當前輸入的值是:%s\n" $loop 
245 done
246 for string in 'This is a String!'; do
247     echo "$string"
248 done
249 # while 語句
250 # let 命令,它用於執行一個或多個表示式
251 ignore0(){
252     count=1;
253     while [[ $count -lt 10 ]]; do
254         echo "while 執行結果:$count"
255         let "count++"
256     done
257     echo '按下 <CTRL-D> 退出'
258     echo -n '輸入你最喜歡的電影名: '
259     while read Film ; do
260         echo "是的! $Film 是一部好電影!"
261     done
262 }
263 #ignore0
264 ignore1(){
265     while true:
266     do
267         echo "無限迴圈!"
268     done
269     until false ; do
270         echo "無限迴圈!"
271     done
272 }
273 #ignore1
274 # case語句
275 ignore2(){
276     echo '請輸入1到4之間的數字'
277     echo '你輸入的數字是:'
278     read aNum
279     case $aNum in
280         1 )
281      echo "輸入的數字為:$aNum"
282         ;;
283         2 )
284      echo "輸入的數字為:$aNum"
285         ;;
286         3 )
287      echo "輸入的數字為:$aNum"
288         ;;
289         4 )
290      echo "輸入的數字為:$aNum"
291         ;;
292         * )
293      echo "你輸入的數字不在1-4之間"
294         ;;
295     esac
296 }
297 #ignore2
298 # break命令
299 ignore3(){   
300     while true
301     do
302         echo '輸入1-5之間的資料'
303         read aNum
304         case $aNum in
305             1|2|3|4|5 )
306              echo "輸入的數字為:$aNum"
307                 ;;
308             * )
309              echo "你輸入的數字不在1-4之間"
310              break
311              #continue
312              echo "遊戲結束"
313             
314         esac
315     done
316 }
317 #ignore3
318 # Shell 函式
319 echo "----------Shell 函式---------"
320 demoFunc(){
321     echo '這是第一個函式'
322 }
323 echo '第一個函式開始'
324 demoFunc
325 echo '第一個函式結束'
326 funWithReture(){
327     echo '這個函式會對輸入的引數進行加法執行...'
328     echo '輸入第一個引數:'
329     read para1
330     echo '輸入第二個引數:'
331     read para2
332     echo "兩次輸入的引數分別是:$para1---$para2"
333     return $(($para1+$para2))
334 }
335 funWithReture 
336 echo "輸入的數字之和為:$?"
337 
338 # Shell 輸入/輸出重定向
339 echo "----------Shell 輸入/輸出重定向---------"
340 date >> myfile
341 cat myfile
342 wc -l << EOF
343 標題
344 測試 Head Document 型別
345 的追加重定向命令
346 EOF
347 ls > myfile 2>&1
348 ls > /dev/null 2>&1
349 
350 # Shell 檔案包含
351 echo "----------Shell 檔案包含---------"
352 source ./test2.sh
353 echo "引用外部的test2.sh檔案中的url變數,URL變數為:$url"

 

相關文章