Shell十三問學習筆記
1. echo 命令所支持的反斜線控制字符如下表:
\a:ALERT / BELL (從系統喇叭送出鈴聲)
\b:BACKSPACE ,也就是向左刪除鍵
\c:取消行末之換行符號
\E:ESCAPE,跳脫鍵
\f:FORMFEED,換頁字符
\n:NEWLINE,換行字符
\r:RETURN,回車鍵
\t:TAB,表格跳位鍵
\v:VERTICAL TAB,垂直表格跳位鍵
\n:ASCII 八進位編碼(以 x 開首為十六進制)
\\:反斜線本身
2. 常用meta
IFS:由 <space> 或 <tab> 或 <enter> 三者之一組成(我們常用 space )。
CR: 由 <enter> 產生。
3. 除了IFS與CR,常用的meta還有:
= :設定變量。
$ :作變量或運算替換(請不要與 shell prompt 搞混了)。
> :重導向stdout。
< :重導向stdin。
| :命令管道。
& :重導向file descriptor,或將命令置於後台執行。
() :將其內的命令置於nested subshell執行,或用於運算或命令替換。
{} :將其內的命令置於non-named function中執行,或用在變量替換的界定范圍。
; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為true,繼續執行下一個命令。
|| :在前一個命令結束時,若返回值為false,繼續執行下一個命令。
! :執行history列表中的命令
4. quoting的三種方法
hard quote:' '(單引號),凡在hard quote中的所有meta均被關閉。
soft quote:“”(雙引號),在soft quote中大部份 meta 都會被關閉,但某些
則保留(如$)。
escape:\(反斜線),只有緊接在escape(跳脫字符)之後的單一meta才被關閉。
[sql]
4.1 示例1
[test@rhel5 ~]$ A="B C"
[test@rhel5 ~]$ echo "'$A'"
'B C'
[test@rhel5 ~]$ echo '"$A"'
"$A"
[test@rhel5 ~]$ A=B\ C
[test@rhel5 ~]$ echo "'$A'"
'B C'
[test@rhel5 ~]$ echo '"$A"'
"$A"
4.2 示例2
[test@rhel5 ~]$ A="
> B
> C"
[test@rhel5 ~]$ echo $A
B C
[test@rhel5 ~]$ echo "$A"
B
C
# $A 時的變量沒至於 soft quote 中,因此當變量替換完成後並作命令行重組時,<enter> 會被解釋為 IFS ,而不是解釋為 New Line 字符。
5. ()與{}這兩對符號的差異
()將command group置於sub-shell去執行,也稱nested sub-shell。
{}則是在同一個shell內完成,也稱為non-named command group。
所謂function,就是用一個名字去命名一個command group,然後再調用這個名字去執行command group。
6. $(( ))與$( )還有${ }的區別
$( )與` `(反引號)都是用來做命令替換用(command substitution)的。在多層次的復合替換中,``須要額外的跳脫(\`)處理,而$()則比較直觀。
${ }是用來作變量替換用的。
$(( ))用來作整數運算的。
7. ${ }的一些特異功能
詳見"shell中${}的妙用 "
8. $$, $#, $@, $*區別?
$$: 進程ID
$#: 參數的數量
$?: 上一條命令的返回值
my.sh p1 "p2 p3" p4
"$@" 則可得到 "p1" "p2 p3" "p4" 這三個不同的詞段(word)﹔
"$*" 則可得到 "p1 p2 p3 p4" 這一整串單一的詞段。
9. 命令的返回值
Return Value的作用,是用來判斷行程的退出狀態(exit status),只有兩種:
0的話為"真"(true)
非0的話為"假"(false)
10. &&和||
&& 與 || 都是用來"組建"多個 command line 用的:
command1 && command2:其意思是command2只有在RV為0(true)的條件下執行。
command1 || command2:其意思是command2只有在RV為非0(false)的條件下執行。
11. < 和 >
標准輸出: 1>
錯誤輸出: 2>
兩個輸出合並: 1>file.both 2>&1
輸出到空設備: &>/dev/null
12. 管道pipe
上一個命令的stdout接到下一個命令的stdin
13. if與case
[sql]
if comd1; then
comd2
elif comd3; then
comd4
else
comd5
fi
case "$1" in
start)
start
;;
stop)
stop
;;
status)
rhstatus
;;
restart|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/syslog ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart}"
exit 1
esac
13. for, while, until
[sql]
for var; do
......
done
for var in one two three four five
do
echo '$var is '$var
done
for ((i=1;i<=10;i++))
do
echo "num is $i"
done
num=1
while [ "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done