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
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:自己的查找及老師教授。