linux下執行.sh文件的方法 .sh文件就是文本文件,如果要執行,需要使用chmod a+x xxx.sh來給可執行權限。 是bash腳本么 可以用touch test.sh #創建test.sh文件 vi test.sh #編輯test.sh文件 加入內容 #!/bin/bash mkdir test 保存退出。 chmod a+x test.sh #給test.sh可執行權限 如test,sh文件在 /home/work文件下 執行 方法一 本身目錄下運行 進入 cd /home/workwen文件下 執行 ./test.sh 命令會在當前目錄下創建一個“test”目錄。 方法二 絕對路勁運行 執行 /home/work/test.sh 方法三 本身目錄下運行 sh test.sh 最后建議:使用 C代碼 1.man sh man sh 來看看sh 的介紹~ Linux.sh語法 介紹: 1 開頭 程序必須以下面的行開始(必須方在文件的第一行): #!/bin/sh 符號#!用來告訴系統它后面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。 當編寫腳本完成時,如果要執行該腳本,還必須使其可執行。 要使編寫腳本可執行: 編譯 chmod +x filename 這樣才能用./filename 來運行 2 注釋 在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。我們真誠地建議您在程序中使用注釋。 如果您使用了注釋,那么即使相當長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的作用及工作原理。 3 變量 在其他編程語言中您必須使用變量。在shell編程中,所有的變量都由字符串組成,並且您不需要對變量進行聲明。要賦值給一個變量,您可以這樣寫: #!/bin/sh #對變量賦值: a=”hello world” # 現在打印變量a的內容: echo “A is:” echo $a 有時候變量名很容易與其他文字混淆,比如: num=2 echo “this is the $numnd” 這並不會打印出”this is the 2nd”,而僅僅打印”this is the “,因為shell會去搜索變量numnd的值,但是這個變量時沒有值的。可以使用花括號來告訴shell我們要打印的是num變量: num=2 echo “this is the ${num}nd” 這將打印: this is the 2nd 4 環境變量 由export關鍵字處理過的變量叫做環境變量。我們不對環境變量進行討論,因為通常情況下僅僅在登錄腳本中使用環境變量。 5 Shell命令和流程控制 在shell腳本中可以使用三類命令: 1)Unix 命令: 雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。 常用命令語法及功能 echo “some text”: 將文字內容打印在屏幕上 ls: 文件列表 wc –l filewc -w filewc -c file: 計算文件行數計算文件中的單詞數計算文件中的字符數 cp sourcefile destfile: 文件拷貝 mv oldname newname : 重命名文件或移動文件 rm file: 刪除文件 grep ‘pattern’ file: 在文件內搜索字符串比如:grep ’searchstring’ file.txt cut -b colnum file: 指定欲顯示的文件內容范圍,並將它們輸出到標准輸出設備比如:輸出每行第5個到第9個字符cut -b5-9 file.txt千萬不要和cat命令混淆, 這是兩個完全不同的命令 cat file.txt: 輸出文件內容到標准輸出設備(屏幕)上 file somefile: 得到文件類型 read var: 提示用戶輸入,並將輸入賦值給變量 sort file.txt: 對file.txt文件中的行進行排序 uniq: 刪除文本文件中出現的行列比如: sort file.txt | uniq expr: 進行數學運算Example: add 2 and 3expr 2 “+” 3 find: 搜索文件比如:根據文件名搜索find . -name filename -print tee: 將數據輸出到標准輸出設備(屏幕) 和文件比如:somecommand | tee outfile basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux dirname file: 返回文件所在路徑比如:dirname /bin/tux將返回 /bin head file: 打印文本文件開頭幾行 tail file : 打印文本文件末尾幾行 sed: Sed是一個基本的查找替換程序。可以從標准輸入(比如命令管道)讀入文本,並將 結果輸出到標准輸出(屏幕)。該命令采用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus替換為 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.fileawk: awk 用來從文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。 catfile.txt | awk -F, ‘{print $1 “,” $3}’這里我們使用,作為字段分割符,同時打印第一個和第三個字段。如果該文件內容如下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令輸出結果為:Adam Bor, IndiaKerry Miller, USA 2) 概念: 管道, 重定向和 backtick 這些不是系統命令,但是他們真的很重要。 管道 (|) 將一個命令的輸出作為另外一個命令的輸入。 grep “hello” file.txt | wc -l 在file.txt中搜索包含有”hello”的行並計算其行數。 在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。 重定向:將命令的結果輸出到文件,而不是標准輸出(屏幕)。 > 寫入文件並覆蓋舊文件 >> 加到文件的尾部,保留舊文件內容。 反短斜線 使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數。 命令: find . -mtime -1 -type f -print 用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下linux 腳本: #!/bin/sh # The ticks are backticks (`) not normal quotes (‘): tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print` 3) 流程控制 1.if “if” 表達式 如果條件為真則執行then后面的部分: if ….; then …. elif ….; then …. else …. fi 大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字符串、判斷文件是否存在及是否可讀等等… 通常用” [ ] “來表示條件測試。注意這里的空格很重要。要確保方括號的空格。 [ -f "somefile" ] :判斷是否是一個文件 [ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行權限 [ -n "$var" ] :判斷$var變量是否有值 [ "$a" = "$b" ] :判斷$a和$b是否相等 執行man test可以查看所有測試表達式可以比較和判斷的類型。 直接執行以下腳本: #!/bin/sh if [ "$SHELL" = "/bin/bash" ]; then echo “your login shell is the bash (bourne again shell)” else echo “your login shell is not bash but $SHELL” fi 變量$SHELL包含了登錄shell的名稱,我們和/bin/bash進行了比較。 快捷操作符 熟悉C語言的朋友可能會很喜歡下面的表達式: [ -f "/etc/shadow" ] && echo “This computer uses shadow passwors” 這里 && 就是一個快捷操作符,如果左邊的表達式為真則執行右邊的語句。 您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在則打印” This computer uses shadow passwors”。同樣或操作(||)在shell編程中也是可用的。這里有個例子: #!/bin/sh mailfolder=/var/spool/mail/james [ -r "$mailfolder" ]‘ ‘{ echo “Can not read $mailfolder” ; exit 1; } echo “$mailfolder has mail from:” grep “^From ” $mailfolder 該腳本首先判斷mailfolder是否可讀。如果可讀則打印該文件中的”From” 一行。如果不可讀則或操作生效,打印錯誤信息后腳本退出。這里有個問題,那就是我們必須有兩個命令: ◆打印錯誤信息 ◆退出程序 我們使用花括號以匿名函數的形式將兩個命令放到一起作為一個命令使用。一般函數將在下文提及。 不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。