Linux-Shell腳本基礎用法

1.變量定義

變量命名規則:

  • 可以包含字母,數字,下劃線,首字母不能用數字開頭,中間不能又空格;

  • 為變量賦值等號之間不能為空格;

  • 變量命名不能使用標點符號,不能使用bash的關鍵字;

  • shell中默認的變量的類型都是字符,就算是數字字符也會被認為是字符串,如果需要進行數值相加,則必須指定變量為數值;

  • 如果定義的變量中沒有空格,則定義變量時可以使用單引號或雙引號,也可以使用,如:name=zs,如果變量中包含了空格,則必須使用單引號或雙引號引起來,如:"Kent Beck”

  • 可以使用命令的結果作為變量的值,但必須使用 `` 或 $() 符號,如: d=$(ls /etc) 獲取etc目錄下的所用文件賦給d;

  • 環境變量一般用大寫,編程習慣;

變量命令示例:

# 以下時合法的變量名
ABC
ROOT__PATH
_var
var2

# 以下時非法的變量名
12abc
?abc

1.1.變量賦值

# 顯示負值
name="zs" #正確
name = "zs" #錯誤


# 變量的使用
echo $name
echo ${name} #也可以這樣寫,花括號是可選的


# 使用語句為變量賦值
for f in $(ls /etc) # 將/etc目錄下的所有文件循環賦給f變量
for f in `ls /etc` # 這樣寫也可以
# 變量可以重新定義
name="ww"
echo $name
name="zl"
echo $name?

雙引號和單引號的區別?

root@zking:~# var=1 2 3
2: command not found
root@zking:~# VAR="1 2 3"
root@zking:~# echo $VAR
1 2 3
root@zking:~# VAR='1 2 3'
root@zking:~# echo $VAR
1 2 3
root@zking:~# ^C
root@zking:~#??

?

在變量賦值時,如果值有空格,Shell 會把空格后面的字符串解釋為命令。

看不出什么區別,再舉個說明:

root@zking:~# N=3
root@zking:~# VAR="1 2 $N"
root@zking:~# echo $VAR
1 2 3?

單引號是告訴 Shell 忽略特殊字符,而雙引號則解釋特殊符號原有的意義,比如$、!。 ?

1.2.只讀變量

# 定義只讀變量,該變量不能修改
name="avdfd"
readonly name
# 運行時會提示該變量是只讀變量?

?

1.3.刪除變量

# 刪除v1變量
unset v1


# set可以查看所有的變量,包括環境變量和用戶自定義的變量
set?

刪除只讀變量?

1.4.變量引用

Shell 中所有變量引用使用$符,后跟變量名。

root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# VAR+=456
root@zking:~# echo $VAR
123456?

還有時候變量名與其他字符串緊礙著,也會誤認為是整個變量:

root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# echo $VAR456

root@zking:~# echo ${VAR}456
123456

將命令結果作為變量值:

root@zking:~# VAR=`echo 123`
root@zking:~# echo $VAR
123
root@zking:~# VAR=$(echo 123)
root@zking:~# echo $VAR
123?

?

2.變量類型

  • 自定義變量:用戶自己定義的變量,或者叫作本地變量;

  • 環境變量:保存和系統操作環境相關的變量,可以添加環境變量;

  • 位置變量:主要用于向腳本中傳遞參數或數據,變量名不能自定義,作用固定;

  • 預定義變量:在Bash中已經定義好的變量,變量的作用也是預先定義好的;

2.1.自定義變量

用戶自定義的變量也叫本地變量,只在定義它的當前shell中才也可以使用。

參考變量定義中的變量賦值即可。

2.2.環境變量

在命令行提示符直接執行 env、set 查看系統或環境變量。env顯示用戶環境變量,set顯示Shell預先定義好的變量以及用戶變量。可以通過 export 導出成用戶變量。

可以理解為環境變量與本地變量的區別就是作用范圍不同。

?

一些寫 Shell 腳本時常用的系統變量:

變量說明
$SHELL默認 Shell
$HOME當前用戶家目錄
$IFS內部字段分隔符
$LANG默認語言
$PATH默認可執行程序路徑
$PWD當前目錄
$UID當前用戶 ID
$USER當前用戶
$HISTSIZE歷史命令大小,可通過 HISTTIMEFORMAT 變量設置命令執行時間
$RANDOM隨機生成一個 0 至 32767 的整數
$HOSTNAME主機名

export 是一個Shell內置命令,用于將變量設置為環境變量,使其在當前Shell及其子Shell中都能被訪問。環境變量通常用于配置Shell環境、系統行為、應用程序參數等。

基本語法:

export VARIABLE_NAME=value

?

2.3.位置變量

位置變量指的是函數或腳本后跟的第 n 個參數。

參數說明
$nn是數字,$0表示命令的本身,$1-9表示第1到第9個參數,10以上的參數需要用{}括起來,例如${10}
$*表示命令行中的所有參數,$*把所有參數看成一個整體
$@表示命令行中的所用參數,與$*不同的是$@把每個參數區分對待,可以將這個整體看作是一個數組,數組中的每個元素都是獨立的
$#代表命令行中所有參數的個數

示例一: ?

root@zking:~# vim paramdemo.sh

#!/bin/bash
echo $0
echo $1
echo $2
echo $3

# 賦權
root@zking:~# chmod 755 paramdemo.sh?
root@zking:~# ./paramdemo.sh 1 2 3 4
./paramdemo.sh
1
2
3

?

示例二: ?

root@zking:~# vim paramdemo02.sh

#!/bin/bash
echo "參數個數:$#"
echo "所有的參數(作為一個整體):$*"
echo "所有的參數(區分對待每個參數):$@"

root@zking:~#?
root@zking:~# chmod 775 paramdemo02.sh
root@zking:~# ./paramdemo02.sh 1 2 3 4 7
參數個數:5
所有的參數(作為一個整體):1 2 3 4 7
所有的參數(區分對待每個參數):1 2 3 4 7

?

2.4.預定義變量

參數說明
$?最后一次執行命令的返回狀態,如值為0則說明成功,如值為非0,則說明命令執行不正確
$$當前進程的進程號
$!后臺運行的最后一個進程的進程號

?

?

示例一:

root@zking:~# ls
a.txt ?paramdemo02.sh ?paramdemo.sh ?snap ?workspace
root@zking:~# echo $?
0
root@zking:~# ls /fafaf
ls: cannot access '/fafaf': No such file or directory
root@zking:~#?
root@zking:~# echo $?
2?

?

3.鍵盤輸入

read命令從標準輸入讀取,并把輸入的內容復制給變量。

命令:read [選項] [變量名]?

參數說明:

選項說明
-p提示信息,等待輸入時的提示
-t秒數,用于指定等待的時間,單位時秒
-n字符數,只要接收到指定的字符數就會執行
-s隱藏輸入的數據,用于機密信息的輸入,比如密碼

更多參數,請使用read -help查看。

?

?

示例一:

root@zking:~# vim readdemo.sh

#!/bin/bash
read -t 60 -p "請輸入賬號: " userName
echo "輸入的賬號是: $userName"
read -s -t 60 -p "請輸入密碼:" password
echo -e "\n"
echo “輸入的密碼: $password”
read -n 1 -t 30 -p "請選擇[y/n]" select
echo -e "\n"
echo "輸入的選擇是: $select"

root@zking:~# chmod 775 readdemo.sh?
root@zking:~# ./readdemo.sh?
請輸入賬號: admin
輸入的賬號是: admin
請輸入密碼:

“輸入的密碼: 1234”
請選擇[y/n]y

輸入的選擇是: y?

?

4.數值運算

4.1.為什么數值需要特殊處理

shell中變量默認都是字符型的,不管是其字面值是不是數值,所以當兩個變量相加時,默認是字符串拼接的操作,例如:

root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2?

4.2.聲明變量類型

格式: declare [+/-][選項] 變量名?

參數說明:

參數說明
-給變量設置類型屬性
+取消變量的類型屬性,注意與我們的日常習慣不同
-i將變量指定為整型
-x將變量聲明為環境變量
-p顯示指定變量被設置的類型

?

示例一:

root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2
# 此處是數值相加,而不是字符串相加了
root@zking:~# declare -i num4=$num1+$num2
root@zking:~# echo $num4
3?

4.3. expr或let數值運算工具

除了 Shell 本身的算數運算表達式,還有幾個命令支持復雜的算數運算:

root@zking:~# a=1
root@zking:~# b=2
root@zking:~# let c=$a+$b
root@zking:~# echo $c
3

# 注意空格問題
root@zking:~# c=$(expr $a+$b)
root@zking:~# echo $c
1+2
root@zking:~# c=$(expr $a + $b)
root@zking:~# echo $c
3

?

4.4.$((表達式))或$[表達式]

root@zking:~# a=5
root@zking:~# b=6
root@zking:~# c=$((a+b))
root@zking:~# echo $c
11


root@zking:~# b=8
root@zking:~# a=9
root@zking:~# c=$[a+b]
root@zking:~# echo $c
17?

5.運算符

優先級運算符說明
1=, +=, -=, *=, /=, %=, &=, ^=各種賦值
2&&邏輯與
3^按位異或
4&按位與
5==, !=等于,不等于
6>, <, <=, >=大于,小于,大于等于,小于等于
7>>, <<按位左移,按位右移
8+, -加,減
9*, /, %乘,除,取余
10!, ~邏輯非,按位取反,或補碼
11-,+單目,正負運算符

優先級的數值越大,優先級越高,注意和其他語言的數值越低優先級越高不同。 ?

root@zking:~# num=$[(15+34)*5/2]
root@zking:~# echo $num
122
root@zking:~# b=$((19%2))
root@zking:~# echo $b
1
root@zking:~# c=$((1&&0))
root@zking:~# echo $c
0?

?

空格總結

  1. 定義變量時,=號兩邊不可以留空格

  2. 使用反引號的時候,運算符兩邊必須留空格;使用$()的時候,運算符兩邊不可以留空格

  3. if條件測試語句的時候,[ ]兩邊要留空格,比較符兩邊也要留空格

  4. 命令和其之后的參數或對象之間一定要有空格

  5. $后不能有空格

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92008.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS中的Map和WeakMap區別和聯系

JavaScript 中 Map 與 WeakMap 的區別、聯系及示例核心區別特性MapWeakMap鍵的類型允許任意類型的鍵&#xff08;對象、原始值&#xff09;鍵必須是對象&#xff08;非原始值&#xff09;垃圾回收強引用鍵 → 阻止垃圾回收弱引用鍵 → 不影響垃圾回收可遍歷性支持遍歷&#xff…

Linux 環境 libpq加載異常導致psql 連接 PostgreSQL 庫失敗失敗案例

文章目錄局點現象定位結論局點環境補充知識點如下庫文件加載順序關鍵事實&#xff1a;您系統中的證據&#xff1a;優先級對比表&#xff1a;解決方案強化&#xff1a;最終檢查&#xff1a;本局點解決方法局點現象 數據庫 mdm 升級失敗檢查日志, 發現是由于 psql 連接數據庫報錯…

C# XML 文件

在 C# 中處理 XML 文件是非常常見的操作&#xff0c;可以使用System.Xml命名空間中的類來實現。以下是一些常用的 XML 操作示例&#xff1a; 手冊鏈接&#xff1a; System.Xml 命名空間 XmlDocument 創建一個xml數據格式的文檔 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物體導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作(且解決動態模糊)

前言 因為項目需要(比如我們在做的兩個展廳講解訂單)&#xff0c;近期我一直在研究VLN相關&#xff0c;有些工作哪怕暫時還沒開源(將來可能會開源)&#xff0c;但也依然會解讀&#xff0c;比如好處之一是構建完整的VLN知識體系&#xff0c;本文便是其中一例 我在解讀過程中&am…

【Django】-3- 處理HTTP響應

HttpResponse 家族” 的常用操作&#x1f31f;1. 設置狀態碼 &#x1f44b;狀態碼是服務器告訴客戶端 “請求處理結果” 的數字暗號&#xff08;比如 404 表示 “沒找到頁面”&#xff09;。Django 里有 3 種設置方式&#xff1a;方式 1&#xff1a;直接寫數字&#xff08;簡單…

《React Router深解:復雜路由場景下的性能優化與導航流暢性構建》

路由系統是連接用戶操作與應用功能的中樞神經,而React Router作為React生態中處理路由邏輯的核心工具,其在復雜應用中的表現直接決定著用戶體驗的優劣。當應用規模擴張至數十甚至上百個路由,嵌套層級跨越多層,導航控制中的性能問題便會逐漸凸顯——從首屏加載的延遲到路由切…

網絡與信息安全有哪些崗位:(4)應急響應工程師

想知道網絡與信息安全領域有哪些具體崗位嗎&#xff1f; 網絡與信息安全有哪些崗位&#xff1a;&#xff08;1&#xff09;網絡安全工程師-CSDN博客 網絡與信息安全有哪些崗位&#xff1a;&#xff08;2&#xff09;滲透測試工程師_網絡安全滲透工程師-CSDN博客 網絡與信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3634. Minimum Removals to Balance Array 1. 解題思路 這一題思路上就是一個滑動窗口的思路。 我們首先將整個數組有序排列&#xff0c;然后分別從左向右考察每一個元素作為…

C#/.NET/.NET Core優秀項目和框架2025年7月簡報

前言 每月定期推廣和分享的C#/.NET/.NET Core優秀項目和框架&#xff08;每周至少會推薦兩個優秀的項目和框架當然節假日除外&#xff09;&#xff0c;推文中有項目和框架的詳細介紹、功能特點、使用方式以及部分功能截圖等。注意&#xff1a;排名不分先后&#xff0c;都是十分…

第 10 篇:深度學習的“軍火庫”——CNN、RNN與Transformer,AI如何看懂世界?

《人工智能AI之機器學習基石》系列⑩ 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察 + 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。 引

深度學習—功能性函數代碼 common.py

函數&#xff1a;返回GPU def try_gpu(i0): #save"""如果存在&#xff0c;則返回gpu(i)&#xff0c;否則返回cpu()"""if torch.cuda.device_count() > i 1: # 如果存在第 i 個 GPUreturn torch.device(fcuda:{i}) # 返回第 i 個 GPU 設…

南太平洋金融基建革命:斐濟-巴新交易所聯盟的技術破局之路 ——從關稅動蕩到離岸紅利,跨境科技如何重塑太平洋資本生態

一、今日焦點&#xff1a;全球關稅震蕩與南太平洋的“技術聯盟”機遇 1. 特朗普關稅大限引爆亞太市場波動&#xff0c;小經濟體承壓尋路 2025年8月1日&#xff0c;特朗普正式簽署行政令&#xff0c;對多國征收10%-41%的“對等關稅”。韓國首當其沖&#xff0c;綜合指數暴跌近4%…

python爬取豆瓣電影評論通用代碼

最近在自學python爬蟲&#xff0c;今天閑來無事&#xff0c;爬了一下豆瓣數據 這個網站對于初學者來說還是很友好的注意&#xff1a;有python環境的朋友運行的時候&#xff0c;要把cookie換成自己的 通用性&#xff1a;可以自己換不同的電影id進行數據爬取 Tip&#xff1a;slee…

構建屬于自己的第一個 MCP 服務器:初學者教程

為什么需要 MCP 服務器&#xff1f; 你是否遇到過這樣的場景&#xff1a;向 AI 助手&#xff08;比如 GitHub Copilot&#xff09;詢問 “北京今天的天氣”&#xff0c;得到的回復卻是 “我無法訪問實時天氣數據”&#xff1f; 這是因為大多數 AI 模型本身 “與世隔絕”—— 它…

個人項目介紹:語音識別小助手

一、項目內容 基于STM32F103RCT6制作了一款集語音識別、按鍵控制、信息顯示、溫濕度監測等多功能于一體的智能設備&#xff0c;滿足多樣化的交互需求。 二、個人工作內容 依據項目需求&#xff0c;選定 STM32F103RCT6 單片機、SU-03T語音識別模組、AHT25 溫濕度傳感器等核心元件…

【Django】-1- 開發項目搭建

一、PDM Django 搭建項目&#x1f447;&#x1f3af; 核心目標用 PDM&#xff08;更現代的 Python 包管理工具&#xff09;&#xff0c;快速創建并管理 Django 項目&#xff08;Web 框架&#xff09;&#xff0c;讓開發流程更絲滑?&#x1f9e9; 分步拆解1. 創建項目用 PDM 初…

c++:設計模式訓練

寫一個鳥類&#xff1a;有一個多態函數&#xff1a;run 寫一個企鵝類&#xff0c;繼承自鳥類&#xff1a;重寫 run 寫一個鴕鳥類&#xff0c;繼承自鳥類&#xff0c;重寫 run 寫一個老鷹類&#xff0c;繼承自鳥類&#xff0c;重寫run 寫一個鳥籠&#xff0c;能夠存放 不同的鳥…

配置Mybatis環境

配置Mybatis環境MyBatis是什么配置Mybatis環境MyBatis是什么 MyBatis 一個支持普通 SQL 查詢、存儲過程以及高級映射的持久層框架。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作&#xff0c;使得開發者可以更專注于 SQL 本身&#xff0c;而不必花費過多…

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享 在大規模分布式微服務架構中&#xff0c;如何在多集群環境下平滑、安全地發布新版本&#xff0c;一直是保證高可用、高可靠的關鍵需求。本文以真實生產環境案例為基礎&#xff0c;分享我們團隊基于Istio Servic…

Kubernetes(k8s)之認識Pod

01了解Pod Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程。 一個Pod封裝一個應用容器(也可以有多個容器),存儲資源、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。它可能由單個容器或多個容器共享組成的資源。 Kubern…