2.6.6 命令的執行
1 $(command):捕獲一條命令的執行結果並把他用在shell指令碼程式
echo The date is $(date) //其結果就是命令的輸出,是字串形式的輸出結果
set $(date)
echo The month is $2 //通過位置參數來輸出$(date)中的字串
2 算術擴充 $((...))
x=$(($x+1)) //比起expr要快
3 參數擴充
unset foo
echo ${foo:-bar} :當foo為空白,就設定為bar的值 //bar
foo=fud
echo ${foo:-bar} //fud
foo=/usr/bin/X11/startx
echo ${foo#*/} // usr/bin/X11/startx
echo ${foo#*} // /usr/bin/X11/startx
${param#word} //從param的頭部開始刪除與word匹配的最小部分,然後返回剩餘部分,最多不含/
echo ${foo##*/} //startx 從param的頭部開始刪除與word匹配的最大部分,然後返回剩餘部分,最少不含/
bar=/usr/local/etc/local/networks
echo ${bar%local*} ///usr/local/etc/
${param%word} 從param的尾部開始刪除與word匹配的最小部分,然後返回
echo ${bar%%local*} ///usr/
echo ${#bar} //29 param的長度
echo ${foo:=bar} //如果foo為空白,就把bar賦給foo bar
echo ${foo:?bar}
2.6.7 here文檔
在shell指令碼程式中向一條命令傳遞輸入的一種特殊方式
cat << !FUNKY! //<<為here文檔開始標誌 !FUNKY!並以之為結束符
hello
this is a here
document
!FUNKY!
3 檔案操作
3.1 LINUX檔案結構
檔案結構為OS服務和裝置提供了一個簡單而統一的介面。在LINUX中一切都是檔案,甚至硬體裝置在LINUX中也通常被映射為檔案
3.1.2 檔案和裝置
1 /dev/console :系統控制台,錯誤資訊和診斷資訊被發送到這個裝置
2 /dev/tty :如果一個進程有控制中斷的話,這/dev/tty就是這個控制終端(鍵盤,顯示器)的別名
3 /dev/null :所有寫向這個裝置的輸出都將被丟棄。讀這個檔案會返回一個檔案愛你尾標誌,將不需要的輸出重新導向到/dev/null
裝置分為字元裝置和塊裝置(支援隨即檔案系統存取的設別,硬碟):區別在於訪問設別時是否需要一次讀寫一整塊。
3.2 系統調用和裝置驅動程式
可以對檔案和裝置進行訪問和控制的函數是系統調用,由LINUX直接提供,是通向OS本身的介面
用來訪問裝置驅動程式的底層函數(系統調用)包括:
open :開啟檔案活裝置
read :
write
close
ioctl :把控制資訊傳遞給裝置驅動程式
標準函數庫為裝置和磁碟檔案提供更高層的介面。
3.4 底層檔案訪問
3.4.1 write
#include <unistd.h>
size_t write(int fildes,const void *buf,size_t nbytes);
把緩衝區buf的前nbytes個位元組寫入於檔案描述符fildes關聯的檔案中,返回實際寫入的位元組數。 0 表示未寫出任何資料;-1 在write中出現了錯誤
if ((write(1,"Here is some data/n",18))!=20)
write(2,"A write error has occurred on file descripter./n",46);
其執行結果為:
$ gcc -o sim simple_write.c
$ ./sim
Here is some data
A write error has occurred on file descripter.
3.4.2 read系統調用
#include <unistd.h>
size_t read(int fildes,void *buf,size_t nbytes)
//將從fildes相關聯的檔案中讀入nbytes個位元組到buf資料區中
返回實際讀入的位元組數
0:到達檔案尾
-1:read調用出錯
read(0,...):從鍵盤是輸入
write(1,...):輸出到顯示器上
有趣的是,你不僅可以從鍵盤上標準輸入,還可以用檔案重新導向輸入,然後程式執行那個write(1,...)將文本輸出
但是./rd < simple_read.c可以,而gdb ./rd < simple_read.c和gdb rd < simple_read.c都不行呀
3.4.3 open系統調用
#include<fcntl.h>
int open(const char *path,int oflags);
int open(const char *path,int oflage,mode_t mode)
open建立一條到檔案活設別的訪問路徑。操作成功,則將返回一個檔案描述符,read和write調用該描述符就可以開啟檔案進行操作。即便是兩個程式開啟同一個檔案,也會得到不同的檔案描述符。如果都對檔案進行寫操作,就各寫各的,分別接著上次離開的位置繼續往下寫,彼此互相覆蓋。
檔案訪問模式:必選
O_RDONLY
O_WRONLY
O_RDWR
可選:
O_APPEND :追加到檔案尾部
O_TRUNC: 檔案長度設為0,丟棄已有內容
O_CREAT:按照mode給出的訪問模式建立檔案
O_EXCL:與O_CREATE同時使用
open失敗返回-1,用errno指明錯誤原因
open("myfile",O_CREAT,S_IRUSR|S_IXOTH)
$ ls -ls myfile
0 -r-------x 1 yaozhangjun yaozhangjun 0 2009-10-22 23:03 myfile
但是open的檔案描述符好像是0呀