shell 基本知识
生活随笔
收集整理的這篇文章主要介紹了
shell 基本知识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
shell--腳本基礎知識
****shell 腳本基礎知識****一、基本腳本編譯
知識內容:
# 構建腳本
# 將命令串聯起來
# 存儲變量
# 數學計算
# 重定向輸出
# 檢查代碼
shell不像高級語言需要編譯后執行,而是直接處理每一條命令,可以將多條命令連接起來形成單一的步驟。
如下使用兩個bash shell命令,則為一個最簡單的shell腳本啦:
[root@wzp ~]# who ; date
root? ???:0? ?? ?? ???2010-12-13 09:29
root? ???pts/0? ?? ???2011-01-27 15:12 (:0.0)
2011年 01月 27日 星期四 15:26:42 CST
但如上存在缺點,必須在提示符輸入整條命令,所以可以將命令合并到一個文件中,當需要運行命令的時候運行文本文件就
行了。
2、創建腳本文件
[root@wzp ~]# cat test1
#!/bin/bash
date
who
通過創建編輯test1文件,具體內容如上
#!/bin/bash指明了該文件所使用的shell
[root@wzp ~]# ls -l test1
-rw-r--r-- 1 root root 21 01-27 15:30 test1
[root@wzp ~]# ./test1
bash: ./test1: 權限不夠
如果直接運行該文件是無法執行的,因為shell腳本文件所在目錄沒添加到PATH環境變量中,我們可以通過echo $PATH查看。
這里我們可以使用單點操作符。
[root@wzp ~]# chmod u+x test1
[root@wzp ~]# ./test1
2011年 01月 27日 星期四 15:32:23 CST
root? ???:0? ?? ?? ???2010-12-13 09:29
root? ???pts/0? ?? ???2011-01-27 15:12 (:0.0)
3、顯示消息
[root@wzp ~]# echo welcome to 24 blog
welcome to 24 blog
如上正常顯示
[root@wzp ~]# echo welcome to 24' blog
>
如上字符出現單引號,則無法顯示
[root@wzp ~]# echo "welcome to 24' blog"
welcome to 24' blog
通過外圍添加雙引號使得正常顯示
[root@wzp ~]# echo 'welcome to "51cto" website'
welcome to "51cto" website
所以說在shell腳本中需要用到echo顯示消息時注意單引號和雙引號問題。
[root@wzp ~]# cat test1
#!/bin/bash
echo -n "today is : "
date
echo "who logined this os :"
who
上面使用-n 參數可以使得echo命令結果和文本字符串在同一行
[root@wzp ~]# ./test1
today is : 2011年 01月 27日 星期四 15:49:08 CST
who logined this os :
root? ???:0? ?? ?? ???2010-12-13 09:29
root? ???pts/0? ?? ???2011-01-27 15:12 (:0.0)
4、使用變量
4.1 環境變量
可以通過set命令顯示活動環境變量的完整列表,如下通過echo單獨顯示一些$開頭的變量:
[root@wzp ~]# echo $LANG
zh_CN.UTF-8
[root@wzp ~]# echo $USER
root
[root@wzp ~]# echo $UID
0
[root@wzp ~]# echo $HOME
/root
如上可以看到我用的是root賬號,還有字符編碼類型,家目錄
[root@wzp ~]# cat test1
#!/bin/bash
echo user info for userid: $USER
echo UID: $UID
echo HOME DIR : $HOME
echo LANG : $LANG
[root@wzp ~]# ./test1
user info for userid: root
UID: 0
HOME DIR : /root
LANG : zh_CN.UTF-8
如上可以總結出:使用美元符號開頭的環境變量可以從腳本中引進這些環境變量
但是,當我們只想要使用$符號的時候呢?怎么顯示:
[root@wzp ~]# echo $HOME
/root
[root@wzp ~]# echo /$HOME
//root
[root@wzp ~]# echo \$HOME
$HOME
上面的例子可以看出使用\反斜杠,那么shell腳本則將美元符號翻譯成$,而不再是一個變量了,這點容易懂!
4.2用戶變量
shell允許在腳本中設置和使用自己的變量,用戶變量區分大小寫,通過等號賦值給用戶變量(=兩邊不準有空格)跟系統變
量一樣,用戶變量也可以使用$引用:
[root@wzp ~]# cat test1
#!/bin/bash
xxx1=ftp
echo $xxx1 is 文件傳輸協議
xxx2=http
echo $xxx2 is 超文本標記傳輸協議
[root@wzp ~]# ./test1
ftp is 文件傳輸協議
http is 超文本標記傳輸協議
4.3反引號
`這個符號就是反引號,在shell腳本之外很少使用它(通常處于鍵盤的1號鍵左邊)反引號允許將shell命令的輸出賦值給變
量,在腳本編程中,它是主要的構建。如下例:
[root@wzp ~]# cat test1
#!/bin/bash
testing=`date`
echo the date and the time are : $testing
[root@wzp ~]# ./test1
the date and the time are : 2011年 01月 27日 星期四 20:13:17 CST
如果上例沒有使用反引號,那么現實的內容就是date這個字符而已了!
再來一個現實比較常用的例子:
[root@wzp ~]# cat test1
#!/bin/bash
testing=`date +%y%m%d`
ls /usr/bin -al > log.$testing
如上date +%y%m%d表示顯示date命令的年月日,然后把$testing變量的值作為文件名,并且把/usr/bin下的文件目錄都重定
向到生產的文件中。(重定向下面會講述)
[root@wzp ~]# ./test1
[root@wzp ~]# ll log.110127
-rw-r--r-- 1 root root 97764 01-27 20:18 log.110127
這樣就很方便了,每天的日志文件自動區分出來,實現自動化!
5、重定向輸入輸出
有時候想通過命令保存輸出,而不是顯示在屏幕上,重定向就可以解決這個問題。
5.1、輸出重定向
意思是說通過一條命令把顯示的內容發送到文件中,通過>大于號實現,例子:
[root@wzp ~]# date > test1
[root@wzp ~]# cat test1
2011年 01月 27日 星期四 20:26:08 CST
[root@wzp ~]# who > test1
[root@wzp ~]# cat test1
root? ???:0? ?? ?? ???2011-01-27 20:07
root? ???pts/0? ?? ???2011-01-27 20:10 (:0.0)
這個好理解,不多說。
5.2、輸入重定向
輸入重定向是輸出重定向的相反過程,把一個文件的內容重定向到一個命令中,如:
[root@wzp ~]# cat test1
2011年 01月 27日 星期四 20:29:15 CST
[root@wzp ~]# wc < test1
1??6 43
通過將文本文件重定向到wc命令中,可以算出這個文件的行數、單詞數、字節數。
如上表示test1文件有1行、6個單詞和43個字節,這個很好懂吧!
5.3、追加??
重定向的作用是完全覆蓋,追加的概念就是在原本文件內容基礎上添加,如:
[root@wzp ~]# cat test1
2011年 01月 27日 星期四 20:29:15 CST
[root@wzp ~]# cal >> test1
[root@wzp ~]# cat test1
2011年 01月 27日 星期四 20:29:15 CST
? ???一月 2011? ?? ?
日 一 二 三 四 五 六
? ?? ?? ?? ?? ?? ? 1
2??3??4??5??6??7??8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
通過>>符號實現追加,可以看到date顯示的內容還是沒丟失。
6、管道
通過|這個符號實現管道過濾作用,這個很容易理解,比如在查看一些服務或者開放的端口,就可以通過管道過濾出我們想到
查看的東西,而不是全部顯示出來!
[root@wzp ~]# rpm -qa |grep http
httpd-2.2.3-22.el5
httpd-manual-2.2.3-22.el5
httpd-devel-2.2.3-22.el5
[root@wzp ~]# netstat -antup |grep http
tcp? ?? ???0? ?? ?0 :::80? ?? ?? ?? ?? ?? ?? ???:::*? ?? ?? ?? ?? ?? ?? ?? ?L:ISTEN? ?? ?4124/httpd? ?? ?? ?
tcp? ?? ???0? ?? ?0 :::443? ?? ?? ?? ?? ?? ?? ? :::*? ?? ?? ?? ?? ?? ?? ?? ?LISTEN? ?? ?4124/httpd? ?
這個就不多說了!
7、數學計算
處理數學的能力是編程語言至關重要的,可惜shell這方面不是很好。簡單說說~
7.1、expr命令
expr命令可以處理命令行中的等式,在RHEL5.3下:
[root@wzp ~]# expr 2*5
2*5
[root@wzp ~]# expr 2 * 5
expr: 語法錯誤
[root@wzp ~]# expr 2 \* 5
10
這樣子在shell命令中使用expr命令就顯得麻煩了。
如下通過使用括號改進這個措施.
7.2使用括號
看下面這個例子,完全就是可以通過[]或者()替代了expr
[root@wzp ~]# wzp1=$[1+5]
[root@wzp ~]# echo $wzp1
6
先賦值,然后顯示變量值。繼續看看一個例子:
[root@wzp ~]# cat test1
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo the final result is $var4
[root@wzp ~]# ./test1
the final result is 500
通過[()]非常靈活的解決數學計算問題。當然,bash shell只是解決了整數運算。
對于浮點算術運算,出現小數點的情況又是如何呢?
7.3浮點解決方案
首先看看一個例子:
[root@wzp ~]# cat test1
#!/bin/bash
var1=100
var2=45
var3=$[$var1 / $var2]
echo the final result is $var3
[root@wzp ~]# ./test1
the final result is 2
我們可以看到,計算結果余數被忽略了,只是留下商。
shell腳本可以通過使用Z shell(zsh)解決浮點算術運算,當然bash shell可以通過使用內置的bash計算器(稱為bc)解決
浮點運算問題。
這里長話短說,直接在腳本用使用bc,具體要用到的時候在找解決方法。
先看下面一個例子:
[root@wzp ~]# cat test1
#!/bin/bash
var1=100
var2=45
var3='echo "scale=4; $var1 / $var2" | bc'
echo the answer is $var3
[root@wzp ~]# sh test1
the answer is echo "scale=4; $var1 / $var2" | bc
不知道為何,參加資料可以實現,我這里一直搞不定!先放著!!
自己猜測應該是linux發行版問題~~~
8、退出腳本
每條運行在shell中的命令都使用一個退出狀態,不過這點比較少弄,這個退出狀態時一個介于0到255之間的數據,這個稍微
了解下就行了!
8.1、核對退出狀態
linux提供了 $? 這個特殊變量來保存最后一條命令執行結束的退出狀態
先看個例子:
[root@wzp ~]# date
2011年 01月 27日 星期四 22:39:58 CST
[root@wzp ~]# echo $?
0
[root@wzp ~]# wzp
bash: wzp: command not found
[root@wzp ~]# echo $?
127
從上面看到date這個有效命令的退出狀態值是0,而wzp這個無效命令的值是127
具體還有其他退出狀態值的數,可以自行參考下linux退出狀態代碼
8.2退出命令
在shell文本腳本中,可以自行設置退出狀態值
[root@wzp ~]# cat test1
#!/bin/bash
date
exit 5
[root@wzp ~]# ./test1
2011年 01月 27日 星期四 23:13:42 CST
[root@wzp ~]# echo $?
5
這個效果具體作用后續用到再說說了,這里點到為止了!
轉載于:https://blog.51cto.com/2942350/557908
總結
以上是生活随笔為你收集整理的shell 基本知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到朋友房子倒塌什么预兆
- 下一篇: 梦到自己鞋子破了是什么意思