一、基本文法 1.1 入門例子 1.2 shell變數 1.2.1 永久變數 1.2.2 臨時變數 1.2.3單引號和雙引號 1.2.4 變數管理 1.2.5 位置變數和特殊變數 1.3 read命令 1.4 expr命令 1.5 變數測試語句 1.6 if判斷語句 1.7 case流程式控制制 1.8 雙小括弧的用法 1.9 迴圈語句嵌套 1.10 break和continue 1.11 shift命令 二、shell函數 2.1 函數定義 2.2 函數參數傳遞 2.3 Regex
一、基本文法 1.1 入門例子
建立一個example01.sh,寫入以下內容:
vim example01.sh
#!/bin/bash#This is to show what a example looks likeecho "This is our first example"echo #This inserts an empty line in outputecho "We are currently in the following directory"pwdechoecho "This directory contains the following files"ls -lh
第一行:#!/bin/bash表示使用bash這個shell,注釋用#號開頭。
加許可權:
chmod +x example01.sh
執行方式一:
./example01.sh
執行方式二:
/opt/bee/shtest/example01.sh
執行方式三:
sh example01.sh
1.2 shell變數
1.2.1 永久變數
永久變數:永久變數是環境變數,其值不隨shell指令碼的執行結束而消失。
例如PATH是環境變數,比如PATH、JAVA_HOME。
echo $JAVA_HOMEecho $PATH
1.2.2 臨時變數
臨時變數:shell程式內定義,其範圍僅限於定義它的程式,對其它程式不可見。
臨時變數的注意事項:
1.由字母或底線打頭。
2.字母、數字、底線組成。
3.區分大小寫。
4.變數名的長度沒有限制。
5.需要使用臨時變數時,要在變數名前加上首碼”$”。
6.變數賦值時等號兩邊不能有空格。
1.2.3單引號和雙引號
單引號和雙引號的區別:
1.單引號中的內容會原封不動地指定給變數
2.雙引號取消了空格的作用,保留特殊符號的含義。
舉例
DAY=monA='Today is $DAY'B="Today is $DAY"echo $A echo $B
輸出結果:
Today is $DAYToday is mon
1.2.4 變數管理
查看所有變數:
SET
查看某一個變數
DAY="Mon"set | grep DAY
刪除變數:
unset DAY
1.2.5 位置變數和特殊變數
ls -lh
ls是命令名,-lh是位置參數。
./example01.sh file1 file2 file3
0是這個程式的檔案名稱 0 是 這 個 程 序 的 文 件 名 0 是這個程式的檔案名稱 n 是這個程式的第n個參數值
特殊變數是一開始執行Script指令碼時就會的設定,不能被修改。
∗這個程式的所有參數 ∗ 這 個 程 序 的 所 有 參 數 * 這個程式的所有參數 # 這個程式的參數個數
$$ 這個進程的PID
$! 執行上一個背景程式的PID
$? 執行上一個指令的傳回值
#!/bin/bashecho "$* 表示這個程式的所有參數"echo "$# 表示這個程式的參數個數"touch /tmp/a.txtecho "$$ 表示程式的進程ID"touch /tmp/b.txt &echo "$! 執行上一個後台指令的PID"echo "$$ 表示程式的進程ID"
輸出:
[root@iz2zeisjfk2rw89yhp3g19z shtest]# sh example02.sh a b ca b c 表示這個程式的所有參數3 表示這個程式的參數個數2755 表示程式的進程ID2757 執行上一個後台指令的PID2755 表示程式的進程ID
1.3 read命令
作用:read命令可以讀參數
文法: read a b c
#!/bin/bashecho "input three parameters:"read first second thirdecho "the first parameter is $first"echo "the second parameter is $second"echo "the third parameter is $third"
1.4 expr命令
作用:shell變數的算術運算
expr命令:對整數型變數進行算術運算
文法: expr 運算式,例如
expr 3 + 5 #算術運算子中要有空格var1=10var2=6expr $var1 - 3expr $var1 + $var2expr $var1 / 2expr $var1 \* $var2expr `expr 5 + 15` \* `expr 2 + 3`expr `expr 5 + 15` / `expr 2 + 3`
example04.sh
#!/bin/shA=10B=20C=30value1=`expr $A + $B + $C`echo "value1 : $value1"value2=`expr $C / $B `echo "value2 : $value2"value3=`expr $A \* $B `echo "value3 : $value3"
1.5 變數測試語句
測試整數:
test int1 -eq int2test int1 -ge int2test int1 -gt int2test int1 -le int2test int1 -lt int2test int1 -ne int2
檔案測試:
test -d file #測試是否為目錄test -f file #測試是否為檔案test -r file #測試檔案是否可讀test -w file #測試檔案是否可寫test -x file #測試檔案是否可執行test -e file #測試檔案是否存在test -s file #測試大小是否為空白
1.6 if判斷語句
流程式控制制語句
if test[]then 語句fi#;表示兩個命令寫在一行,互不影響
例子:
#!/bin/bashecho "input a file name: "read file_nameif [ -d $file_name ]then echo "$file_name is a dir"elif [ -f $file_name ] ;then echo "$file_name is a file"elif [ -c $file_name -o -b $file_name ]; then echo "$file_name is d device file"else echo "$file_name is an unknow file"fi
1.7 case流程式控制制
#!/bin/bashecho "*************************"echo "Please select your operation:"echo "1 Copy"echo "2 Delete"echo "3 Backup"echo "Q Quit"read opcase $op in 1) echo "your selection is Copy" ;; 2) echo "your selection is Delete" ;; 3) echo "your selection is Backup" ;; Q) echo "Quit" ;; *) echo "invalid selection"esac
1.8 雙小括弧的用法
#!/bin/shvar1=1while((var1<100))do echo "$var1" ((var1=var1*2))done
1.9 迴圈語句嵌套
#!/bin/shecho "please input line number and shape: "read N Si=0N=$Nfor((i=1; i<=N; i++)) do j=1 for((j=1; j<=$i; j++)) do echo -n "$S" #-n 起到換行的作用 done echodone
列印倒三角
please input line number and shape: 5 &&&&&&&&&&&&&&&&
1.10 break和continue
#!/bin/bash# break continue# break 跳出整個迴圈# continue 跳出本次迴圈,進行下次迴圈############################################### 列印一個菜單功能,實現輸錯後,可以重新輸入# 只有輸入Q,才可以退出菜單##############################################while truedoecho "***************************************"echo "Please select your operation: "echo "1 Copy"echo "2 Delete"echo "3 Backup"echo "4 Quit"echo "***************************************"read opcase $op in C) echo "your selecttion is Copy" ;; D) echo "your selecttion is Delete" ;; B) echo "your selecttion is Backup" ;; Q) echo "your selecttion is Quit" break ;; *) echo "invalide selection,please try again" continue ;;esacdone
1.11 shift命令
#!/bin/bashecho "####################################"echo "# #"echo "#做一個加法計算機,求出所有參數的和#"echo "# #"echo "####################################"echo "please input your nums:"if [ $# -le 0 ] then echo "err!:Not enough parameters" exit 124fisum=0while [ $# -gt 0 ]do sum=`expr $sum + $1` shiftdoneecho "sum:$sum"
二、shell函數
2.1 函數定義
文法:
函數名(){ shell 命令序列}
或者
function 函數名(){ shell 命令序列}
注: 函數調用時不需要帶()
函數中的變數均為全域變數,沒有局部變數。
調用函數時可以傳遞參數,在函數中用 1</