1. 程式人生 > >Linux Shell指令碼攻略—不止小試牛刀1(簡介、終端列印)

Linux Shell指令碼攻略—不止小試牛刀1(簡介、終端列印)

Bash 和 Dash 的問題

  • Debian和Ubuntu中,/bin/sh預設已經指向dash,它主要是為了執行指令碼而出現,而不是互動,原因是dash更快、更高效,但功能相比bash要少很多,語法嚴格遵守POSIX標準。

  • 從Ubuntu 6.10開始,預設使用dash(theDebian Almquist Shell)而不是bash(the GNUBourne-Again Shell),但Login Shell還是bash。Ubuntu在啟動的時候會執行很多shell指令碼,使用dash可以加快啟動速度。

  • bash和dash相容性問題:在需要bash的指令碼的第一行寫上”#!/bin/bash” 。在Makefile中可以設定SHELL = /bin/bash。

  • 預設sh切換(dash切換bash為例)

    • sudo dpkg-reconfigure dash (bash選擇NO)
    • sudo ln -fs /bin/bash /bin/sh

login 與 non-login shell

1. login shell

  • 在某使用者由/bin/login登陸進系統後啟動的shell,跟這個使用者繫結。這個shell是使用者登陸後啟動的第一個程序。login程序在啟動shell時傳遞第0個引數指明shell的名字,該引數第一個字元為”-“,指明這是一個login shell。比方對bash而言,啟動引數為”-bash”。

  • 當bash以login shell啟動時,它會執行/etc/profile中的命令,然後/etc/profile呼叫/etc/profile.d資料夾下的全部指令碼。然後執行~/.bash_profile。~/.bash_profile呼叫~/.bashrc,最後~/.bashrc又呼叫/etc/bashrc。

2. non-login shell

  • 不需login而由某些程式啟動的shell。

  • 傳遞給shell的引數,是沒有“-”字首的。還以Bash為例。當以非login方式啟動時,它會呼叫~/.bashrc,隨後~/.bashrc中呼叫/etc/bashrc,最後/etc/bashrc呼叫全部/etc/profile.d資料夾下的指令碼。

3. 識別shell是否為login shell

  • 在該shell下執行echo $0。假設輸出為該shell名字,加上一個“-”字首,則說明該shell為login shell,比如-bash,-su等。

  • SecureCRT中SSH登陸:login shell。

mrhjlong@hjl-virtual-machine:~$ echo $0
-bash
  • Ubuntu系統下開啟Terminal:non-login shell。
mrhjlong@hjl-virtual-machine:~$ echo $0
bash

一. 簡介

shell指令碼通常是一個以shebang起始的文字檔案,如下所示: #!/bin/bash。
/bin/bash是Bash的直譯器命令路徑。

1. 兩種執行指令碼的方式

  • 將指令碼作為bash的命令列引數,就用不著指令碼中的shebang了。
$ bash script.sh #假設指令碼位於當前目錄下
  • 利用shebang來實現指令碼的獨立執行。對此必須設定指令碼的可執行許可權,這樣它就可以使用位於#!之後的直譯器路徑來運行了。核心會讀取指令碼的首行並注意到shebang為#!/bin/bash,它識別出/bin/bash並在內部像這樣執行該指令碼:$ /bin/bash script.sh。
$ chmod a+x script.sh
$ ./script.sh
$ /bin/bash script.sh

2. shell相關檔案

  • 當啟動shell時,開始會執行一組命令來定義諸如提示文字、顏色等各類設定,這組命令來自位於使用者主目錄中的指令碼檔案~/.bashrc(對於登入shell則是~/.bash_profile)。

  • Bash還維護了一個歷史記錄檔案~/.bash_history,用於儲存使用者執行過的命令。

注:~表示主目錄,它通常是/home/user,其中user是使用者名稱,如果是root使用者,則為/root。

3. 命令分隔

每個命令或是命令序列是通過使用分號或換行符來分隔的。

$ cmd1; cmd2
#等同於
$ cmd1
$ cmd2

二. 終端列印

1. echo命令

終端列印的基本命令。

引號之間的區別

  • 單引號:所見即所得,即將單引號內的內容原樣輸出,剝奪其中的所有字元的特殊含義。
  • 雙引號:雙引號會解釋特殊字元的含義,這些特殊字元有: 美元符$,反斜槓\,反引號`,感嘆號!。
  • 反引號:兩個反引號包圍起來的字串,將作為命令來執行。
    命令替換是指shell能夠將一個命令的標準輸出插在一個命令列中任何位置。shell中有兩種方法作命令替換:把shell命令用反引號或者$(…)結構括起來。根據POSIX規範,要求系統工程師採用的是$(…)的形式。
  • 不帶引號:沒法顯示命令界定符,如分號(;),多個空格。
    不會將含有空格的字串視為一個整體輸,,如果內容中有命令、變數等,會先把變數、命令解析出結果,然後在輸出最終內容來,如果字串中帶有空格等特殊字元,則不能完整的輸出。
[email protected]:bashTest$ cat symbol.sh 
#!/bin/bash
a="1 2   3 4"
echo $a
echo "$a"
[email protected]:bashTest$ ./symbol.sh 
1 2 3 4
1 2   3 4
[email protected]-virtual-machine:~$ echo '$HOME'
$HOME
[email protected]-virtual-machine:~$ echo "$HOME"
/home/mrhjlong
[email protected]-virtual-machine:~$ echo -e "\$HOME"
$HOME
[email protected]-virtual-machine:bashTest$ echo `date`
20180319日 星期一 00:36:45 CST
[email protected]-virtual-machine:bashTest$ echo "$(date)"
20180319日 星期一 00:36:59 CST

echo中轉義字元

  • 在預設情況下,echo在每次呼叫後會新增一個換行符,可以使用選項-n來忽略結尾的換行符。
  • echo同樣接受雙引號字串內的轉義序列作為引數:echo –e “包含轉義序列的字串”。
[email protected]-virtual-machine:bashTest$ echo -e "1\t2\t3"
1       2       3

列印彩色輸出
每種顏色都有對應的顏色碼。

  • 字型顏色:重置=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,洋紅=35,青色=36,白色=37。
[email protected]-virtual-machine:bashTest$ echo -e "\e[1;31m This is red text \e[0m"
 This is red text 
  • 背景顏色:重置=0,黑色=40,紅色=41,綠色=42,黃色=43,藍色=44,洋紅=45,青色=46,白色=47。
[email protected]-virtual-machine:bashTest$ echo -e "\e[1;42m Green Background \e[0m"
 Green Background 

2. printf命令

printf使用的引數和C語言中的printf函式一樣。

  • 在預設情況下,printf並不像echo命令一樣會自動新增換行符,我們必須在需要的時候手動新增\n

  • printf使用引用文字或由空格分隔的引數。我們可以在printf中使用格式化字串,還可以指定字串的寬度、左右對齊方式等。

[email protected]:bashTest$ cat printf.sh 
#!/bin/bash
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
[email protected]:bashTest$ ./printf.sh 
No    Name       Mark
1     Sarath     80.35
2     James      91.00
3     Jeff       77.56

3. 注意

使用echo和printf的命令選項時,要確保選項應該出現在命令列內所有字串之前,否則Bash會將其視為另外一個字串。

相關推薦

Linux Shell指令碼不止小試牛刀1簡介終端列印

Bash 和 Dash 的問題 Debian和Ubuntu中,/bin/sh預設已經指向dash,它主要是為了執行指令碼而出現,而不是互動,原因是dash更快、更高效,但功能相比bash要少很多,語法嚴格遵守POSIX標準。 從Ubuntu 6.10開始,預

Linux Shell指令碼(1.4)

1.4 使用函式新增環境變數 1.4.1 簡介 環境變數通常用於儲存路徑列表,這些路徑用於搜尋可執行檔案、庫檔案等。例如:$PATH、$LD_LIBRARY_PATH,它們通常看起來像這樣: PATH=/usr/bin;bin LD_LIBRAR

linux shell指令碼03-陣列與關聯陣列

定義陣列 ①單行中使用一列值來定義一個索引 array_var=(1 2 3 4 5 6),這些值會被儲存在以0為起始索引的連續位置上 ②還可以將陣列定義成一組“索引-值” array_var[0]=

Linux shell指令碼學習

1.陣列有關: (1)定義陣列,列印陣列 這些值將會儲存在以0為起始索引的連續位置上。 #!/bin/bash array_var=(1 2 3 4 5 6) array_y[0]="test1" array_y[1]="test2" array_y[2]="test3" array_y

Linux Shell指令碼之一】find命令:檔案查詢和檔案列表

find是Unix/Linux命令列工具中最棒的工具之一。該命令對於編寫shell指令碼所起到的功能不可小視,但是多數人卻午飯最大程度發揮它的功效,下面介紹find一些常見的用法。 1.基本用法:

linux shell指令碼 學習筆記3 -- 第三章 以檔案之名

第三章主要跟檔案的處理相關,小結各節內容如下: 1,簡介 概念:Unix將系統中的一切都視為檔案;如普通檔案、目錄、終端、符號連結、命名管道等等,都是一種檔案; 2, 生成測試用的檔案 1)某些時候,需要製作一些測試用的檔案,我們不用單獨寫程式去生成,可以直接採用現有的

SHELL指令碼學習筆記--1.3 多命令邏輯執行順序

每條命令後如果不加&的話就是依次一行一行的順序執行,只有前面一行執行完成後再執行下一行,事實上還有很多特殊符號可用來分隔單個的命令:分號(;)、管道(|)、&、邏輯AND (&&),還有邏輯OR (||)。對於每一個讀取的管道,Shell都回

Linux shell指令碼啟動 停止 重啟服務jar

 注意:window編輯的shell檔案,通過WinSCP上傳的Linux伺服器,需要改變檔案的格式(檢視檔案格式,vim編輯後輸入 :set ff) #!/bin/bash export JAVA_

Linux軟件包安裝和卸載rpmyum工具

linuxrpm工具rpm是由紅帽等工作。但是rpm軟件包之間的依賴性問題往往會很繁瑣,尤其是軟件由多個rpm包組成時。公司開發的軟件包管理方式,使用rpm我們可以方便的進行軟件的安裝、查詢、卸載、升級rpm包:RPM包的一般格式為:name-version-arch.rpmname-version-arch

Linux-Shell指令碼程式設計基礎1

1. 我們一般在使用Linux系統的時候,都活接觸到shell指令碼的使用,例如我們經常在linux系統中使用的ls命令、cd命令等,都是衣蛾簡單而又基本的shell命令,在 linux系統中我們一般的使用如下的格式來進行shell指令碼的編寫: (1)格式 #!bin/bash e

linux shell 指令碼1】 ---- echo 與 printf 用法

終端列印的常用命令有 echo 和 printf 兩種。 先說基本用法: echo: 1. echo Hello Word ! 命令列輸出:Hello Word ! 2. echo 'Hello Word !' 命令列輸出:Hello Word ! 3. echo

Linux 指令碼基礎知識點

本 Chat 將展示如何操作 Linux 系統,以實際案例介紹如何利用 Shell 命令實現 Linux 的溝通。描述瞭如何執行檔案類查詢常見的任務,解釋了複雜的系統管理工作。例如系統如何監控,優化等。 包括:如何利用 Shell 命令快速解決,任務自動化的執行,建立維護檔案和資料夾,進行壓縮和加

Linux指令碼學習筆記(一)

前言 繼學習Oracle高階程式設計後,在Linux環境下安裝Mysql時,徹底認識到Linux的欠缺。我們都知道Linux在伺服器領域一直處於領先地位,這很大程度要歸功於它的穩定性,安全性及其較低的總擁有成本(TCO)。經過一個為老師的推薦選擇了《Linux

Linux指令碼學習筆記之tpu stty以及

tput(terminal output )和stty是兩款終端處理工具。 一、tput 1.1、獲取行數和列數 tput cols tput lines 1.2、列印當前終端名 tput long

Linux_Shell指令碼學習筆記21.6-1.15

1.6 1)陣列的類別: a.普通陣列,索引是數字,從0開始,但是特別的是,索引可以不連續 b.關聯陣列,索引是字串 shell 中的陣列更像是key-value的感覺,就算是普通陣列,也沒有必須連續。用起來還是很方便。 2)定義陣列的方法: a.普通陣列: arr=(1 3

Linux_Shell指令碼學習筆記11.1-1.5

1.1 1)shell指令碼的兩種執行方式: a.直接輸入地址+指令碼名,如當前目錄的./test.shell或者~/Documets/test.shell 這種方式必須在指令碼頭指定直譯器,即#!/bin/bash b.不需要指定直譯器,使用/bin/bash ~/Documents/

Linux指令碼學習筆記之臨時檔案命名與隨機數

最適合儲存臨時資料的位置是 /tmp(該目錄中的內容在系統重啟後會被清空) mktemp 命令的用法非常簡單。它生成一個臨時檔案並返回其檔名(如果建立的是目錄,則返回目錄名)。如果提供了定製模板, X

linux shell 中的 2>&1 用法說明

pass 重定向 分解 說明 分別是 理解 重新 這樣的 通用 linux中有三種標準輸入輸出,分別是 STDIN,STDOUT,STDERR,對應的數字是 0,1,2。 STDIN 是標準輸入,默認從鍵盤讀取信息; STDOUT 是標準輸出,默認將輸出結果輸出至終端,也

學習Linux shell指令碼中連線字串的方法

這篇文章主要介紹了Linux shell指令碼中連線字串的方法,如果想要在變數後面新增一個字元,可以用一下方法: 程式碼如下: $value1=home $value2=${value1}"=" echo $value2 把要新增的字串變數新增{},並且需要把$放到外面。 這樣輸出的結果

Linux Shell指令碼獲取當前路徑

shell指令碼獲取當前路徑 #方法一 #!/usr/bin/env bash Cur_Dir=$(pwd) echo $Cur_Dir #方法二 #!/usr/bin/env bash basedir=cd $(dirname $0); pwd