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 指令碼程式設計(3)—Shell輸入與輸出
shell 輸入與輸出 提綱: echo read cat 管道 tee 檔案重定向
linux shell 語言基礎(3)shell 特殊位置變數、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專案——分發系統 對於大公司而言,肯定時不時會有網站或者配置檔案更新,而且使用的機器肯定也是好多臺,少則幾臺,多則幾十甚至上百臺。這樣的話一臺一臺配置肯定是不現實的,所以,自動同步檔案是至關重要的。 而要如何實現自動同步呢?首先要有一臺模板機器,把要分發的檔案準
linux之shell指令碼學習(一)
#!/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個使用者,當然要用