ubuntu之shell編程學習筆記2——編程基礎

一、特殊符號

參考文獻:http://hi.baidu.com/04202009/blog/item/d6fb90868c1f5831c65cc311.html

1、#

   a、註釋,行首以#開頭作註釋(#!例外)

   b、註釋也可以存在於本行命令的右邊,例如  echo  the  #  。。。。。

   c、命令是不能出現在同一行命令的右邊的

   d、echo命令中的轉義#是不能作爲註釋的

   e、#也可以出現在特定的參數結構中或者數字常量表達式中.例如  $((2#110101))-----2進制

2、;

    a、命令分隔符

3、;;

   case語句中會用到

4、.

正則表達式用來匹配單個字符,例如 ,ls  -l |grep ^...X   ----篩選第四位爲X的

5、*

冪運算:2**10

6、&
一個命令後面跟&,表示命令在後臺運行

 7、

``=$()

 二、I/O重定向

參考文獻:http://www.yuanma.org/data/2006/1116/article_1827.htm

常用FD有3個,爲0(stdin,標準輸入)、1(stdout,標準輸出)、2(stderr,標準錯誤輸出),默認與keyboard、monitor、monitor有關

cmd > file 把 stdout 重定向到 file 文件中
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> fiel 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加)
cmd < file >file2 cmd 命令以 file 文件作爲 stdin,以 file2 文件作爲 stdout


cat <>file 以讀寫的方式打開 file
cmd < file cmd 命令以 file 文件作爲 stdin
cmd << delimiter Here document,從 stdin 中讀入,直至遇到 delimiter 分界符
三、輸入和輸出(echo,read,cat,管道,tee,重定向等)

1、echo 

echo 該命令的一般格式爲: echo [ -n ] 字符串其中選項n表示輸出文字後不換行;字符串能加引號,也能不加引號。用echo命令輸出加引號的字符串時,
將字符串原樣輸出;用echo命令輸出不加引號的字符串時,將字符串中的各個單詞作爲字符串輸出,各字符串之間用一個空格分割。
功能說明:顯示文字。
語   法:echo [-ne][字符串]或 echo [--help][--version]
補充說明:echo會將輸入的字符串送往標準輸出。輸出的字符串間以空白字符隔開, 並在最後加上換行號。
參   數:-n 不要在最後自動換行
-e 若字符串中出現以下字符,則特別加以處理,而不會將它當成一般
文字輸出:
   \a 發出警告聲;
   \b 刪除前一個字符;
   \c 最後不加上換行符號;
   \f 換行但光標仍舊停留在原來的位置;
   \n 換行且光標移至行首;
   \r 光標移至行首,但不換行;
   \t 插入tab;
   \v 與\f相同;
   \\ 插入\字符;
   \nnn 插入nnn(八進制)所代表的ASCII字符;
–help 顯示幫助
–version 顯示版本信息
2、read 

語法
read  [options]

-a 後跟一個變量,該變量會被認爲是個數組,然後給其賦值,默認是以空格爲分割符。

-d 後面跟一個標誌符,其實只有其後的第一個字符有用,作爲結束的標誌,會舉例說  明。

-p 後面跟提示信息,即在輸入前打印提示信息。

-e 在輸入的時候可以時候命令補全功能。

-n 後跟一個數字,定義輸入文本的長度,很實用。

-r 屏蔽\,如果沒有該選項,則\作爲一個轉義字符,有的話 \就是個正常的字符了。

-s 安靜模式,在輸入字符時不再屏幕上顯示,例如login時輸入密碼。

-t 後面跟秒數,定義輸入字符的等待時間。

-u 後面跟fd,從文件描述符中讀入,該文件描述符可以是exec新開啓的。

例子:

-a舉例:

root@localhost:~/test#read -a tao

qq ww ee rr

root@localhost:~/test#echo ${tao[1]}

Ww

-b舉例

root@localhost:~/test#read -d eof -a tao

ww

dd

gg

hh  (輸入一個e

root@localhost:~/test#echo ${tao[3]}

Hh

-n舉例:

root@localhost:~/test#read -n3 -p "you can input 3 word:"

you can input 3 word:xxx

(輸入3個字符後自動退出!)

-s舉例

root@localhost:~/test#read -p password: -s passwd 

password:

(這時候輸入就不再顯示在屏幕上了!)

-e舉例:

root@localhost:~/test#read -e file

tab鍵補全)

exp1               file               ngis_post.sh       text               

exp5               linux-2.6.27.54/   test               xen-3.0.1-install/ 

-u舉例:

root@localhost:~/test#exec 3<file

root@localhost:~/test#read -u 3 tao

root@localhost:~/test#echo $tao

hello world!

root@localhost:~/test#

注意看下讀入的次序:

root@localhost:~/test#cat file

hello world!

i am good

root@localhost:~/test#exec 3<file

root@localhost:~/test#read -u 3 tao

root@localhost:~/test#echo $tao

hello world!

root@localhost:~/test#read -u 3 tao

root@localhost:~/test#echo $tao

i am good

root@localhost:~/test#

3、cat

作用:顯示文件,創建文件,顯示控制字符

注意:在文件分頁符處不會停下來;會一下顯示完整個文件。因此,可以使用m o r e命令或把c a t命令的輸出通過管道傳遞到另外一個具有分頁功能的命令中,使用命令less file可實現相同的功能。

例如:$ cat myfile | more或者  $ cat myfile | pg

例子:

a、顯示名爲m y f i l e的文件   :$ cat myfile
b、顯示m y f i l e 1、m y f i l e 2、m y f i l e 3這三個文件,可以用: $ cat myfile1 myfile2 myfile3
c、創建一個包含上述三個文件的內容,名爲b i g f i l e的文件,可以用輸出重定向到新文件中:$ cat myfile1 myfile2 myfile3 > bigfile
d、如果cat的命令行中沒有參數,輸入的每一行都立刻被cat命令輸出到屏幕上,輸入完畢後按結束:

$ cat
Hello world
Hello world 

e、新建文件
$cat >myfile
This is great
$cat myfile
This is great

cat具體命令格式爲 : cat [-AbeEnstTuv] [--help] [--version] fileName
說明:把檔案串連接後傳到基本輸出(屏幕或加 > fileName 到另一個檔案)
參數:
-n 或 –number 由 1 開始對所有輸出的行數編號
-b 或 –number-nonblank 和 -n 相似,只不過對於空白行不編號
-s 或 –squeeze-blank 當遇到有連續兩行以上的空白行,就代換爲一行的空白行
-v 或 –show-nonprinting
例如:
cat -n linuxfile1 > linuxfile2 把 linuxfile1 的檔案內容加上行號後輸入 linuxfile2 這個檔案裏
cat -b linuxfile1 linuxfile2 >> linuxfile3 把 linuxfile1 和 linuxfile2 的檔案內容加上行號(空白行不加)之後將內容附加到linuxfile3 裏。
cat /dev/null > /etc/test.txt 此爲清空/etc/test.txt檔案內容
補充:

-T 將製表符顯示爲 ^I
-v 顯示非打印字符,除了換行符和製表符,它們使用各自效果相當的“控制序列”。

4、tee

功能說明:讀取標準輸入的數據,並將其內容輸出成文件。
語   法:tee [-ai][--help][--version][文件…]
補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。我們可利用tee把管道導入的數據存成文件,甚至一次保存數份文件

參  數:
 -a或–append  附加到既有文件的後面,而非覆蓋它. 
 -i-i或–ignore-interrupts  忽略中斷信號。 
 –help  在線幫助。 
 –version  顯示版本信息。

範   例:
  列出文本文件slayers.story的內容,同時複製3份副本,文件名稱分別爲ss-copy1、ss-copy2、ss-copy3:
  $ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3

5、exec

shell的內建命令exec將並不啓動新的shell,而是用要被執行命令替換當前的shell進程,並且將老進程的環境清理掉,而且exec命令後的其它命令將不再執行。
因此,如果你在一個shell裏面,執行exec ls那麼,當列出了當前目錄後,這個shell就自己退出了,因爲這個shell進程已被替換爲僅僅執行ls命令的一個進程,執行結束自然也就退出了。爲了避免這個影響我們的使用,一般將exec命令放到一個shell腳本里面,用主腳本調用這個腳本,調用點處可以用bash a.sh,(a.sh就是存放該命令的腳本),這樣會爲a.sh建立一個sub shell去執行,當執行到exec後,該子腳本進程就被替換成了相應的exec的命令。
source命令或者".",不會爲腳本新建shell,而只是將腳本包含的命令在當前shell執行。
不過,要注意一個例外,當exec命令來對文件描述符操作的時候,就不會替換shell,而且操作完成後,還會繼續執行接下來的命令。
    exec 3<&0:這個命令就是將操作符3也指向標準輸入。
 
別處,這個命令還可以作爲find命令的一個選項,如下所示:
(1)在當前目錄下(包含子目錄),查找所有txt文件並找出含有字符串"bin"的行
find ./ -name "*.txt" -exec grep "bin" {}
(2)在當前目錄下(包含子目錄),刪除所有txt文件
find ./ -name "*.txt" -exec rm {}



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章