Linux Shell系列教程之(三)Shell變數

来源:http://www.cnblogs.com/waitig/archive/2016/05/25/linux-shell-shell-variable.html
-Advertisement-
Play Games

本文是Linux Shell系列教程的第(三)篇,更多shell教程請看:Linux Shell系列教程 Shell作為一種高級的腳本類語言,也是支持自定義變數的。今天就為大家介紹下Shell中的變數相關知識。 為使Shell編程更有效,系統提供了一些Shell變數。Shell變數可以保存諸如路徑名 ...


本文是Linux Shell系列教程的第(三)篇,更多shell教程請看:Linux Shell系列教程

Shell作為一種高級的腳本類語言,也是支持自定義變數的。今天就為大家介紹下Shell中的變數相關知識。

shell變數

為使Shell編程更有效,系統提供了一些Shell變數。Shell變數可以保存諸如路徑名、文件名或者一個數字這樣的變數名。

Shell將其中任何設置都看做文本字元串。有兩種變數,本地和環境。嚴格地說可以有 4種,但其餘兩種是只讀的,可以認為是特殊變數,它用於向Shell腳本傳遞參數。

定義變數

定義變數時,變數名不加美元符號($),如:

variableName="value"

註意,變數名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:

  • 首個字元必須為字母(a-z,A-Z)。
  • 中間不能有空格,可以使用下劃線(_)。
  • 不能使用標點符號。
  • 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。

變數定義舉例:

myUrl=http://www.linuxdaxue.com

myNum=100

使用變數

使用一個定義過的變數,只要在變數名前面加美元符號($)即可,如:

your_name="linuxdaxue"
echo $your_name
echo ${your_name}

變數名外面的花括弧是可選的,加不加都行,加花括弧是為了幫助解釋器識別變數的邊界,比如下麵這種情況:

for skill in Ada Coffe Action Java 
do
    echo "I am good at ${skill}Script"
done

如果不給skill變數加花括弧,寫成echo “I am good at $skillScript”,解釋器就會把$skillScript當成一個變數(其值為空),代碼執行結果就不是我們期望的樣子了。
推薦給所有變數加上花括弧,這是個好的編程習慣。

重新定義變數

已定義的變數,可以被重新定義,如:

myUrl="http://www.linuxdaxue.com"
echo ${myUrl}
myUrl="http://www.linuxdaxue.com"
echo ${myUrl}

這樣寫是合法的,但註意,第二次賦值的時候不能寫 $myUrl=”http://www.linuxdaxue.com“,使用變數的時候才加美元符($)。

只讀變數

使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
下麵的例子嘗試更改只讀變數,結果報錯:

#!/bin/bash
myUrl="http://www.linuxdaxue.com"
readonly myUrl
myUrl="http://www.linuxdaxue.com"

運行腳本,結果如下:

/bin/sh: NAME: This variable is read only.

刪除變數

使用 unset 命令可以刪除變數。語法:

unset variable_name

變數被刪除後不能再次使用;unset 命令不能刪除只讀變數。
舉個例子:

#!/bin/sh
myUrl="http://www.linuxdaxue.com"
unset myUrl
echo $myUrl

上面的腳本沒有任何輸出。

顯示所有本地shell變數

使用set命令顯示所有本地定義的Shell變數。

image

變數類型

運行shell時,會同時存在三種變數:

1) 局部變數

局部變數在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程式不能訪問局部變數。

2) 環境變數

所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常運行。必要的時候shell腳本也可以定義環境變數。

3) shell特殊變數

shell變數是由shell程式設置的特殊變數。shell變數中有一部分是環境變數,有一部分是局部變數,這些變數保證了shell的正常運行。下麵就介紹下shell中的特殊變數。

Shell特殊變數

Shell 中的特殊變數主要有以下幾個:

$0, $#, $*, $@, $?, $$

下麵會分別介紹下這幾個變數和含義和使用方法。

名稱 含義
$0 當前腳本的文件名
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的所有參數。
$@ 傳遞給腳本或函數的所有參數。被雙引號(” “)包含時,與 $* 稍有不同,下麵將會單獨講到。
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前進程的ID。對於 Shell 腳本,就是這些腳本所在的進程ID
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2

命令行參數

運行腳本時傳遞給腳本的參數稱為命令行參數。命令行參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。

而$0代表當前腳本的文件名。

通過下麵的例子看下這幾個參數的區別:

#!/bin/bash
echo "文件名: $0"
echo "第一個參數 : $1"
echo "第二個參數 : $2"
echo "所有參數: $@"
echo "所有參數: $*"
echo "參數個數: $#"

通過

./test.sh LinuxDaxue .com 執行

執行結果:

文件名:./test.sh
第一個參數:LinuxDaxue
第二個參數:.com
所有參數:LinuxDaxue.com
所有參數:LinuxDaxue.com
參數個數:2

$* 和 $@ 的區別

$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(” “)包含時,都以”$1” “$2” … “$n” 的形式輸出所有參數。

但是當它們被雙引號(” “)包含時,”$*” 會將所有的參數作為一個整體,以”$1 $2 … $n”的形式輸出所有參數;”$@” 會將各個參數分開,以”$1″ “$2” … “$n” 的形式輸出所有參數。

$?獲取退出狀態

$? 可以獲取上一個命令的退出狀態。

所謂退出狀態,就是上一個命令執行後的返回結果。

退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。

不過,也有一些命令返回其他值,表示不同類型的錯誤。

 

更多shell教程請看:Linux Shell系列教程


本文固定鏈接:linux大學網--Linux Shell系列教程之(三)Shell變數
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Sqlserver2008誤操作數據(delete或者update)後恢複數據(轉) 實際工作中,有時會直接在資料庫中操作數據,比如對數據進行delete或者update操作,當進行這些操作的時候,如果沒有加上 where條件或者where條件不合理,那麼導致的結果可想而知,如果操作的又是線上資料庫 ...
  • 資料庫管理系統(DBMS)由一個互相關聯的數據的集合和一組用以訪問這些數據的程式組成。這個數據集合通常稱作資料庫,其中包含了關於某個企業的信息。 DBMS的主要目標是要提供一種可以方便、高效地存取資料庫信息的途徑。 1.1 數據視圖 1.1.1 數據抽象 一個可用的系統必須能高效地檢索數據。這種高效 ...
  • 源表結構: pcgid string mobilegid string value double 測試數據如下: p1 m1 0.6p1 m2 0.9p2 m1 1.0 需要的結果是: p1 {"m2":"0.9","m1":"0.6"} 2 p2 {"m1":"1.0"} 1 就是對源表進行gro ...
  • 環境: mysql:mysql-5.1.65 centos:centos 6.5 編譯命令: gcc -o chinesetopinyin chinesetopinyin.c -L/usr/lib/mysql -lmysqlclient -I/usr/include/mysql 源代碼: 資料庫漢字 ...
  • mysql修改表欄位類型語法 alter table 表名 modify column 欄位名 類型; ...
  • Mysql 表分區操作及相關操作 將ID設為自增長ID alter table pw_trade_record_temp change ID ID int(4) auto_increment; 分區欄位必需為主鍵,修改主鍵 ALTER TABLE `pw_trade_record` DROP PRI ...
  • 我們把表中的每一行叫做一個“記錄”,每一個記錄包含這行中的所有信息,就像在通訊錄資料庫中某個人全部的信息,但記錄在資料庫中並沒有專門的記錄名,常常用它所在的行數表示這是第幾個記錄。在資料庫中存放在表行列交叉處的數據叫做“值”,它是資料庫中最基本的存儲單元,它的位置要由這個表中的記錄和欄位來定義。 ...
  • 1、資料庫的4個基本概念: 數據(data) 資料庫(DB) 資料庫管理系統(DBMS) 資料庫系統(DBS) 2、數據模型 對現實世界數據特征的抽象,是用來描述數據、組織數據和對數據進行操作的。 數據模型是資料庫系統的核心和基礎。 數據模型通常由數據結構、數據操作、和數據的完整性約束條件三部分組成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...