Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
1. 使用多個命令
如果要兩個命令一起運行,可以把它們放在同一行中,彼此間用分號隔開。
$ date ; who
Mon Feb 21 15:36:09 EST 2014
Christine tty2 2014-02-21 15:26
Samantha tty3 2014-02-21 15:26
Timothy tty1 2014-02-21 15:26
user tty7 2014-02-19 14:03 (:0)
user pts/0 2014-02-21 15:21 (:0.0)
$
使用這種辦法就能將任意多個命令串連在一起使用了,只要不超過最大命令行字符數 255 就行。
2. 創建 shell 腳本文件
在創建 shell 腳本文件時,必須在文件的第一行指定要使用的 shell。其格式為:
#!/bin/bash
在通常的 shell 腳本中,井號(#)用作注釋行。shell 并不會處理 shell 腳本中的注釋行。然而,shell 腳本文件的第一行是個例外,# 后面的驚嘆號會告訴 shell 用哪個 shell 來運行腳本(是的,你可以使用 bash shell,同時還可以使用另一個 shell來運行你的腳本)。
shell 會通過 PATH 環境變量來查找命令。
$ echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin
:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user/bin
$
PATH 環境變量被設置成只在一組目錄中查找命令。要讓 shell 找到 test1 腳本,只需采取以下兩種作法之一:
- 將shell腳本文件所處的目錄添加到PATH環境變量中;
- 在提示符中用絕對或相對文件路徑來引用shell腳本文件;
3. 顯示消息
在 echo 命令后面加上了一個字符串,該命令就能顯示出這個文本字符串
$ echo This is a test
This is a test
$
默認情況下,不需要使用引號將要顯示的文本字符串劃定出來。
echo 命令可用單引號或雙引號來劃定文本字符串。如果在字符串中用到了它們,你需要在文本中使用其中一種引號,而用另外一種來將字符串劃定起來。
$ echo "This is a test to see if you're paying attention"
This is a test to see if you're paying attention
$ echo 'Rich says "scripting is easy".'
Rich says "scripting is easy".
$
如果想把文本字符串和命令輸出顯示在同一行中,可以用 echo 語句的 -n 參數
echo -n "The time and date are: $(date)"
4. 使用變量
4.1 環境變量
shell 維護著一組環境變量,用來記錄特定的系統信息。比如系統的名稱、登錄到系統上的用戶名、用戶的系統 ID(也稱為UID)、用戶的默認主目錄以及 shell 查找程序的搜索路徑??梢杂?set 命令來顯示一份完整的當前環境變量列表。
$ set
BASH=/bin/bash
[...]
HOME=/home/Samantha
HOSTNAME=localhost.localdomain
HOSTTYPE=i386
IFS=$' \t\n'
IMSETTINGS_INTEGRATE_DESKTOP=yes
IMSETTINGS_MODULE=none
LANG=en_US.utf8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=Samantha
[...]
在腳本中,你可以在環境變量名稱之前加上美元符($)來使用這些環境變量。
$ cat test2
#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME
$
# 執行結果如下
$ ./test2
User info for userid: Samantha
UID: 1001
HOME: /home/Samantha
$
注意,echo 命令中的環境變量會在腳本運行時替換成當前值。另外,在第一個字符串中可以將 $USER 系統變量放置到雙引號中,而 shell 依然能夠知道我們的意圖。
要顯示美元符,你必須在它前面放置一個反斜線。
$ echo "The cost of the item is \$15"
The cost of the item is $15
4.2 用戶變量
用戶變量可以是任何由字母、數字或下劃線組成的文本字符串,長度不超過 20 個。用戶變量區分大小寫,所以變量 Var1 和變量 var1 是不同的。
使用等號將值賦給用戶變量。在變量、等號和值之間不能出現空格。
shell 腳本會自動決定變量值的數據類型。在腳本的整個生命周期里,shell 腳本中定義的變量會一直保持著它們的值,但在shell 腳本結束時會被刪除掉。
$ cat test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"
$
運行腳本會有如下輸出:
$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$
變量每次被引用時,都會輸出當前賦給它的值。重要的是要記住,引用一個變量值時需要使用美元符,而引用變量來對其進行賦值時則不要使用美元符。
4.3 命令替換
命令替換允許你將 shell 命令的輸出賦給變量。有兩種方法反引號字符(`)、$() 格式。
- 要么用一對反引號把整個命令行命令圍起來:
- 要么使用$()格式:
testing='date'
testing=$(date)
shell 會運行命令替換符號中的命令,并將其輸出賦給變量 testing。注意,賦值等號和命令替換字符之間沒有空格。
警告 命令替換會創建一個子 shell 來運行對應的命令。子 shell(subshell)是由運行該腳本的 shell所創建出來的一個獨立的子shell(child shell)。正因如此,由該子 shell 所執行命令是無法使用腳本中所創建的變量的。在命令行提示符下使用路徑./運行命令的話,也會創建出子 shell;要是運行命令的時候不加入路徑,就不會創建子 shell。如果你使用的是內建的 shell 命令,并不會涉及子 shell。在命令行提示符下運行腳本時一定要留心!
5. 重定向輸入和輸出
5.1 輸出重定向
最基本的重定向將命令的輸出發送到一個文件中。bash shell 用大于號(>)來完成這項功能:
command > outputfile
之前顯示器上出現的命令輸出會被保存到指定的輸出文件中。
$ date > test6
$ ls -l test6
-rw-r--r-- 1 user user 29 Feb 10 17:56 test6
$ cat test6
Thu Feb 10 17:56:58 EDT 2014
$
重定向操作符創建了一個文件 test6(通過默認的 umask 設置),并將 date 命令的輸出重定向
到該文件中。如果輸出文件已經存在了,重定向操作符會用新的文件數據覆蓋已有文件。
$ who > test6
$ cat test6
user pts/0 Feb 10 17:55
$
要將命令的輸出追加到已有文件中,可以用雙大于號(>>)來追加數據。
5.2 輸入重定向
輸入重定向和輸出重定向正好相反。輸入重定向將文件的內容重定向到命令,而非將命令的輸出重定向到文件。
輸入重定向符號是小于號(<):
command < inputfile
一個簡單的記憶方法就是:在命令行上,命令總是在左側,而重定向符號“指向”數據流動的方向。小于號說明數據正在從輸入文件流向命令。
$ wc < test6
2 11 60
$
wc 命令可以對對數據中的文本進行計數,默認情況下,它會輸出 3 個值文本的行數、文本的詞數、文本的字節數。
內聯輸入重定向符號是遠小于號(<<)。除了這個符號,你必須指定一個文本標記來劃分輸入數據的開始和結尾。任何字符串都可作為文本標記,但在數據的開始和結尾文本標記必須一致。
command << marker
data
marker
6. 管道
管道被放在命令之間,將一個命令的輸出重定向到另一個命令中:
command1 | command2
不要以為由管道串起的兩個命令會依次執行。Linux 系統實際上會同時運行這兩個命令,在系統內部將它們連接起來。在第一個命令產生輸出的同時,輸出會被立即送給第二個命令。數據傳輸不會用到任何中間文件或緩沖區。
7. 執行數學運算
7.1 expr 命令
expr 命令允許在命令行上處理數學表達式,但是特別笨拙。expr 命令能夠識別少數的數學和字符串操作符,一般不推薦使用。
$ expr 1 + 5
6
$ expr 5 * 2
expr: syntax error
$
# 需要使用轉義字符反斜線將*號標識出來
$ expr 5 \* 2
10
$
7.2 使用方括號
在將一個數學運算結果賦給某個變量時,可以用美元符和方括號($[ operation ])將數學表達式圍起來。該方法比較常用,但僅支持整數運算。
$ var1=$[1 + 5]
$ echo $var1
6
$ var2=$[$var1 * 2]
$ echo $var2
12
$
7.3 浮點解決方案
使用 bc工具
8. 退出腳本
shell 中運行的每個命令都使用退出狀態碼(exit status)告訴 shell 它已經運行完畢。退出狀態碼是一個 0~255 的整數值,在命令結束運行時由命令傳給 shell??梢圆东@這個值并在腳本中使用。
8.1 查看退出狀態碼
Linux 提供了一個專門的變量 $? 來保存上個已執行命令的退出狀態碼。對于需要進行檢查的
命令,必須在其運行完畢后立刻查看或使用 $? 變量。它的值會變成由 shell 所執行的最后一條命令的退出狀態碼。
$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0
$
一個成功結束的命令的退出狀態碼是 0。
| 狀態碼 | 描述 |
|---|---|
| 0 | 命令成功結束 |
| 1 | 一般性未知錯誤 |
| 2 | 不適合的shell命令 |
| 126 | 命令不可執行 |
| 127 | 沒找到命令 |
| 128 | 無效的退出參數 |
| 128+x | 與Linux信號x相關的嚴重錯誤 |
| 130 | 通過Ctrl+C終止的命令 |
| 255 | 正常范圍之外的退出狀態碼 |
8.2 exit 命令
默認情況下,shell 腳本會以腳本中的最后一個命令的退出狀態碼退出。
exit 命令允許你在腳本結束時指定一個退出狀態碼。
$ cat test13
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5
$
當查看腳本的退出碼時,你會得到作為參數傳給 exit 命令的值。
$ chmod u+x test13
$ ./test13
The answer is 40
$ echo $?
5
$
退出狀態碼最大只能是 255。
總結
以上是生活随笔為你收集整理的Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux shell 学习笔记(6)—
- 下一篇: Linux shell 学习笔记(8)—