【Linux】shell編程(一) 變數

来源:https://www.cnblogs.com/zihaojun/archive/2023/06/08/17467288.html
-Advertisement-
Play Games

# 【Linux基礎】shell編程(一) 變數 [TOC] ## 什麼是shell編程 簡單的命令可以在命令行中直接輸入,但是複雜的命令需要寫在腳本里。例如一個簡單的shell腳本: ```shell #!/bin/bash #輸出一行 echo "Hello World!" ``` \#開始的行 ...


【Linux基礎】shell編程(一) 變數

目錄

什麼是shell編程

簡單的命令可以在命令行中直接輸入,但是複雜的命令需要寫在腳本里。例如一個簡單的shell腳本:

#!/bin/bash

#輸出一行
echo "Hello World!"

#開始的行是註釋行,空行會被忽略。

如何運行shell腳本

  • 方式一:直接輸入腳本的相對路徑或絕對路徑

    ./run.sh
    
    • 需要給shell腳本添加可執行許可權,否則會報錯:Permission denied
  • 方式二:sh+腳本的相對路徑或絕對路徑

    sh ./run.sh
    
    • 不需要添加可執行許可權

第一行 #!/bin/bash

第一行叫什麼?

WHAT IS THIS LINE CALLED?

This first line (#!/bin/bash or #!/bin/sh) has a name. It is known as ‘she-bang‘(shabang). This derives from the concatenation of the tokens sharp (#) and bang (!). It is also called as sh-bang, hashbang, poundbang or hash-pling. In computing, a she-bang is the character sequence consisting of the characters number sign and exclamation mark (#!) at the beginning of a script.

shabang,由sharp(#)和bang(!)組合而來,必須位於一個腳本的第一行

為什麼要加這個,有什麼用?

In Unix-like Operating Systems when a script starting with a she-bang(#!) is executed as a program, the program loader parses the rest of the script’s initial line as a interpreter-directive. Thus the specified interpreter program is run instead, passing to it as an argument the path that was used initially through the script.

In simple words, the she-bang at the head of the script tells the system that this file is a set of commands to be fed to the command interpreter indicated. Unix-like operating systems has variety of shells and each of script header lines call a different command interpreter.

如果shell看到第一行是shabang,shell就知道這個文件是一個shell腳本,並按照shabang的指引到/bin/bash找到指定的shell解釋器,然後把文件中的命令傳給shell。

解釋器可以是bash,也可以是csh等等。

SOME she-bang EXAMPLES

*#!/bin/sh :Executes the script using the Bourne shell or a compatible shell, with path /bin/sh*

*#!/bin/bash :Executes the script using the Bash shell.*

*#!/bin/csh -f :Executes the script using C shell or a compatible shell.*

*#!/usr/bin/perl -T :Executes the script using perl with the option of taint checks*

*#!/usr/bin/env python :Executes the script using python by looking up the path to the python interpreter automatically from the environment variables*

shell的變數

變數的賦值和使用

#!/bin/bash

#將一個字元串賦給變數A
LOG="monday"
echo "The value of logfile is:"

#美元符號用於變數替換
echo $LOG

運行結果:

$ sh ./variable.sh
The value of logfile is:
monday
  • 變數的賦值:

    • 變數賦值時,等號兩邊都不能打空格
    • 變數名可以由字母、數字和下劃線組成,但是不能以數字開頭
    • 變數名稱一般為大寫(代碼規範,不是語法要求)
  • 變數的使用:

    • 當需要使用變數時,要$對變數進行替換。BASH中,美元符號$用於對一個變數進行解析,shell在碰到$引導的變數時,會自動將其換成這個變數的值。
  • 變數作用範圍

    • 變數只在其所在腳本有效。

    • source可以強行讓一個腳本影響其父環境

      • $ source variable.sh
        The value of logfile is:
        monday
        $ echo $LOG
        monday
        
    • 與之相反,export可以讓腳本影響其子shell環境

      • $ export count=5		 ##輸出變數count
        $ bash				##啟動子shell
        $ echo $count
        5
        $ exit				##回到先前的shell中
        exit
        
    • 使用unset可以註銷變數

      • unset log
        

變數替換

  • $用於解析變數,如果要輸出這個符號,需要使用轉義字元'\'

    • $ LOG='Monday'
      $ echo
      
  • shell提供了花括弧"{}"來限定一個變數的開始和結束。當需要緊跟變數輸出字母尾碼時,必須使用這個功能

    • $ WORD='big'
      $ echo "This apple is ${WORD}ger"
      This apple is bigger
      

位置變數

可以向shell腳本傳命令行參數,shell腳本中使用以數字命名的變數來存放這些參數,稱為位置變數。

  • 簡單地說,第一個位置變數存放在$1,第二個存放在$2,以此類推。當變數數量超過10個時,需要加花括弧把數字括起來。例如${10}${23}等。

  • $0用於存放腳本自己的名字。

!#/bin/bash

echo "\$0 = *$0*"
echo "\$1 = *$1*"
echo "\$2 = *$2*"
echo "\$3 = *$3*"

運行結果:

$ sh ./diaplay_para.sh first second
$0 = *display_para.sh*
$1 = *firsh*
$2 = *second*
$3 = **				##不存在第三個變數,所以為空

除了以數字命名的變數外,shell還提供了另外三個位置變數:

  • $*:包含參數列表
  • $@:包含參數列表,同上
  • $#:包含參數的個數
#!/bin/bash

#顯示有多少個參數需要列出
echo "The number of parameter is $#"

for para in $@
do
	echo $para			##也可以寫成 echo "$para"
done

運行結果:

$ sh ./list_para.sh first second
The number of parameter is 2
first
second

BASH引號規則

shell腳本中可以使用的引號有以下三種:

  • 雙引號:阻止Shell對大多數特殊字元(例如#)進行解釋。但$`"仍然保持其特殊含義
  • 單引號:阻止Shell對所有字元進行解釋
  • 倒引號:`,這個符號通常位於鍵盤Esc鍵的下方。當用倒引號括起一個Shell命令時,命令會被執行,並將執行後的結果作為表達式的值。
#!/bin/bash

LOG=Saturday

echo "Today is $LOG"
echo 'Today is $LOG'

echo "Today is `date`"
echo 'Today is `date`'

運行結果:

Today is Saturday
Today is $LOG

Today is Thu Jun  8 17:37:43 CST 2023
Today is `date`

小結

  • 運行Shell腳本:sh+腳本的相對路徑或絕對路徑。
  • 第一行的"#!/bin/bash"是shabang(sharp bang),表明Shell解釋器的路徑。有Shabang的文件運行時會被自動識別成Shell腳本。
  • 變數賦值時,等號兩邊不能有空格。
  • $符號後面的變數會被自動替換成變數的值。
  • 數字命名的變數表示傳入的位置變數,如\(\$1\), \(\$\{12\}\)\(\$@\)\(\$*\)表示位置變數列表,\(\$\#\)表示位置變數的數量。
  • 雙引號阻止大多數字元解析,單引號阻止所有字元解析,倒引號執行命令並作為表達式的值。

本文來自博客園,作者:子豪君,中國科學技術大學LDS實驗室碩士在讀
轉載請註明原文鏈接:https://www.cnblogs.com/zihaojun/p/17467288.html
原創不易,如果感覺不錯,希望給個推薦!您的支持是我寫作的最大動力!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 還記得在2019年的夏天曾經用 R 爬過一份廣州在 lianjia.com 放盤數據 ([博客1](https://www.cnblogs.com/yukiwu/p/10975337.html),[博客2](https://www.cnblogs.com/yukiwu/p/11271515.html ...
  • 在Java虛擬機中,類和對象是程式的基本組成單元。類定義了一組對象的共性特征和行為,是Java程式中最基本的代碼單元。而對象則是具體的實例,有自己獨特的狀態和行為。在JVM中,類和對象都需要進行存儲,因此瞭解類和對象的存儲基礎知識對於Java程式員來說是非常重要的。 ...
  • # 1.初識while迴圈 迴圈語句主要的作用是在多次處理具有相同邏輯的代碼時使用。while迴圈是Python提供的迴圈語句之一。 while迴圈的語法格式之一: ![image](https://img2023.cnblogs.com/blog/3179433/202306/3179433-20 ...
  • 1、gateway相關介紹 在微服務架構中,系統往往由多個微服務組成,而這些服務可能部署在不同機房、不同地區、不同功能變數名稱下。這種情況下,客戶端(例如瀏覽器、手機、軟體工具等)想要直接請求這些服務,就需要知道它們具體的地址信息,例如 IP 地址、埠號等。這種客戶端直接請求服務的方式存在很多的複雜問題。 ...
  • 摘要:本文旨在深入探討Spring框架的註解驅動配置與XML配置,揭示兩者之間的相似性與差異。 本文分享自華為雲社區《Spring高手之路2——深入理解註解驅動配置與XML配置的融合與區別》,作者:磚業洋__ 。 本文旨在深入探討Spring框架的註解驅動配置與XML配置,揭示兩者之間的相似性與差異 ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • ## 前言 本人之前開發了一個叫[電子腦殼](https://github.com/maker-community/ElectronBot.DotNet)的上位機應用,給稚暉君[ElectronBot](https://github.com/peng-zhihui/ElectronBot)開源機器人 ...
  • # 安裝指定版本的mysql(安裝mysql5.7) ## 目標:解決需求,安裝mysql5.7 ## 前言: > 安裝軟體的三種方式: > > 1. rpm 安裝 > 2. 源代碼編譯安裝 > 3. yum倉庫安裝 > - 本地光碟 > - 阿裡雲yum源 > - 自建yum倉庫文件夾 > 4. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...