Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令並把它送入內核去執行。
實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令並且把它們送到內核。
參數解釋:
-i :information,執行命令時候提示是否確定執行
Ls –F:區分文件和目錄
Ls –a(all):列出所有文件
Ls –R:顯示當前目錄下的內容及子目錄下的內容
通配符:?代表一個字符,*代表多個字符 ls my*a
單點符表示當前工作目錄:cp /etc/a.conf .
CP –R:複製整個目錄的內容 cp –R SCRIPTS/ AA
Mv命令隻影響文件名,不影響時間戳等其它內容,可以既移動文件(目錄)位置又修改名稱,mv也可以移動
同時創建多個目錄和子目錄用–p參數:mkdir –p home/sss/sss
rm –r:向下進入目錄,刪除其中的文件,再刪除目錄本身
rm –rf:一口氣刪除目錄及其裏面的所有內容
cat –n:給所有的行加上行號
more命令:使用空格鍵或回車鍵瀏覽文件
以.開頭的文件是隱藏文件
數組變量:mytest=(one two three four five)
Echo $mytest
Echo ${mytest [2]}
Ls –l 命令結果的第一個字符代表了對象的類型:-代表文件 d代表目錄 第2-4位代表文件屬主的權限5-7位代表屬組成員的權限 8-10位代表其他用戶的權限 -rwxrwxrwx
Chmod用來改變文件和目錄的安全性設置
Chown用來改變文件的屬主
Chgrp用來改變文件的默認屬組
shell可以讓你將多個命令串起來,一次執行完成。如果要兩個命令一起運行,可以
把它們放在同一行中,彼此間用分號隔開。
$ date ; who
echo 命令後面加上了一個字符串,該命令就能顯示出這個文本字符串。
$ echo This is a test
echo 命令可用單引號或雙引號來劃定文本字符串。如果在字符串中用到了它們,你需要在
文本中使用其中一種引號,而用另外一種來將字符串劃定起來。
$ echo "This is a test to see ifyou're paying attention"
This is a test to see if you're payingattention
$ echo 'Rich says "scripting iseasy".'
Rich says "scripting is easy".
把文本字符串和命令輸出顯示在同一行中,該怎麼辦呢?可以用 echo 語句
的 -n 參數。只要將第一個 echo 語句改成這樣就行:
echo -n "The time and date are: "
set 命令:顯示一份完整的當前環境變量列表
shell腳本:
只要腳本在引號中出現美元符$,它就會以爲你在引用一個變量。
反斜線允許shell腳本將美元符解讀爲實際的美元符,而不是變量。
echo "The cost of the item is\$15"
The cost of the item is $15
使用等號將值賦給用戶變量。在變量、等號和值之間不能出現空格
將命令輸出賦給變量:
1. 反引號字符( ` ) testing='date'
2.$() 格式 testing=$(date)
if-then 語句有如下格式:
if command
then
commands
fi
在其他編程語言
中, if 語句之後的對象是一個等式,這個等式的求值結果爲 TRUE 或 FALSE 。但bash shell的 if 語
句並不是這麼做的。bash shell的 if 語句會運行 if 後面的那個命令。如果該命令的退出狀態碼(參見第11章)是 0
(該命令成功運行),位於 then 部分的命令就會被執行。如果該命令的退出狀態碼是其他值, then部分的命令就不會被執行,bashshell會繼續執行腳本中的下一個命令。 fi 語句用來表示 if-then
語句到此結束。
$ cat test1.sh
#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi
$
結果:
$ ./test1.sh
/home/Christine
It worked
$
elif 語句:
if command1
then
commands
elif command2
then
more commands
fi
test 命令提供了在 if-then 語句中測試不同條件的途徑。如果 test 命令中列出的條件成立,
test 命令就會退出並返回退出狀態碼 0 。這樣 if-then 語句就與其他編程語言中的if-then 語句
以類似的方式工作了。如果條件不成立, test 命令就會退出並返回非零的退出狀態碼,這使得
if-then 語句不會再被執行。
bash shell提供了另一種條件測試方法,無需在if-then 語句中聲明 test 命令。
if [ condition ]
then
commands
fi
方括號定義了測試條件。注意,第一個方括號之後和第二個方括號之前必須加上一個空格,
否則就會報錯。
test 命令可以判斷三類條件:
數值比較
字符串比較
文件比較
test 命令的數值比較功能
n1 -eq n2
檢查 n1 是否與 n2 相等
n1 -ge n2
檢查 n1 是否大於或等於 n2
n1 -gt n2
檢查 n1 是否大於 n2
n1 -le n2
檢查 n1 是否小於或等於 n2
n1 -lt n2
檢查 n1 是否小於 n2
n1 -ne n2
檢查 n1 是否不等於 n2
在運行腳本時向命令
行添加數據。
$ ./addem 10 30
bash shell會將一些稱爲位置參數(positionalparameter)的特殊變量分配給輸入到命令行中的
所有參數。這也包括shell所執行的腳本名稱。位置參數變量是標準的數字: $0 是程序名, $1 是第
一個參數, $2 是第二個參數,依次類推,直到第九個參數 $9 。
shell將輸入到命令行的字符串值傳給腳本。但碰到含有空格的文本字符串時就會出現問題,
每個參數都是用空格分隔的,所以shell會將空格當成兩個值的分隔符。要在參數值中
包含空格,必須要用引號(單引號或雙引號均可)。
$ ./test3.sh 'Rich Blum'
Hello Rich Blum, glad to meet you.
$
$ ./test3.sh "Rich Blum"
Hello Rich Blum, glad to meet you.
可以用 $0 參數獲取shell在命令行啓動的腳本名。
basename 命令會返回不包含路徑的腳本名。
name=$(basename $0)
echo
echo The script name is: $name
測試參數(-n):測試在執行腳本時是否有參數輸入:
if [ -n "$1" ]
then
echo Hello $1, glad to meet you.
else
echo "Sorry, you did not identifyyourself. "
fi
特殊變量 $# 含有腳本運行時攜帶的命令行參數的個數。可以在腳本中任何地方使用這個特殊
變量,就跟普通變量一樣。
echo There were $# parameters supplied.
$* 和 $@ 變量可以用來輕鬆訪問所有的參數。這兩個變量都能夠在單個變量中存儲所有的命
令行參數。
$* 變量會將命令行上提供的所有參數當作一個單詞保存。這個單詞包含了命令行中出現的每
一個參數值。基本上 $* 變量會將這些參數視爲一個整體,而不是多個個體。
另一方面, $@ 變量會將命令行上提供的所有參數當作同一字符串中的多個獨立的單詞。這樣
你就能夠遍歷所有的參數值,得到每個參數。這通常通過 for 命令完成。
它會將每個參數變量向左移動一個位置。所以,變量 $3
的值會移到 $2 中,變量 $2 的值會移到 $1 中,而變量 $1 的值則會被刪除(注意,變量 $0 的值,也
就是程序名,不會改變)。
這是遍歷命令行參數的另一個好方法,尤其是在你不知道到底有多少參數時。你可以只操作
第一個參數,移動參數,然後繼續操作第一個參數。
echo
count=1
while [ -n "$1" ]
do
echo "Parameter #$count = $1"
count=$[ $count + 1 ]
shift
done
使用 shift 命令的時候要小心。如果某個參數被移出,它的值就被丟棄了,無法再恢復。
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) echo "Found the -b option" ;;
-c) echo "Found the -c option" ;;
*) echo "$1 is not an option" ;;
esac
shift
done
$
$ ./test15.sh -a -b -c -d
Found the -a option
Found the -b option
Found the -c option
-d is not an option