shell編程之從環境到常用命令(未更完)


shell思維導圖

1.shell介紹

定義、在線工具

1.百科定義
2.通俗介紹
面向過程:Shell, C dev ops
面向對象: JAVA, Python, perl, C++
變量:內存空間,命名
內存:編址的存儲單元
shell: 外殼
GUI:Gnome, KDE, Xfce
CLI: sh, csh, ksh, bash, tcsh, zsh

3.登錄式shell如何讀取配置文件?
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrck
Source /etc/bashrc

非登錄式shell如何配置文件?
~/.bashrc --> /etc/basrc --> /etc/profile.d/*.sh

4.運行shell的在線工具

2.shell變量

shell變量

1.定義變量時,變量名不加美元符號($,PHP語言中變量需要),如:

name="hhh"

2.定義規則變量名和等號之間不能有空格。
同時,變量名的命名須遵循如下規則:
1)命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭;
2)中間不能有空格,可以使用下劃線(_);
3)不能使用標點符號;
4)不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。

3.**變量類型:*事先確定數據的存儲格式和長度
1)面向對象 字符 數值 整型 浮點型 詳見shell字符串
2) 運行shell時,會同時存在三種變量:

1
局部變量(本地變量) 局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啓動的程序不能訪問局部變量。
2 *環境變量 所有的程序,包括shell啓動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。
3 *shell變量(位置變量、特殊變量)shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行。

變量名稱:
1、只能包含字母、數字和下劃線,並且不能數字開頭;
2、不應該跟系統中已有的環境變量重名;
3、最好做到見名知義;
本地變量:
set VARNAME=VALUE: 作用域爲整個bash進程;
局部變量:
local VARNAME=VALUE:作用域爲當前代碼段;
環境變量:作用域爲當前shell進程及其子進程;
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME
“導出”

位置變量:
$1, $2, …
Shift
特殊變量:
$?: 上一個命令的執行狀態返回值;
程序執行,可能有兩類返回值:
程序執行結果
程序狀態返回代碼(0-255)
0: 正確執行
1-255:錯誤執行,1,2,127系統預留;
$#
$*
$@
$$
$0

撤消變量:
unset VARNAME

查看當shell中變量:
Set (可以省略)
查看當前shell中的環境變量:
printenv
env
export

4.使用變量
1)使用定義過的變量,在變量名前加$即可

name="hhh"
echo $name
echo ${name} #推薦加花括號以便於解釋器識別變量的邊界

2)只讀變量
使用 readonly 命令可以將變量定義爲只讀變量,只讀變量的值不能被改變。

#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.smartisan.com"

運行,嘗試更改只讀變量,結果報錯:

/bin/sh: NAME: This variable is read only.

3)刪除變量
使用 unset 命令可以刪除變量。變量被刪除後不能再次使用。unset 命令不能刪除只讀變量。語法:

unset variable_name

5.命令替換: $(COMMAND), 反引號:COMMAND
把命令中某個子命令替換爲其執行結果的過程

file-2013-02-28-14-53-31.txt

bash支持的引號:
``: 命令替換
“”: 強引用,可以實現變量替換
‘’: 弱引用,不完成變量替換
文件名通配, globbing
*: 任意長度的任意字符
?:任意單個字符
[ ]:匹配指定範圍內的任意單個字符

[abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
[:space:]:空白字符
[:punct:]:標點符號
[:lower:]:小寫字母
[:upper:]: 大寫字母
[:alpha:]: 大小寫字母
[:digit:]: 數字
[:alnum:]: 數字和大小寫字母	
[[:alpha:]]*[[:space:]]*[^[:alpha:]]

shell字符串

字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。

1.單引號

str='this is a string'

單引號字符串的限制:
單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的;單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作爲字符串拼接使用。

2.雙引號

your_name='hhh'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

輸出結果爲:

Hello, I know you are "hhh"! 

雙引號的優點:
雙引號裏可以有變量;雙引號裏可以出現轉義字符。

3.拼接字符串

your_name="hhh"

使用雙引號拼接

greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

使用單引號拼接

greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

輸出結果爲:

hello, hhh ! hello, hhh !
hello, hhh ! hello, ${your_name} !

4.獲取字符串長度

string="abcd"
echo ${#string} #輸出 4

提取子字符串
以下實例從字符串第 2 個字符開始截取 4 個字符:

string="hthzkjh is a great site"
echo ${string:1:4} # 輸出 thzk

查找子字符串
查找字符 i 或 o 的位置(哪個字母先出現就計算哪個):
注意: 以上腳本中 ` 是反引號,而不是單引號 '

5.字符串截取
#、## 表示從左邊開始刪除;
一個 # 表示從左邊刪除到第一個指定的字符;
兩個 # 表示從左邊刪除到最後一個指定的字符;
%、%% 表示從右邊開始刪除;
一個 % 表示從右邊刪除到第一個指定的字符;
兩個 % 表示從左邊刪除到最後一個指定的字符。
刪除包括了指定的字符本身。

實例:

#!/bin/bash
# 字符串截取(界定字符本身也會被刪除)
str="https://blog.csdn.net/qq_40993864"
echo "str    : ${str}"
echo "str#*/    : ${str#*/}"   # 從 字符串開頭 刪除到 左數第一個'/'
echo "str##*/    : ${str##*/}"  # 從 字符串開頭 刪除到 左數最後一個'/'
echo "str%/*    : ${str%/*}"   # 從 字符串末尾 刪除到 右數第一個'/'
echo "str%%/*    : ${str%%/*}"  # 從 字符串末尾 刪除到 右數最後一個'/'
echo
echo "str#/*    : ${str#/*}"   # 無效果
echo "str##/*    : ${str##/*}"  # 無效果
echo "str%*/    : ${str%*/}"   # 無效果
echo "str%%*/    : ${str%%*/}"  # 無效果

輸出結果:

str    : https://blog.csdn.net/qq_40993864
str#*/    : /blog.csdn.net/qq_40993864
str##*/    : qq_40993864
str%/*    : https://blog.csdn.net
str%%/*    : https:

str#/*    : https://blog.csdn.net/qq_40993864
str##/*    : https://blog.csdn.net/qq_40993864
str%*/    : https://blog.csdn.net/qq_40993864
str%%*/    : https://blog.csdn.net/qq_40993864

shell數組

1.環境:bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。類似於 C 語言,數組元素的下標由 0 開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大於或等於 0。
2.定義:在 Shell 中,用括號來表示數組,數組元素用"空格"符號分割開。
3.數組
1)讀取數組

${數組名[下標]}

如:valuen=${array_name[n]}

使用 @ 符號可以獲取數組中的所有元素,例如:

echo ${array_name[@]}

2)獲取數組長度
獲取數組長度的方法與獲取字符串長度的方法相同

# 取得數組元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}

變量:內存空間 字符型
數組:連續的內存空間
元素:存儲在數組中的每一個變量稱爲元素,利用索引來標示

${AA[0]}

聲明數組:declare -a AA

賦值方法(1):

AA[0]=jerry
AA[1]=tom
AA[2]=wendy
AA[6]=natasha

賦值方法(2):

AA=(jerry tom wendy)
AA=([0]=jerry [1]=tom [2]=wendy [6]=natasha)
AA[3]=nikita
Echo ${AA[0]}

隨機產生數組元素

#!/bin/bash
#
AA=([0]=jerry [1]=tom [2]=wendy [6]=natasha)
For I in{1..20};do
INDEX=$[$RANDOM%7]
Echo $[AA[$INDEX]]
Done

shell數組實例

找出一組數據中的最大數

#!/bin/bash
#
ARRAY=(34 73 25 91 40 22 67 98 99 53)
Declare -i MAX=${ARRAY[0]}
For I in `seq 1  $[${#ARRY[*]}-1]`;do
  If [ $MAX -lt ${ARRAY[$I]}];then
       MAX=${ARRAY[$I]}
  Fi
Done
Echo $MAX

隨機生成數組:

#!/bin/bash
For J in {0..9};do
  ARRAY[$J]=$RANDOM
  Echo -n “$ARRAY[$J]sleep
Done
Echo
For I in `seq 1  $[${#ARRY[*]}-1]`;do
  If [ $MAX -lt ${ARRAY[$I]}];then
       MAX=${ARRAY[$I]}
  Fi
Done
Echo The max is $MAX

寫一個腳本:
隨機從同學中選擇一位同學回答問題
生成一個數組:
1、數組的元素個數爲1-39
read
2、數組元素不能相同
3、顯示此數組各元素的值

  #!/bin/bash
read -p "The element numbers[1-39]:" ELENUM
function COMELE {
   for J in `seq 0 $[${#ARRAY[*]}-1]`;do
      if [ $1 -eq ${ARRAY[$J]} ];then
        return 1
      fi
    done
  return 0
}

for I in `seq 0 $[$ELENUM-1]`;do
 while true;do
   ELEMENT=$[$RANDOM%40]
   COMELE $ELEMENT
  if [ $? -eq 0 ];then
   break
  fi
 done
 ARRAY[$I]=$ELEMENT
  echo "${ARRAY[$I]}"
done

比較專業的生產檢查URL地址的腳本(shell數組方法):

[root@oldboy ~]# cat check_url.sh 
#!/bin/bash
this script is created by oldboy.
e_mail:31333741@qq.com
qqinfo:49000448
function:check web url
 version:1.1
. /etc/init.d/functions
url_list=(
http://etiantian.org
http://www.linuxpeixun.com
http://oldboy.blog.51cto.com
)
function wait()
{
echo -n '3秒後,執行該操作.';
for ((i=0;i<3;i++))
do
echo -n ".";sleep 1
done
echo
}
function check_url()
{
wait
echo 'check url...'
for ((i=0; i<${#url_list[*]}; i++))
do
 HTTP/1.1 200 OK
judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK' ]]
then
action "${url_list[$i]}" /bin/true
else
action "${url_list[$i]}" /bin/false
fi
done
}
check_url

shell註釋

以 # 開頭的行就是註釋,會被解釋器忽略。

通過每一行加一個 # 號設置多行註釋,像這樣:

#--------------------------------------------
##### 用戶配置區 開始 #####
#
#
# 這裏可以添加腳本描述信息
# 
#
##### 用戶配置區 結束  #####

如果在開發過程中,遇到大段的代碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?

每一行加個#符號太費力了,可以把這一段要註釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和註釋一樣的效果。

多行註釋
多行註釋還可以使用以下格式:

:<<EOF
註釋內容...
註釋內容...
註釋內容...
EOF

EOF 也可以使用其他符號:

:<<'
註釋內容...
註釋內容...
註釋內容...
'

:<<!
註釋內容...
註釋內容...
註釋內容...
!

3.shell傳遞參數

4.shell運算符

加減乘除

# !/bin/bash
a=88 b=22

val=`expr $a + $b` # 加法,注意運算符與變量之間要有空格
echo "加 $val"

val=`expr $a - $b`
echo "減 $val"

val=`expr $a \* $b` #乘法是\*,注意之前要加一個反斜槓\
echo "乘法 $val"

val=`expr $a / $b` #除法是/
echo 除法 $val"

val=`expr $b % $a` # 取餘是#
echo "取餘 $val"

val=`expr b = $a` #賦值 =
echo "賦值 $val"

if [ $a == $b ]  # if...then...fi是shell的循環語句
then
	echo "a等於b"
fi
if [ $a != $b ]
then
	echo "a不等於b
	"
fi

5.命令

echo命令

printf命令

test命令

6.shell流程控制

7.shell函數

8.shell輸入/輸出、重定向

9.shell文件包含

10.參考來源

參考來源1
參考來源2:自己的查找及老師教授。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章