1. 程式人生 > >shell程式設計(一)

shell程式設計(一)

2.4 管道和重定向
2.4.1 重定向
檔案描述符    重定向       描述
     0           <         標準輸入
     1           >         標準輸入
     2           >         標準錯誤輸出
                 >>        追加
                2>&1       標準輸出和錯誤輸出到同一個檔案中
特別的,可以用/dev/null來有效的丟棄所有的輸出資訊
 ..... >/dev/null 2>&1

 顯示命令 > 檔案
 more/less < 檔案

2.4.2 管道:連線程序,使得連線的程序可以同時執行

 ps -xo comm|sort|uniq|grep -v sh|more
“|”後面的輸入是其前面的輸出
使得資料流在他們之間可以自動的進行協調。
$ cat mydate.c
dfdfkj
afljir
clkjfoi

$cat mydate.c |sort
afljir
clkjfoi
dfdfkj
可見sort不僅可以給目錄呀,檔案呀排序,還可以在在一個檔案內給行排序,但是不能夠在行內排序

$ cat mydate.c |sort|>mydate.c
顯示的是空白,原因是你在讀取mydate.c之前就已經覆蓋了這個檔案的內容,因此不能在管道中出現
輸出的檔案是在這一組命令被船艦的同時立刻被建立活寫入。

2.5 shell
shell 指令碼有兩種方式:輸入一系列命令讓shell互動執行,如上;將命令儲存到一個檔案中,將該檔案作為一個程式來呼叫

萬用字元
*                   任意字串
?                   單個字串
[abc...]        匹配方括號內任意一個單字元
[^abc..]        匹配除了方括號內任意一個單字元
{ab,dcd,...}   允許任意的字串分組在一個集合中
如 my{ma,fa}se  值得就是 mymase myfase

2.5.1 互動式程式
直接在shell中輸入命令,不過沒法儲存,沒有重用性


2.5.2指令碼
1 建立

# :註釋符
#!/bin/sh :告訴系統後面的引數/bin/sh是用來執行本檔案的程式
exit:確保程式返回一個有意義的退出碼,當從另一個指令碼程式裡呼叫這個指令碼並檢視是否執行成功,退出碼就很重要。
$ file first :用於檢查檔案型別
first: POSIX shell script text executable

2.5.3 執行
a. /bin/sh 指令碼名
b. chmod +x 指令碼名
    指令碼名
    或者是 ./指令碼名 把指令碼程式的完整的相對路徑且能夠保證不會意外執行系統中於你的指令碼檔案通明的另一個命令。
如果此時告訴你沒有找到該命令,是因為shell的PATH中沒有被設定為當前目錄下查詢執行的命令。
方法一:在命令列上 PATH=¥PATH:.
方法二:將 指令碼名 新增到 .bash_profile中,退出後重新登入


3.6 SHELL 語法

2.6.1 變數
使用變數前不需要宣告。預設以字串看待和儲存的。
在變數名前加 $ 訪問起內容。但為其賦值時,只需要變數名

1 使用引號
ke=ma ld
ld: no input files
對於有空格的必須用引號
$ke="ma  ld"
$ echo $ke
ma ld
 
$ read ke       等待輸入
dkf klfdj kle   輸入
$ echo $ke
dkf klfdj kle   原文輸出

#!/bin/sh
myvar="Hi there"
echo $myvar                                // Hi there
echo "$myvar"                              // Hi there
echo "myvar"                               // myvar
echo '$myvar'                              // $myvar
echo 'myvar'                               // myvar
echo /$myvar                               // $myvar
echo /myvar                                // myvar
echo Enter some text                       // Enter some text
read myvar                                 // 等待輸入
                                                         //  輸入 HOW DO YOU DO
echo '$myvar' now equals $myvar            // $myvar now equals HOW DO YOU DO
exit 0

從上面的實驗可以知道:
1 對於變數的引用 使用 “”和不使用是一樣的
2 在“”中沒有 $ 的變數 只是字串而已
3 ‘’的作用就是輸出其中的字串
4 / 的作用和 ‘’相同

2 環境變數
$HOME     當前使用者的主目錄
$PATH     以冒號分割的用來搜尋命令的目錄列表
$PS1      命令提示符
$IFS      輸入域分割符,空格、TAB,ENTER
$0        shell指令碼的名字
$#           傳遞給指令碼的引數個數
$$        shell指令碼的程序號

3 引數變數

$1,$2,...        指令碼程式的引數
$*               在一個變數中列出所有的引數,引數間用IFS中的第一個字元分割開

[email protected]               與 $*意同,不使用IFS

$ IFS=''
$ set foo bar bam
$ echo [email protected]
foo bar bam
$ echo "[email protected]"
foo bar bam
$ echo $*
foo bar bam
$ echo "$*"
foobarbam


$ unset IFS
$ echo $IFS

$ echo "$*"
foo bar bam

如果想訪問指令碼程式的引數,用 [email protected] 最好


sa="Hello"                                  //
echo $sa                                    //Hello
echo "The program $0 is now running"        // biangliang    shell指令碼的名字  
echo "The second parameter was $2"          // bar
echo "The first parameter was $1"           // foo
echo "The parameter list was $*"            //foo bar baz
echo "The script is now complete"

$ /bin/sh bianliang foo bar baz

2.6.2 條件
shell指令碼對任何從命令列上被呼叫的命令的退出碼進行測試。
test / [ 布林判斷命令 且" ["用“]”來結尾


if [ -f /bin/bash ]    //注意保持距離
then
echo "file /bin/bash exists"
fi

if [ -d /bin/bash ]
then
echo "/bin/bash is a directory"
else
echo "/bin/bash is NOT a directory"
fi

執行結果為:
$ /bin/sh panduan
file /bin/bash exists
/bin/bash is NOT a directory

2.6.3 控制結構

echo "Please answer yes or no : Is it morning?"  //shell用echo -e,bash用echo -n來去除換行符
read timeofday

if [ $timeofday = "yes" ]          //一定要保持距離  if[ $timeofday 不行 ; if [ $timeofday="yes"也不行
then
echo "Good morning"
elif [ $timeofday = "no" ]    //[ 對timeofday的內容進行測試,測試結果由if判斷
then
echo "Good afternoon"
else
echo "Sorry,$timeofday is not recognized.Enter yes or no!"
exit 1
fi
exit 0

看似完美的程式,其實隱患重重,在不輸入任何資料,直接ENTER後
[: 15: yes: unexpected operator
[: 15: no: unexpected operator
Sorry, is not recognized.Enter yes or no!
問題出在 當直接ENTER後,$timeofday 成為 空字串
因此將 $timeofday 改為"$timeofday"

4 for 語句
for 迴圈經常與shell的檔名擴充套件一起使用
for variable in values_table
do
...$variable
done

for 迴圈經常與shell的檔名擴充套件一起使用
for file in *.sh

還有就是
for foo in 10
echo "here wo go"
這樣能執行一次
for foo in 1 2 3 4 5 6 7 8 9 10
echo "here wo go"
卻可以執行10次

for foo in 1 2 3 5 8 9 41 10 1 0
echo "here wo go"
依然是執行10次

參考:Linux 程式設計(v3)

相關推薦

Shell程式設計 Shell變數

Shell 變數 一、定義變數 定義變數時,變數名不加美元符號($,PHP語言中變數需要),如: output="shell variable" 注意,變數名和等號之間不能有空格,這可能和你熟悉的所有程式語言都不一樣。同時,變數名的命名須遵循如下規則: 1.命名只能使用英文字母,數字和下

shell程式設計()

2.4 管道和重定向 2.4.1 重定向 檔案描述符    重定向       描述      0           <         標準輸入      1           >         標準輸入      2           >    

Shell程式設計入門:傳遞引數

我們可以在執行 Shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$n 。n 代表一個數字,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推…… 例項 我們向指令碼傳遞三個引數,並分別輸出。其中 $0 表示執行的檔名: #! /bin/ba

Linux學習之shell 程式設計基礎(

一、linux中經常和正則表示式聯合使用的工具 grep sed awk(自己去研究吧). 二,以grep為例,有以下正則操作 特殊符號彙總 特殊符號 代表意義 [:alnum:] 代表英文

shell程式設計其實真的很簡單(

如今,不會Linux的程式設計師都不意思說自己是程式設計師,而不會shell程式設計就不能說自己會Linux。說起來似乎shell程式設計很屌啊,然而不用擔心,其實shell程式設計真的很簡單。 背景 什麼是shell程式設計 高大上的解釋,往往讓人摸不住頭腦。一句話概括就是:shell

linux學習筆記之shell程式設計

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則

linux學習筆記之shell程式設計)正則表示式與字元處理

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*

shell程式設計學習筆記(

導讀 注意,這篇部落格是記錄博主學習的筆記,撰寫風格可能不適合沒有程式設計基礎的讀者。 變數 定義 不需要宣告型別,只需要加賦值號(=) 輸入 輸出 name=’hemim’ echo $name hemim 只能以數字和下劃線開頭,如:

Shell程式設計--windows下的shell開發執行工具

工欲善其事,必先利其器;對於shell指令碼使用vim在linux開發可能效率比較底下,而且大多都是windows開發,當然能夠在windows下執行更好。1、開發工具:subli text 3 1)安裝外掛ShellScriptImproved,用於語法提示以及關鍵字高亮

Shell程式設計學習筆記(變數、運算子)

1.Shell是什麼 Shell 是一個命令列直譯器,它為使用者提供了一個向 Linux 核心傳送請求以便執行程式的介面系統級程式,使用者可以用 Shell 來啟動、掛起、停止甚至是編寫一些程式。 Shell(殼)可操控 Core(核心) 2.Shell指令碼的執行方式 (1)

文學會shell程式設計

前些天找到了一篇之前儲存在有道雲的shell筆記,感覺覆蓋面很廣,很適合學習或者複習,所以轉移到csdn上來。內容比較長,有興趣的可以邊練習邊看,希望大家一起學習交流。 目錄 快捷操作符 引號  函式 命令列引數 4、例項 除錯 0、基

Linux——實驗Shell程式設計

 [ 實驗目的 ] 理解Shell程式的設計方法;熟悉Shell程式的編輯、執行、除錯方法與過程。 [ 實驗內容 ] 考勤模擬Shell程式設計 用shell設計一個考勤模擬程式,實現如下功能選擇介面: 1.上班簽到 2.下班簽出 3.缺勤資訊查閱 4.

步實現自己的shell程式()---《Unix環境高階程式設計》讀書筆記

引言 用過Unix/Linux系統的人都知道,Unix系統中很多命令和程式都是在終端中執行,這個終端就是shell。不同的Unix都有不同的預設shell程式,包括sh、csh、bash等等不同的shell程式。那麼什麼是shell,shell究竟做了什麼

Linux Shell 程式設計

從程式設計師的角度來看, Shell本身是一種用C語言編寫的程式,從使用者的角度來看,Shell是使用者與Linux作業系統溝通的橋樑。使用者既可以輸入命令執行,又可以利用 Shell指令碼程式設計,完成更加複雜的操作。在Linux GUI日益完善的今天,在系統管理等領域

Jmeter之Bean shell使用()

容器 reads lba art 參考 jmeter .info var result 一、什麽是Bean Shell BeanShell是一種完全符合Java語法規範的腳本語言,並且又擁有自己的一些語法和方法; BeanShell是一種松散類型的腳本語言(這點和JS類似

2017年最新企業面試題之shell

2017年最新企業面試題之shell2017年最新企業面試題之shell(一)**********************************************企業Shell面試題1:批量生成隨機字符文件名案例 ********************************************

linux shell學習

交互 博客 value 定義 設計 int 語言 $2 環境 本博客參考自: http://www.cnblogs.com/waitig/p/5523409.html 《shell從入門到精通》 張春曉編著 Shell簡介 Shell自身是一個用C語言編寫的程序,

shell指令()

文件 史記 語句 記錄 roo 格式 sudo .... 所有 ubuntu桌面窗口下進入shell窗口:Ctrl + Alt + F2~F6; 退出shell窗口:Ctrl + Alt + F7;從UI中進入UI命令窗口,Ctrl + Alt +T shell指令基本

shell

運行 closed a13 縮進 bash 統一 規範 提示 spl 1.寫腳本之前的思路 考慮 腳本統一管理 權限:用戶執行權限 清空錯誤文件 錯誤提示 腳本通用性 2.2 統一腳本目錄 1 mkdir /server/scripts 2 cd /server/scr

每日shell(十)mysql強制自動修改密碼

mysql mysql自動修改密碼 mysql忘記密碼 mysql強制修改密碼 如果不記得mysql的root密碼,那麽就只能強制修改密碼了,使用shell輕松自動修改密碼: #!/bin/bash #Author Aiker PATH=/bin:/sbin:/usr/bin:/usr/sbi