Shell—學習之心得
??? 由于項目要招聘需要有經驗 shell 開發人員 (awk 編程 ) ,而作為技術面試官 ( 暫時 ) 的我對 shell 編程不太熟;當然以前也寫過一些 shell 腳本來滿足項目的需求 — 備份環境,數據庫 ( 邏輯 ) 。假如只是針對 awk 編程的,那我絕對可以問倒他,呵呵 … 。所以我最近學習了 shell 編程。入門還不是很深,但是還是有點心得的。以下是本人的一些心得;大伙們覺得好,就拍個磚,不好也拿起你們的手鼓個掌 … 當然文中有什么錯誤 , 遺漏的也請指正我,大伙們對 shell 的總結也可以在下面回復。
??? ?1.???shell之read命令
????????1.1? 對 read 的參數 p,t,s,n 。在此我就不作什么描述了。但對參數 a 還是做下。 Read 也可以申明數組,例如 read01.sh
#!bin/
bash
#author li0924
read
-p
"
please entry your name:
"
-
a name
#執行在此輸入多個字符串,以空格為分隔符
echo ${#name[@]};
#打印數組元素的個數
echo ${name[
0
]};
#打印第一個數組元素,注意數組是以下標為0開始
??????? ?? 1.2? 讀文件;這個可能我們對read用到最多。每次調用read命令都會讀取文件中的"一行"文本。當文件沒有可讀的行時,read命令將以非零狀態退出。讀取文件的關鍵是如何將文本中的數據傳送給read命令。最常用的方法是對文件使用cat命令并通過管道將結果直接傳送給包含read命令的while命令。例如read02.sh
date文件:
?
View Code
?
#!/bin/
bash
count
=
1
while
read line
#cat 命令的輸出作為read命令的輸入,read讀到的值放在line中
do
echo
"
$count:$line
"
count
=$(($count +
1
))
done
< date
#當然你可以在while前面加 “cat date |“來替換”<
date”
exit
0
???????? 1.3? ?? 大家有沒有覺得這個效果跟awk ’{print FNR”:”$0}’ date一樣。暫不作描述;本文重點不是awk。在上腳本;read后面只有變量line;其實可以跟很多變量。這個有點類似于awk中的$1-$9。例如read03.sh
#!/bin/
bash
cat date
|
while
read one two three #cat 命令的輸出作為read命令的輸入,read讀到的值放在line中
do
echo
"
${one}:${two}:${three}
"
done
exit
0
???? ?拓展:Read命令用法我們知道了;最后留一個問題給大伙;該腳本中把three刪除;打印$two是什么?添加four;打印$four有是什么? ?????
???
? ?? 2.??? 數組
????????? 2.1? 數組的常規用法;數組的下標是從 0 開始的;這個在前面有提到!
?
A=
(a b c def)
# 定義$A數組
${A[@]} 或 ${A[
*
]}
可得到 a b c def (全部元素)
${A[
0
]}
可得到 a (第一個數組元素),${A[1
]} 則為第二個數組元素
${#A[
0
]}
可得到 1
(第一個數組元素(a)的長度),
${#A[
3
]}
可得到 3
(第四個數組(def)的長度)
A[
3
]=xyz
將第4個數組重新定義為 xyz
?????? ? 2.2? 數組的長度
${#A[*]}或者${#A[@]}
????? ? 2.3 刪除數組 unset? 數組 [ 下標 ]? 可以清除相應的元素,不帶下標,清除整個數據
unset A[
0
] #刪除第一個元素
unset A #刪除數組A
??????? 2.4 ? 特殊使用 通過 ?${ 數組名 [@ 或 *]: 起始位置 : 長度 }? 切片原先數組,返回是字符串,中間用 “ 空格 ” 分開,因此如果加上 ”()” ,將得到切片數組, 例如下面測試
[li0924@localhost shell]$ A=
(a b c def)
#定義一個數組A
[li0924@localhost shell]$ echo ${A[@]:
0
:
3
}
#取前三個元素
a b c
[li0924@localhost shell]$ B
=(${A[@]:
0
:
3
})
#這個類似于B=
(a b c);其中括號里面是上述生產的
[li0924@localhost shell]$ echo ${B[@]}
a b c
[li0924@localhost shell]$ echo ${A[@]}
a b c def
???????? 講到 ${ 數組名 [@ 或 *]: 起始位置 : 長度 } 是返回字符串;接下來我們學習字符串的處理
????
??? 3. 字符串處理
???? ?? 其實shell語言不像其他編程語言對字符串處理的內置函數。這個也是我覺得shell很難學懂原因。慢慢發現shell主要功能不是針對文本處理,處理數據的。所以這部分自己理解就行了。我們定義一個變量file=/dir1/dir2/dir3/my.file.txt
???????? 3.1? 求字符串長度
[li0924@localhost shell]$ echo ${#file}
27
[li0924@localhost shell]$ echo $file
| awk
'
{print length($0)}
'
#當然你也可以借用awk中的length函數
27
????????? 3.2 替換字符串
[li0924@localhost shell]$ echo ${file/dir/
path}
/path1/dir2/dir3/
my.file.txt
[li0924@localhost shell]$ echo ${file//dir/path}
/path1/path2/path3/my.file.txt
??????????? 拓展: 當然你也可以用sed或者awk中的sub,gsub來實現。
[li0924@localhost shell]$ echo $file | sed
'
s/dir/path/
'
/path1/dir2/dir3/
my.file.txt
[li0924@localhost shell]$ echo $file
| sed
'
s/dir/path/g
'
/path1/path2/path3/my.file.txt
???????? 3.3?? 截取字符串 -- ${ 變量名 : 起始位置 : 長度 }
[li0924@localhost shell]$ echo ${file:
0
:
5
}
/
dir1
[li0924@localhost shell]$ echo ${file:
1
:
5
}
#下標是從0開始的;從0和1開始是有區別的;這個跟sql是不同。
dir1
/
[li0924@localhost shell]$ echo ${file:
-
4
}
#只提取最后4位.注意:跟-
4之間是有空格的;這個做個記號A
.txt
?????
???
拓展:這里同樣也可以用
awk
的
substr
函數實現。暫不演示。
??? 4.?
對未設定
,
空值的變量操作
?????? Shell 對這些操作有很多,大伙可以自己去查看資料。我們暫時只講 ${ 變量名 :- 默認值 } 。假如變量是為定義或者是空值就取默認值。有點類似于 sql 中的 nvl 函數。
[li0924@localhost shell]$ name=
lottu
#定義一個變量
[li0924@localhost shell]$ echo $name
lottu
[li0924@localhost shell]$ echo ${name:
-
li0924}
#name的值是lottu。所以結果是lottu
lottu
[li0924@localhost shell]$ unset name
[li0924@localhost shell]$ echo ${name:
-
li0924}
#name是未定義,所以取默認值li0924
li0924
??? 拓展:對上述的記號A。去掉空格看下;無論file是否有值;效果都不是。
[li0924@localhost shell]$ echo $file
/dir1/dir2/dir3/
my.file.txt
[li0924@localhost shell]$ echo ${file:
-
4
}
/dir1/dir2/dir3/
my.file.txt
[li0924@localhost shell]$ unset file
[li0924@localhost shell]$ echo ${file:
-
4
}
4
?????? 5. shell中的三目表達式
?????????? ?5.1 我們的shell對三目表達式別具風格。語法是expr && cmd1 ||cmd2
[li0924@localhost shell] [
7
-gt
6
] && echo
"
0
"
||echo
"
1
"
?????????? 5.2對數字運算也可以使用expr?cmd1:cmd2
[li0924@localhost shell]$ (( a =
7
>
6
?
0
:
1
))
[li0924@localhost shell]$ echo $a
0
?????
?? ????????6. 對冒號:和內置命令true
???????????? 在某些條件判斷,我們不需要做什么操作;但未了代碼的完整性,我們可以在其中添加:或者 true 。這個類似其它語言的 null 。暫作簡單測試。這里的:等價于 true 。
[li0924@localhost shell]$ [
7
-lt
6
] && : ||echo
"
1
"
1
[li0924@localhost shell]$ [
7
-gt
6
] && : ||echo
"
1
"
[li0924@localhost shell]$ echo $
?
0
[li0924@localhost shell]$ [
7
-gt
6
] &&
true
||echo
"
1
"
[li0924@localhost shell]$ echo $
?
0
?
?最后奉送shell入門視頻 http://www.cppcourse.com/shell-programming
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

