1. 程式人生 > >bash shell 檔案語法解讀與總結

bash shell 檔案語法解讀與總結

1. bash基本語法

下面看一個簡單的shell檔案(HelloWorld.sh):
        #!/bin/bash
        #This is an example
        echo Hello World
(1)“#!”是說明這個檔案型別的,Linux系統根據“#!”及其後面的字串確定該檔案的型別,/bin/bash表名該檔案是一個bash程式,需要由/bin目錄下的bash程式來解釋執行。
(2)“#”是bash檔案的註釋;echo是回顯命令(標準輸出;Bash程式中絕大部分語句結束時沒有分號。
(3)執行bash程式:sh HelloWorld.sh 或者./HelloWorld.sh(需要有可執行許可權)。

bash shell檔案標頭檔案常見有:
    1 #!/bin/sh
    2 #!/bin/bash
    3 #!/usr/bin/perl
    4 #!/usr/bin/tcl
    5 #!/bin/sed -f
    6 #!/usr/awk -f

2. bash變數

注:bash中的變數是不能含有保留字,不能含有“-”等保留字元,也不能含有空格。
在bash中,變數是不需要提前定義的,一般使用變數的第一條語句是賦初值,若不賦初值,預設為NULL。
例子:
#!/bin/bash
#This is an example
STR=”Hello World”
echo $STR
(1)變數賦值時,“=”號左右兩邊都不能有空格
(2)除了變數賦值和在for語句迴圈頭中,bash*變數*在使用時都需要加“$

”。
(4)Bash程式是在一個新的程序中執行,該程式中的變數命名,賦值和使用不會影響其他程序或者原始shell變數已存在的值(相當於C++中的區域性變數作用域?)
(5)以單引號括起來的變數將不再被解釋為變數,如‘STR{變數名}”,例子中是省略了{}的簡化寫法。
(6)bash變數沒有型別的分別,一個變數可以被定義為字串,也可以再被定為為整數,取決於變數的用途。

  例子(變數的運算):
    #!/bin/bash
    x=1999
    let "x=$x+1"
    echo $x    #輸出2000
x=`expr $x+1` echo $x #輸出2000+1 x="Hello"$x echo $x #輸出Hello2000+1

變數加減:(親測例項)x=$(( $x + 1 ))注意首句路徑格式等要寫對;

(7)在比較操作上,整數變數和字串變數不同:
這裡寫圖片描述
如:
比較字串變數a和b是否相等就寫作:if [a=b]
比較整數變數a和b是否相等寫作:if [aeqb]
(8)除了整數和字串之外,bash變數還可以作為檔案變數操作。bash中沒有浮點數運算。
這裡寫圖片描述
其中,file,file1,和file2代表檔案路徑

3.函式

    function my_funcname {
         code block
    }

(1)左邊的寫法“{” 之前要有空格,否則會有錯誤:syntax error near unexpected token `echo’
(2)函式的引數並不需要在定義時就指定,只需要通過bash保留變數1,2……來引用就可以了。
(3)函式的返回值可以用return語句來制定返回一個特定的整數,如果沒有指定,則返回最後一條語句的執行結果(成功返回0,失敗返回錯誤程式碼)。函式的返回值通過“$?”保留字來獲得。BASH要求返回值必須為一個整數,不能有return語句返回字串變數。
例子:square.sh

    #!/bin/bash
    square(){
    let "res=$1*$1"
    return $res
    }
    square $1 #$1表示第一個實參 5
    result=$?
    echo $result
    exit 0
    執行:sh funtest.sh 5   返回:25

4. 提取檔名和目錄名

參考連結:(http://blog.csdn.net/ljianhui/article/details/43128465)
(1)使用{}並不是專門為提取檔名或目錄名的,它的使用是變數的提取和替換等等操作,它可以提取非常多的內容,並不一定是上面五個例子中的’/’或’.’。也就是說,上面的使用方法只是它使用的一個特例。

    #:表示從左邊算起第一個
    %:表示從右邊算起第一個
    ##:表示從左邊算起最後一個
    %%:表示從右邊算起最後一個
    換句話來說,#總是表示左邊算起,%總是表示右邊算起。

    *:表示要刪除的內容,對於#和##的情況,它位於指定的字元(例子中的'/'和'.')的左邊,表於刪除指定字元及其左邊的內容;對於%%%的情況,它位於指定的字元(例子中的'/'和'.')的右邊,表示刪除指定字元及其右邊的內容。這裡的'*'的位置不能互換,即不能把*號放在#或##的右邊,反之亦然。${var%%x*}表示找出從右邊算起最後一個字元x,並刪除字元x及其右邊的字元。

(2)basename和dirname

示例一
    [root@web ~]# basename /usr/bin/sort 
    sort
    [root@web ~]# dirname /usr/bin/sort 
    /usr/bin
    [root@web ~]#

5.for迴圈

#這是一個基本的迴圈結構. 它與C語言中的for迴圈結構有很大的不同.
    [html] view plain copy
    for arg in [list]  
    do   
        command(s)...   
    done  
    #在迴圈的每次執行中, arg將順序的訪問list中列出的變數.
    for arg in "$var1" "$var2" "$var3" ... "$varN"   

    # 在第1次迴圈中, arg = $var1   
    # 在第2次迴圈中, arg = $var2   
    # 在第3次迴圈中, arg = $var3   
    # 在第N此迴圈中, arg = $varN  
    # 在[list]中的引數加上雙引號是為了阻止單詞分割.

注:list中的引數允許包含萬用字元,如果do和for想在同一行中出現, 那麼在它們之間需要新增一個分號.
for arg in [list] ; do

    #!/bin/bash  
    for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto  
    do  
        echo $planet  
    done  
    echo "---------------------------------------------------"  
    for planet in "Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto"  
    do  
        echo $planet  
    done  
    exit 0  

結果:

    root@ubuntu:~/resource/0510# ./test1   
    Mercury  
    Venus  
    Earth  
    Mars  
    Jupiter  
    Saturn  
    Uranus  
    Neptune  
    Pluto  
    ---------------------------------------------------  
    Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto  
    root@ubuntu:~/resource/0510#   

每個[list]中的元素都可能包含多個引數. 在處理引數組時, 使用set命令來強制解析每個[list]中的元素, 並且將每個解析出來的部分都分配到一個位置引數中.

    #!/bin/bash  
    for planet in "Mercury 36" "Venus 67" "Earth 93"  "Mars 142" "Jupiter 483"  
    do  
        set -- $planet  
        echo "$1        $2,000,000 miles from the sun"  
    done  
    exit 0  

結果:

    root@ubuntu:~/resource/0510# ./test1   
    Mercury     36,000,000 miles from the sun  
    Venus       67,000,000 miles from the sun  
    Earth       93,000,000 miles from the sun  
    Mars        142,000,000 miles from the sun  
    Jupiter     483,000,000 miles from the sun  
    root@ubuntu:~/resource/0510#   

6.cat命令使用

cat主要有三大功能:
1.一次顯示整個檔案。catfilename2. cat > filename
只能建立新檔案,不能編輯已有檔案.
3.將幾個檔案合併為一個檔案: $cat file1 file2 > file
引數:
-n 或 –number 由 1 開始對所有輸出的行數編號
-b 或 –number-nonblank 和 -n 相似,只不過對於空白行不編號
-s 或 –squeeze-blank 當遇到有連續兩行以上的空白行,就代換為一行的空白行
-v 或 –show-nonprinting

    例:
    #把 textfile1 的檔案內容加上行號後輸入 textfile2 這個檔案裡
    cat -n textfile1 > textfile2

    #把 textfile1 和 textfile2 的檔案內容加上行號(空白行不加)之後將內容附加到 textfile3 裡。
    cat -b textfile1 textfile2 >> textfile3

相關推薦

bash shell 檔案語法解讀總結

1. bash基本語法 下面看一個簡單的shell檔案(HelloWorld.sh): #!/bin/bash #This is an example echo Hello World (1)“#!”是

bash shell數值比較(-eq)字符比較(==)的區別

整數比較 ron shell 時間 導致 erro opera 10.10 在線 運維中經常編寫腳本時,如果遇到使用變量間歇取值並和整數進行比較時,大多數人第一時間會想到使用"-eq"進行比較,但事實中如果因特殊原因導致變量取值為空(null)時,bas

XtraBackup全備工作流程解讀總結

備份 XtraBackup 背景 出於對XtraBackup工作原理好奇,做了下面的日誌解讀 工作流程解讀 [root@node1 09:23:35 /root] #time innobackupex --defaults-file=/data/mysql/mysql3306/my3306.cnf -

ORB-SLAM2論文解讀總結

最近閱讀了Raúl Mur-Artal and Juan D. Tardós寫的ORB_SLAM2論文,並做了一些小結ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras本人

bash shell最基本的語法

ssi expr express 一個空格 元素 res 空格 pre file 1 shell語句的基本構成 shell每個基本的構成元素之間都相隔一個空格。 比如[ -e file ],[、-e、file、]這四個基本元素之間都相隔了一個空格。 同樣的道理[ ! -e

bash Shell 總結《二》

ja1. 命令的退出狀態 (1), (kw: EXIT STATUS) 每一個命令都有一個退出狀態,用一個非負的整數表示 狀態碼0 表示命令運行沒有出錯 非零狀態碼表示命令出錯 狀態碼的範圍是0-255 命令的退出狀態常用於流程控制結構中的條件判斷2. 條件表達式 (2), (k

bash Shell 總結《四》 正則表達式

ja正則表達式單個字符表示法字符本身 <-- 除了下面的特殊字符之外,字符可以表示其本身. <-- Any character\d <-- Digit in 0123456789\D <--

bash shell 中時間操作常用方法總結

hour day 當前時間 簡單的 之前 nbsp seconds 獲取 相互   在日常的工作中,bash shell 的時間操作非常頻繁。比如shell腳本定時發送數據統計的時候,會查看當前是否為預定的發送時間。或者使用文件保存一些數據時,一般會生成時間字符串當做文

【OpenPose】1.OpenPoseDemo檔案的使用解讀

OpenPose是基於深度學習的姿勢估計開源框架。     它的原始碼託管在github上:OpenPose的連結     下載、安裝可以參考官方文件,Visual Studio2017、CUDA9的安裝方法可以參考國內某些部落格【OpenPose-W

《Linux命令列shell指令碼程式設計大全》讀書筆記————第三章 基本的bash shell命令

本章內容 1、使用shell 2、bash手冊 3、瀏覽檔案系統 4、檔案和目錄列表 5、管理檔案和目錄 6、檢視檔案內容   3.3 bash手冊 命令: man  xterm  作用:檢視檢視xterm使用者手冊 man命

bash shell關聯陣列總結

 【原創】本博文為原創博文,引用或轉發請註明原始出處和連結:https://www.cnblogs.com/dingbj/p/dict_array.html  什麼是關聯陣列? 關聯陣列相對於索引陣列,又稱字典,這裡我就不給具體定義了,可以百度。 通過對比普通索引陣列,能夠快速理解運

使用Bash Shell檢查檔案是否存在的方法

前言 大家在工作的時候可能經常會遇到這樣的需求,在類Unix系統的Bash環境下,怎樣檢查檔案是否存在呢?既然有需求,當然就有解決的辦法了,Shell中的test命令,可以用來檢測檔案的型別或者比較數值是否相等,該命令也能用來檢查檔案是否存在。 可以用如下的命令來

Linux shell指令碼開頭#!/bin/bash和#!/bin/sh介紹區別

一直以為在Linux shell指令碼中#都是代表著註釋功能,同樣在指令碼開始的#!/bin/sh也只是告訴使用者這是一個shell指令碼,最近查了下,才發現不是這個意思,分享下。 一、意思 #!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面跟的是此解釋此指令碼的she

Linux 下用bash shell正則表示式批量處理檔案的應用例項

程式碼檔案頭有版本資訊,下面一段shell指令碼就是用來收索和更新程式碼頭註釋裡面的斑斑資訊的。 從中可以到shell指令碼中以下幾個小技術點是如何運用的: 1. 利用正則表示式分組匹配指定內容 2. 字串的定位,截斷和拼接處理 3. 指定檔案指定行替換指定內容 #!/bi

shell指令碼常用命令方法總結

工作中shell指令碼,經常用的語法,整理了下 1 echo帶色的 列印字串帶色(31紅色,32綠色,33黃色,34藍色) 列印字串背景帶色 (40黑色,41紅色,42綠色,黃色43,藍色44,白色47) echo -e “\

Bash Shell 備份特定目錄下的txt檔案

d=`date +%Y%m%d`source_dir=/root backup_path=/tmp/ for i in `find  $source_dir  -maxdepth 1 -type f |grep  ".txt$"`    do

Shell_Linux bash shell 逐行讀取檔案的三種方法

方法一,指定換行符讀取: #! /bin/bash     IFS="  "     for LINE in `cat /etc/passwd`  do            echo $LINE d

java web學習心得總結(1)——jsp基本語法

java web自學快三個月了,前面的基礎知識都忘了,以後每天寫一篇部落格總結一下. 或者關注下我的新浪微博:Mr翅膀君 一.page指令 1.language屬性 <%@ page language="java" import="java.util.*" page

Linux Bash Shell 載入檔案

bash shell可分為3種類型: 1 login shell:需要輸入使用者名稱和密碼才能登陸的shell 2 可互動的非login shell:不用登陸,但可以同用戶進行互動的shell,比如在父shell當中執行bash命令產生的子shell 3 不可互動的非login shell:

可執行檔案的裝載程序的一點小總結 《程式設計師的自我修養》·筆記

可執行檔案的裝載與程序小結 程序的虛擬地址空間   每個程式被執行起來之後都擁有自己獨立的虛擬地址空間,這個虛擬地址空間的大小是CPU的位數決定的。比如,32位的硬體平臺決定了虛擬地址空間的地址為