1. 程式人生 > >Linux Shell 指令碼程式設計(3)—Shell輸入與輸出

Linux Shell 指令碼程式設計(3)—Shell輸入與輸出

shell 輸入與輸出

  • 提綱:
    echo        
    read        
    cat 
    管道  
    tee 
    檔案重定向   
    標準輸入輸出和錯誤   
    合併標準輸出和標準錯誤 
    exec和使用檔案描述符
    檔案重定向
  • 目標:
    終端使用者登入linux伺服器,為每一個終端使用者啟動一個shell程式。

1. echo

  • echo命令可以顯示文字行或變數,或者把字串輸入到檔案。

    • 命令格式: echo [option] string
echo
[option] string #選項說明:-e 解析轉義字元 echo –e “ab\ncd” echo “ab\ncd” ab ab\ncd cd  -n 回車不換行,linux系統預設回車換行 eg: echo –n “abc” ; echo “abc”  -轉義字元 ( \c(回車不換行) \f(禁止)\t(回車換行) \n(回車換行) )
#實驗指令碼檔案  js.sh
#!/bin/bash #echo echo -e "demo01.... \n\n\n" echo "ok" #echo 空,後面沒有任何東西,將要有一個回車換行 echo echo "demo02......\n\n\n" echo "demo03 line" >mylog.txt #執行結果 demo01.... ok 空,後面沒有任何東西,將要有一個回車換行 demo02......\n\n\n

2. read

  • read語句可以從鍵盤或檔案的某一行文字中讀入資訊,並將其制複製給一個變數。
  • 格式: read var1 var2 ….
    若只指定了一個變數,那麼read將會把所有的輸入賦給該變數,直至遇上第一個檔案結束符或者回車。如果給了多個變數,他們按照順序分別賦予不同的變數。shell將用空格作為變數之間的分隔符。
#指令碼檔案 shll01.sh

#!/bin/bash
#readme
#注意回車不換行的用法

echo -n "First Name:"
read firstname

echo -n "Last Name:"
read lastname lastname2 

echo -e "FirstName: ${firstname}\n" 
echo -e "LastName: ${lastname}\n" 
echo -e "LastName2: ${lastname2}\n" 

#執行結果:
[email protected]:~$ ./shell01.sh
First Name:kang
Last Name:jian bing
FirstName: kang

LastName: jian

LastName2: bing

3. cat

  • 是一個簡單而通用的命令,可用它顯示檔案內容、建立檔案、還可以用它來顯示控制字元。

  • 格式: cat [options] filename1 … filename2 ….

   -v 顯示控制字元
      eg:   cat –v dos.txt #顯示dos檔案的^M
  • 使用cat命令時注意,它不會在檔案分頁處停下來;它會一下顯示完整個檔案
    如果希望每次顯示一頁,可以使用more命令 或把cat命令的輸出通過管道傳遞到另外一個具有分頁功能的命令(more、less)中。
  eg:   cat longfile |more 
        cat longfile | less
        less longfile
  • man cat
[email protected]:~$man cat
CAT(1)                           User Commands                          CAT(1)

NAME
       cat - concatenate files and print on the standard output

SYNOPSIS
       cat [OPTION]... [FILE]...

DESCRIPTION
       Concatenate FILE(s), or standard input, to standard output.

       -A, --show-all
              equivalent to -vET

       -b, --number-nonblank
              number nonempty output lines, overrides -n

       -e     equivalent to -vE

       -E, --show-ends
              display $ at end of each line

       -n, --number
 Manual page cat(1) line 1 (press h for help or q to qui
  • 例項
cat myfile  

cat myfile1 myfile2 myfile3  #顯示三個檔案

cat myfile1 myfile2 > myfile12   #同時將檔案2的內容拷貝(重定向)到檔案12中(建立新的檔案12,若其不存在)

4. 管道

  • 可以通過管道把一個命令的輸出傳遞給另外一個命令做輸入。管道用豎線 | 表示

  • 格式: 命令1 | 命令2

  • 例項

jianliu@ubuntu:~$ ls -l | grep "app2"
-rwxrwxr-x  1 jianliu jianliu 8501 Oct  6 19:26 app2

jianliu@ubuntu:~$ cat myfile | more

jianliu@ubuntu:~$ df –k | awk '{print $1}' | grep –v "Filesystem"
/dev/sda1   none    udev     tmpfs
none       none    none
#df –k 看磁碟空間 查詢第一列 去除filesystem字元排除掉

5. tee

  • 結果輸出到標準輸出,另一個副本輸出到相應檔案(除錯時相當有用

  • 格式:

    tee –a file     
        -a:    表示追加,在file後面追加內容
        不加-a 表示覆蓋,覆蓋之前的檔案,重寫。
eg:
jianliu@ubuntu:~$ who | tee -a who.out  
jianliu  :0           2017-10-06 01:36 (:0)
jianliu  pts/0        2017-10-06 20:04 (:0.0)
#輸出到終端上,並且將結果寫入who.out檔案中。
  • 該命令一般用於管道之後 (一般看到輸出,並存檔案)
   df –k | awk '{print $1}' | grep –v "Filesystem" | tee partation.txt

6. 標準輸入、輸出及錯誤

  • 當我們在shell中執行命令的時候,每個程序都和三個開啟的檔案(檔案描述符)相聯絡,並使用檔案描符來引用這些檔案。由於檔案描述符fd不容易記憶, shell同時也給出了相應的檔名。
        輸入檔案—標準輸入 0       ---fd0
        輸出檔案—標準輸出 1       ----fd1
        錯誤輸出檔案—標準錯誤 2    ----fd2
  • 系統中實際上有12個檔案描述符,但是正如我們在上表中所看到的,0、1、2是標準輸入、出和錯誤。可以任意使用檔案描述符3到9。

7. 檔案重定向

  • 檔案重定向:改變程式執行的輸入來源和輸出地點

這裡寫圖片描述
!注意!!
——— 1>中 1和>中間不能有空格!!!———————–

  • 【1】重定向標準輸出
   jianliu@ubuntu:~$ cat num1.txt
    25
    2
    10
    12
    23

    #對num1.txt中元素按照數值大小規則進行升序排序。
    jianliu@ubuntu:~$ cat num1.txt | sort -g   
    2
    10
    12
    23
    25

    #將排序結果存於num2.txt中
    jianliu@ubuntu:~$ cat num1.txt | sort -g > num2.txt
    #與上面的結果一樣,等價命令。
    jianliu@ubuntu:~$ cat num1.txt | sort -g 1> num2.txt  
    #!注意!! 1>中 1和>中間不能有空格-----------------------

    #當前路徑資訊追加到path.out中
    pwd >> path.out 

    #nullfile.txt   如果想建立一個長度為0的空檔案,可以用'filename'
  • 【2】重定向標準輸入
    #將num1.txt的內容輸入到sort進行排序,排序後的結果輸出到終端
    #!!!預設情況下,sort按照ASCII碼大小進行排序。
    jianliu@ubuntu:~$ sort <num1.txt
    10
    12
    2
    23
    25

    #從num1.txt中讀內容,進行排序,排序結果輸出到num2.txt中。
    jianliu@ubuntu:~$ sort -g < num1.txt > num2.txt

  • 【3】重定向標準錯誤
eg:$ grep "trident" missiles 2> /dev/null 
    #在這個例子中,grep命令在檔案missiles 中搜索trident字串
  • 【4】結合使用標準輸出和標準錯誤
   eg:$ cat account_qtr.doc account_end.doc 1> accounts.out 2> accounts.err
  • 【5】合併標準輸出和標準錯誤
    eg: grep "standard" standard.txt > grep.out 2> &1  
    #在上面的例子中,我們將 cleanup指令碼的輸出重定向到cleanup .out檔案中,而且其錯誤也重定向到相同的檔案中。

———注意:shell是從左至右分析相應的命令!!!!!!

/home/wbm/myshell
[wbm@wmblinux64 myshell]$ cat file1 file2 file3 > err.out 2< &1 
[wbm@wmblinux64 myshell]$ cat err.out 
111
1111
111111
222
22222
2222222
cat: file3: 沒有那個檔案或目錄
[wbm@wmblinux64 myshell]$

【6】—-exec 與檔案描述符在一起的情況

  • exec命令用於呼叫並執行指令的命令。exec命令通常用在shell指令碼程式中,可以呼叫其他的命令。如果在當前終端中使用命令,則當指定的命令執行完畢後會立即退出終端。

  • 語法: exec(選項)(引數)

  • 1、 exec命令可以用來代替當前shell;
    換句話說,並沒有啟動子shell,使用這一命令時,任何現有環境都將被清除,並重新啟動一個shell。

首先使用echo命令將文字“Linux C++”進行輸出,輸入如下命令:
echo Linux C++           #輸出指定資訊
執行上面的指令後,輸出如下資訊:
Linux C++                #輸出資訊

然後再使用exec命令呼叫echo命令輸出同樣的資訊,並且對輸出的資訊進行對比,輸入指令如下所示:
exec -c echo Linux C++          #呼叫命令
執行以上命令後,其輸出資訊如下:
Linux C++                       #使用指定指令輸出資訊

通過比較兩者執行後的結果來看,所實現的功能是相同的,即使用exec命令呼叫echo命令成功。

——- exec command command通常是一個shell指令碼。

——-Eg:測試執行完該命令後,需要重新登入shell,然後export宣告的變數都失效了。

  • 2 對檔案描述符進行操作時,也只有這個時,它不會覆蓋你的當前的shell。
#!/bin/bash
#file_desc
#
exec 3<&0 0<name.txt 
read line1 
read line2 
exec 0<&3 

echo $line1
echo $line2

相關推薦

Linux Shell 指令碼程式設計3Shell輸入輸出

shell 輸入與輸出 提綱: echo read cat 管道 tee 檔案重定向

linux shell 語言基礎3shell 特殊位置變數、source、sh、bash、./執行指令碼的區別等

一、shell 特殊位置變數 $0 檔名及路徑 $1~$n  新增到Shell的各引數值。$1是第1引數、$2是第2引數… $* 傳遞給指令碼的所有引數列表如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有引數。 $#新增到shell 引數個數 $

shell指令碼程式設計

(一)要求:1、在SHELL語句中加入必一要的註釋,以便以後閱讀和維護,註釋以”#”開頭。   2、對變數和函式命名時最好能使用有含義且容易理解的名字。  (二)內容:1、建立以下選單程式:  HOST: ********  &

Shell指令碼程式設計

if-else語句 Shell 有三種 if … else 語句: if ... fi 語句; if ... else ... fi 語句; if ... elif ... else ... fi 語句。 if … else 語句的語法: if [ expression

Shell指令碼程式設計

Shell替換 shell變數替換 如果表示式中包含特殊字元,Shell 將會進行替換。例如,在雙引號中使用變數就是一種替換,轉義字元也是一種替換。 #!/bin/bash a=10 echo -e "Value of a is $a \n" 執行結果: Value

linux c/c++ 程式設計shell程式程式設計

shell 其實是一個指令碼語言,裡面有一整套的東西,一般如果不是在linux下程式設計很少用到。本人有一整套基礎程式碼可以讓初學者學習。 這是我在2014年學習shell程式設計時寫的一套程式碼,需要的可以在我git的找到。git地址稍後貼出 希望可以幫到大家

SHELL 指令碼程式設計

(一)題目:檔案pc.txt中儲存了三個學生的選課成績,試編寫一段shell程式對檔案內容進行統計、計算後輸出選課的學生總人數及選課成績的不及格率(保留到小數點後2位)和平均成績(保留到小數點後1位)。

比特幣交易Transaction輸入輸出

比特幣通過“挖礦”機制保證了不能任意造幣。通過分散式網路和HashCash機制解決雙重支付問題。事實上比特幣系統中不存在獨立的電子貨幣,而只存在交易單(賬單),貨幣值是依附於交易單存在的,所以比特幣中的電子貨幣實質上交易的賬單記錄的變化,確切的說是貨幣交易(Transac

Linux真小白入門教程第六集——Bash Shell命令學習3

在Linux中,重新命名檔案被稱為移動(moving) mv 命令可以將檔案和目錄移動到另一個位置或者重新命名。 mv file1 file2 將檔名從file1改為file2,檔案的innode號和時間戳保持不變,此時mv隻影響檔名。 mv file1 Picture/ 將fi

Linux入門學習筆記--Shell指令碼編寫

Shell指令碼的HelloWorld:     cd /自己的路徑下     vi helloworld.sh 進入之後,預設是命令狀態,按i進入編輯模式     內容:         #! /bin/bash         echo "Hello World!"   

shell程式設計3

shell專案——分發系統 對於大公司而言,肯定時不時會有網站或者配置檔案更新,而且使用的機器肯定也是好多臺,少則幾臺,多則幾十甚至上百臺。這樣的話一臺一臺配置肯定是不現實的,所以,自動同步檔案是至關重要的。 而要如何實現自動同步呢?首先要有一臺模板機器,把要分發的檔案準

linuxshell指令碼學習

#!/bin/bash echo 'hello' your_name='longxiong' echo $your_name echo ${your_name} for i in `ls /opt`; do echo ${i} done str="1234" echo ${#str} unset s

Linux 命令詳解Shell腳本的數組詳解

cti err art case lin start shell pre round 1、數組定義 [[email protected] ~]# a=(1 2 3 4 5 6 7 8) [[email protected]-IDC ~]# echo $

shell學習筆記3

shell 基礎 雜記if 一、if基礎 1、單分支 1.1 語法 if語句語法 單分支結構語法: if [條件]; then 指令 fi 或 if [條件] then 指令 fi 1.2 例子 [roo

shell指令碼基礎2

shell檔案許可權和指令碼執行   pwd檢視檔案所在路徑 ls檢視目錄 ll檢視檔案許可權 head -l /etc/passwd檢視root使用者 head -l /etc/group檢視root組 linux許可權 r  4 讀 w  2 寫 x &

shell指令碼基礎1

一、簡介 windows格式: .bat linux格式:.sh  shell是c語言編寫的程式,即使一種命令語言,又是一種程式設計語言 shell種類: .sh   ash ,bash, ksh, csh, zsh  二、操作  

學習筆記之shell指令碼基礎

Shell----if&for 判斷檔案是否存在 [[email protected] ~]# vi 1.sh [[email protected] ~]# bash -x 1.sh + l=123/121 + '[' '!' -e

shell指令碼——函式

一.建立函式  有兩種格式可以用來在bash shell指令碼中建立函式.  第一種採用關鍵字function。後跟分配給該程式碼的函式名。    function name {     commands    }    name屬性定義了賦予函式唯一的名稱。指令碼中定義的每

shell指令碼練習

最近學習中遇到了,需要shell指令碼編寫,但是對於shell一竅不通,為了滿足學習需求,同時學會一門指令碼語言的編寫也是很重要的一項能力,對於提高自己有很大的好處。 shell一些常用的基礎知識,上網查查,看了一些基礎,但是不管看多少最終實戰最重要,因此,這

shell 實練3-賬戶建立/新增到組/for迴圈報錯解決

1、設計一個shell程式,新增一個新組為class1,然後新增屬於這個組的30個使用者,使用者名稱的形式為stdx,其中xx從01到30。  首先分析問題,程式執行應該這樣: 新增一個新組;        groupadd class1    新建30個使用者,當然要用