SHELL初級(三)+ 檔案操作

來源:互聯網
上載者:User

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呀

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.