10.1 使用多個命令
如果兩個命令一起使用,可在同一提示符行輸入它們,用分號隔開
10.2 創建shell腳本文件
- shell腳本第一行格式:#!/bin/bash
- 通常shell腳本里,用#來注釋行
- shell腳本的第一行是一個例外,#后!號告訴shell用哪個shell來運行腳本
- 在指定了shell之后,可在文件的每行輸入命令,后加一個回車
- 如有需要,可用分號來在一行輸入你要用的兩個命令
- 在shell腳本中,你可以在不同行來列出命令,shell會根據命令在文件中出現的順序來處理命令
?
1 2 3 4 | #!/bin/bash #This script displays the dae and who's logged on date who |
?
- 要讓shell找到自己編寫的腳本并順利運行,則需要采取以下措施
- 將shell腳本文件所處的目錄添加到PATH環境變量中
- 在提示符中用絕對路徑或相對文件路徑來引用shell腳本
- 修改自己編寫的shell腳本權限為可執行:chmod u+x mytestshell
10.3 顯示消息
- echo 命令
- 作用:顯示一個簡單的文本字符串
- 默認情況:不需要使用引號將要顯示的文本圈起來
- 對于要顯示單雙引號問題:在字符串中使用到了他們,在文本中使用其中一種引號,而用另外一種將字符串圈起來
- 參數 -n:在同一行顯示一個文本字符串作為命令輸出(即echo的內容+命令輸出在同一行)
文章腳本怎么寫,?
1 2 3 4 5 6 7 8 9 10 11 | $cat test1 #!/bin/bash echo -n "The time and date are: " date echo "Let's see who's logged into the system: " who $./test1 The time and date are: Mon Feb 21 15:42:23 EST 2011 Let's see who's logged into the system: Christing tty2 2011-02-21 15:26 ... |
?
10.4 使用變量
10.4.1 環境變量
- set命令:顯示完整的活動的環境變量列表
?
1 2 3 4 5 | $set BASH=/bin/bash ... HOME=/home/Samantha ... |
?
- 在環境變量名稱之前加個美元符($)來在腳本中使用這些環境變量
- 在雙引號中使用環境變量shell依然能夠識別,只要腳本在引號中看到美元符,就會認為在引用一個變量
- 如果后面跟的不是變量,則需要在前面加上反斜線“\”(如需使用$)
轉閱全自動腳本,?
1 2 3 4 5 6 7 8 9 10 | $cat test2 #!/bin/bash echo "User info for userid: $USER" echo UID: $UID $./test2 User info for userid: Samantha UID: 1001 $echo "The cost of the item is \$15" The const of the item is $15 |
?
10.4.2 用戶變量
- 除了環境變量,shell腳本還允許在腳本中定義和使用自己的變量
- 定義變量允許臨時存儲數據并在整個腳本中使用,從而使shell腳本看起來跟向計算機程序
- 用戶變量
- 格式:不超過20個字母、數字或下劃線的文本字符串,區分大小寫
- 賦值形式:值通過等號賦給用戶變量,在變量、等號和值之間不能出現空格
- shell腳本會自動決定變量值的數據類型,變量的生命周期一直到shell腳本結束
?
1 2 3 4 5 6 7 8 9 | $cat test #!/bin/bash value1=10 value2=$value echo The resulting value is $value2 $./test The resulting value is 10 |
?
10.4.3 反引號(重要)
- 作用:將shell命令的輸出賦給變量
- 使用:必須使用反引號把整個命令行命令圈起來
腳本寫作、?
1 | testing=`date` |
?
- 例子:在腳本中通過反引號獲得當前日期并用它來生成為唯一文件名
- today被賦予格式化后的date命令的輸出,這是用來為日志文件名抓取日期信息常用的一種技術
- %y%m%d:date命令將日期顯示為兩位數的年、月、日的組合,如110131
?
1 2 3 | #!/bin/bash today=`date +%y%m%d` ls /usr/bin -al > log.$today |
?
10.5 重定向輸入和輸出(重要)
10.5.1 輸出重定向
- 重定向最基本的類型是將命令的輸出發到一個文件中,用“>“命令來完成:command > outputfile
- > 與 >>區別:前者直接覆蓋已有的文件內容,后者則是追加到文件末尾
10.5.2 輸入重定向
- 輸入重定向將文件的內容重定向到命令,用”<”來完成:command < inputfile
- wc命令重定向例子:
- wc命令提供了對數據文本的計數,默認情況會輸出3個值
- 文本的行數
- 文本的詞數
- 文本的字節數
- wc命令提供了對數據文本的計數,默認情況會輸出3個值
自動轉發文章賺錢腳本。?
1 2 3 | $wc < test6 ???? 2?????? 11????????60 $ |
?
- 內聯重定向
- 作用:允許在命令行而不是在文件指定輸入重定向的數據
- 符號:<<
- 格式:內聯重定向符號<<加上指定一個文本標志來劃分要輸入數據的開始和結尾
- 在命令行使用內斂輸入重定向時,shell會使用PS2環境變量中定義的次提示符來提示輸入數據
?
1 2 3 4 5 6 7 8 9 10 11 12 | //格式: command << marker date marker //eg: $wc << EOF > test string 1 > test string 2 > test string 3 > EOF ????????3????????9?????? 42 $ |
?
10.6 管道(重要)
- 管道最流行的用法是將命令產生的長輸出結果通過管道傳送給more命令
- ls -l命令產生一個目錄中所有文件的長列表,對于大量文件的目錄來說,這個列表會很長,通過管道連接到more命令,可以強制輸出在每屏數據的末尾停下來
10.7 執行數學運算
10.7.1 expr命令
- expr命令允許在命令行上處理數學表達式
轉閱腳本破解。?
1 2 | $expr 1 + 5 6 |
?
- 許多expr命令操作符在shell中有其他意思(比如星號*)
- 解決方法:用轉義字符來識別容易被shell錯誤解釋的任意字符
- 在shell腳本中,要將數學運算結果賦給一個變量,需要使用反引號
?
1 2 3 4 5 6 7 | $expr 5 * 2 expr: syntax error $ //解決 $expr 5 \* 2 expr: syntax error $ |
?
10.7.2 使用方括號
- 在bash中,再講一個數學運算結果賦給某個變量時,可以使用“”和“[]”組合([ operation ])將數學表達式圈起來,并且shell不會誤解稱號*和其他符號
手機腳本轉電腦腳本??
1 2 3 4 5 6 7 8 9 | $cat test #!/bin/bash var1=100 var2=50 var3=45 var4=$[ $var1 * ($var2 - $var3)] echo The final result is $var4 $./test The final result is 500 |
?
- bash shell 只支持整數運算
?
1 2 3 4 5 6 7 8 | $cat test #!/bin/bash var1=100 var2=45 var3=$[ $var1 / var2 ] echo The final result is $var3 $./test The final result is 2 |
?
10.7.3 浮點解決方案
- bc的基本用法
- 允許在命令行輸入表達式、解釋表達式、計算并返回結果的一種編程語言
- bash計算器能夠識別
- 數字(整數和浮點數)
- 變量(簡單變量和數組)
- 注釋(以井號開始的行或C語言中的/**/對)
- 表達式
- 編程語言(例如if-then語句)
- 函數
- 在shell提示如下通過bc命令訪問bash計算器
- 輸入quit退出bash計算器
?
1 2 3 4 5 6 7 | $bc ... 12 * 5.4 64.8 3.156 * (3 + 5) 25.248 quit |
?
- 浮點運算是由一個內建的稱為scale的變量控制的,并須將這個值設置為結果里你想要的小數后的位數
- 參數-q:會將bash計算器輸出的很長的歡迎條屏蔽掉
?
1 2 3 4 5 6 7 8 | $ bc -q 3.44 / 5 0 scale=4 3.44 / 5 .6880 quit $ |
?
- 在腳本中使用bc
- 基本格式:variable=
echo "options: expression" | bc
- options:允許你來設置變量,如果設置的變量不止一個,可以用分號來分開它們
- expression:定義了通過bc執行的數學表達式
- 基本格式:variable=
?
1 2 3 4 5 6 7 8 9 10 11 12 | $cat test #!/bin/bash var1=100 var2=45 var3=`echo " scale=4; 3.44 / 5" | bc` var4=`echo " scale=4; $var1 / var2" | bc` echo The var3 is $var3 echo The var4 is $var4 $./test The var3 is .6880 The var4 is 2.2222 |
?
- bc與內聯輸入重定向
- 在bash計算器中創建的變量只在bash計算其中有效,不能在shell腳本中使用
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $cat test #!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=`bc << EOF scale = 4 a1 = ( $var1 * $var2 ) b1 = ( $var3 * $var4 ) a1 + b1 EOF ` echo The final answer for this mess is $var5 |
?
10.8 退出腳本(重要)
10.8.1 查看退出狀態碼
- ?專屬變量保存上個執行的命令的退出狀態碼,必須在你要查看的命令之后馬上查看或使用?變量
?
1 2 3 4 | $date Sat Jan 15 10:01:30 EDT 2011 $echo $? 0 |
?
- linux常用退出狀態碼
- 0:命令成功結束
- 1:在命令中發生了未知的錯誤
- 126:用戶沒有執行命令的權限
- 127:命令不可執行
10.8.2 exit命令
- 默認情況下,shell腳本會由腳本中最后一個命令的退出碼退出
- exit命令:在腳本結束時指定一個退出狀態碼
?
1 2 3 4 5 6 7 8 9 10 11 12 13 | $cat test #!/bin/bash var1=10 var2=30 var3=$[ $var1 + $var2 ] echo The anwser is $var3 exit 5 $chmod u+x test $./test The anwser is 40 $echo $? 5 $ |
?
- 退出碼最大值為255,區間為0~255,shell通過模運算得到這個結果
- 模運算:一個數的模運算就是被除后的余數,300的余數是44
?
1 2 3 4 5 6 7 8 9 10 11 12 | $cat test #!/bin/bash var1=10 var2=30 var3=$[ $var1 * $var2 ] echo The anwser is $var3 exit var3 $./test The anwser is 300 $echo $? 44 $ |
退出碼很有用,可以判斷您的命令是否正常執行。