最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

2. Shell變量

2023-03-01 21:20 作者:房子下面一頭豬  | 我要投稿

本期內(nèi)容簡(jiǎn)介

? ? ? bash的一個(gè)關(guān)鍵特性是能夠使用變量,允許用戶在腳本中存儲(chǔ)和操作數(shù)據(jù)。在本文中,我們將以bash中可以使用的不同類型的變量及其使用方法為例詳細(xì)了解shell變量。


目錄

2.1 命名

? ? ? ? ?2.1.1 命名規(guī)則

? ? ? ? ?2.1.2 命名規(guī)范

2.2 賦值

? ? ? ? ?2.2.1 簡(jiǎn)單變量賦值

? ? ? ? ?2.2.2 算術(shù)賦值

? ? ? ? ?2.2.3 命令替換賦值

2.3 使用、更改和刪除

2.4 類型

? ? ? ? ?2.4.1 可寫性

? ? ? ? ?2.4.2 作用域

? ? ? ? ?2.4.3 數(shù)組變量

? ? ? ? ?2.4.4 特殊變量

2.5 環(huán)境變量


2.1 命名

2.1.1 命名規(guī)則

  • 只能包含數(shù)字字母下劃線(_)字符

  • 第一個(gè)字符必須是字母或下劃線

  • 區(qū)分大小寫

## 合法命名
count=20
my_school=CAU
mySchool="China? Agricultural University"
PI_CONSTANT=3.1415926
temp_file_path_2=D:/tmp

echo
$mySchool

## 非法命名
1name=zhangsan ?# 以數(shù)字開頭
my name=zhangsan ?# 包含空格
my-age=22 ?# 包含特殊字符

2.1.2 命名規(guī)范

  • 應(yīng)具有描述性,以提高代碼可讀性和可維護(hù)性

  • 避免使用單個(gè)字符或縮寫的變量名,除非變量用途明顯且臨時(shí)使用

  • 多單詞組成的變量,可用下劃線駝峰式命名法,使變量名更易讀

  • 常量只讀變量,可用全大寫字母命名

## 合法但不規(guī)范的命名
my_variable=CAU # my_school=CAU
f="D:/path/to/your/file.txt" # 單字符
file="D:/path/to/your/file.txt" # file_path="D:/path/to/your/file.txt"
userinfodict="C:/Users/zhangsan/project" # user_info_dict 或 userInfoDict
home_self="D:/zhangsan" # HOME_SELF

2.2 賦值

2.2.1 簡(jiǎn)單變量賦值

  • 通過簡(jiǎn)單的賦值語(yǔ)句來將存儲(chǔ)在變量中

  • 等號(hào)兩邊不能有空格,否則 Bash 會(huì)將其解釋為命令而不是賦值語(yǔ)句

  • 賦值時(shí)建議使用雙引號(hào)字符串,單引號(hào)字符串內(nèi)的變量無效

name = "zhangsan" # =號(hào)兩側(cè)不能有空格
name="zhangsan"
age=30
info='My names is $name, I am $age years old.' # 單引號(hào)字符串內(nèi)的變量無效
echo ${info}
info="My names is $name, I am $age years old."
echo ${info}

2.2.2 算術(shù)賦值

  • 將變量設(shè)置為算術(shù)表達(dá)式的結(jié)果

  • 可以使用?$(( ))?語(yǔ)法來執(zhí)行算術(shù)操作

x=5
y=$((x + 2)) # 算術(shù)表達(dá)式必須用兩個(gè)括號(hào)括起來,且等號(hào)兩側(cè)不能有空格
echo $y ? ?# 輸出 7

2.2.3 命令替換賦值

  • 將變量設(shè)置為命令替換的結(jié)果

  • 命令替換:用于將命令的輸出作為字符串賦值給變量

  • 可以使用反引號(hào)?`?? $()? 語(yǔ)法來執(zhí)行命令替換,推薦用后者

# 2021年度部分省份生豬出欄情況
slaughter="省份 出欄量(萬頭) 占比(%) 片區(qū)
四川省 6314.80 9.41 西南地區(qū)
湖南省 6121.80 9.12 華中地區(qū)
河南省 5802.77 8.64 華中地區(qū)
山東省 4401.70 6.56 華東地區(qū)
湖北省 4115.05 6.13 華中地區(qū)
廣東省 3336.63 4.97 華南地區(qū)
安徽省 2797.80 4.17 華東地區(qū)
江蘇省 2210.10 3.29 華東地區(qū)
黑龍江省 2228.10 3.32 東北地區(qū) "
CentralChina=`grep "華中地區(qū)" <<< "${slaughter}"`
echo ${CentralChina}
EastChina=$(grep "華東地區(qū)" <<< "${slaughter}")
echo ${CentralChina}

2.3 使用、更改和刪除

  • 使用echo簡(jiǎn)單打印變量

  • 在Bash中,使用變量需在變量名前加上一個(gè)美元符號(hào)$

  • 例如,用$my_var來使用名為my_var的變量的值

  • 變量使用場(chǎng)景:命令行參數(shù)、命令替換、算術(shù)運(yùn)算、條件語(yǔ)句等

name="Zhangsan"
age_last_year=18
echo "My name is ${name}, I am $((age_last_year + 1)) years old."
if [[ ${name} == "Zhangsan" ]]; then echo "Right."; else echo "Wrong."; fi

  • 使用變量時(shí),建議將變量引用放在大括號(hào)中,如${var}

  • 變量名后面緊跟著一個(gè)字母或數(shù)字時(shí),必須要使用大括號(hào)來區(qū)分變量名和后面的字符

var="Hello"
echo "$varWorld" ? ?# 由于$var后面緊跟著字母W,bash無法區(qū)分$var和World,因此輸出為空
echo "${var}World" ?# 能準(zhǔn)確區(qū)分變量和字符串,輸出 "HelloWorld"

  • 在Bash中,可通過重新賦值來更改變量的值,只需為變量分配一個(gè)新的值即可

my_var="Hello World!"
echo $my_var

my_var="Hello!" # 直接賦值進(jìn)行覆蓋
echo $my_var

my_var
+=" CAU" # 字符串拼接,注意,只能用于字符串變量
echo $my_var

  • 在Bash中,刪除變量可以使用unset命令

# unset [-f] [-v] [變量名],-f表示刪除函數(shù),-v表示刪除變量,不指定則默認(rèn)刪除變量
my_var="Hello World"
echo $my_var
unset my_var
echo $my_var # 輸出一個(gè)空行,因?yàn)閙y_var已經(jīng)被刪除

my_array
=(a b c d e)
echo ${my_array[@]}
unset my_array
echo ${my_array[@]}

readonly
my_var="Hello World"
unset my_var # 報(bào)錯(cuò),因?yàn)閞eadonly命令可以將變量定義為只讀變量,只讀變量無法被刪除

function
my_func() { ?echo "Hello World"}
my_func
my_func=3.14 # 函數(shù)my_func同名變量
unset my_func
?my_func # 函數(shù)my_func仍能運(yùn)行,因?yàn)閡nset不加參數(shù),則默認(rèn)刪除變量,而不是函數(shù)(若同名變量存在)
unset -f my_func
my_func # 報(bào)錯(cuò),因?yàn)楹瘮?shù)my_func已經(jīng)被刪除

  • 請(qǐng)注意,unset命令只能刪除在當(dāng)前shell中定義的變量或函數(shù),無法刪除另一個(gè)shell或子進(jìn)程中定義的一個(gè)變量或函數(shù)

2.4 類型

  • Bash不關(guān)心變量的類型,可以存儲(chǔ)字符串、整數(shù)、實(shí)數(shù)等等

  • 事實(shí)上,這些類型都存儲(chǔ)為字符串,但期望數(shù)字的命令可以將它們視為數(shù)字,如$((num - 1))

2.4.1 可寫性

可寫變量

  • 在Bash中,默認(rèn)情況下所有變量都是可寫變量

name="Zhangsan" # 定義可寫變量
echo $name ?# 讀取變量
name="Lisi" # 修改變量
echo $name

只讀變量

  • 一旦被定義后就不能被修改的變量

  • 在Bash中,可使用readonly命令將變量設(shè)置為只讀變量

readonly name="Alice" # 定義只讀變量
name="Bob" # 試圖修改只讀變量將導(dǎo)致錯(cuò)誤

  • 可以使用declare命令將變量同時(shí)設(shè)置為只讀和整數(shù)類型

declare -ri number=10 ? # 定義只讀整數(shù)變量
number=20 ? # 試圖修改只讀變量將導(dǎo)致錯(cuò)誤

2.4.2 作用域

全局變量

  • 定義在腳本或函數(shù)外部

  • 可以在腳本函數(shù)內(nèi)部外部訪問和修改

echo "
?#!/bin/bash

? # 定義全局變量 global_var=\"I am a global variable\"

# 在函數(shù)中訪問全局變量
my_func() {? ?echo \"Inside function: \$global_var\"}

# 調(diào)用函數(shù)
my_func

?# 在腳本中訪問全局變量
echo \"Outside function: \$global_var\"
"
> tmp.sh

chmod
777 tmp.sh
./tmp.sh
rm tmp.sh # 刪除腳本文件

環(huán)境變量

  • 定義在操作系統(tǒng)的環(huán)境

  • 所有子進(jìn)程都可以訪問和修改

  • 可以使用export命令將一個(gè)變量定義為環(huán)境變量


# 定義環(huán)境變量,可以被所有子進(jìn)程繼承
export ENV_VAR="I am an environment variable"

# 在腳本中訪問環(huán)境變量
echo "Inside script: $ENV_VAR"

# 調(diào)用另一個(gè)腳本,訪問環(huán)境變量
echo "
#!/bin/bash

# 在子進(jìn)程中訪問環(huán)境變量
?echo \"Inside another script: \$ENV_VAR\"
"
> tmp.sh

chmod
777 tmp.sh
./tmp.sh# 輸出 "Inside another script: I am an environment variable"
rm tmp.sh

局部變量

  • 定義在函數(shù)內(nèi)部

  • 只能在該函數(shù)內(nèi)部訪問和修改

定義函數(shù),使用局部變量
my_func() { ?local local_var="I am a local variable" ?echo "Inside function: ${local_var}"}

# 調(diào)用函數(shù)
my_func

# 嘗試在腳本中訪問局部變量,會(huì)提示未定義
echo "Outside function: ${local_var}"# 無法訪問變量,變量處內(nèi)容為空,

  • 請(qǐng)注意,在Bash中,局部變量必須使用local關(guān)鍵字進(jìn)行聲明

2.4.3 數(shù)組變量

索引數(shù)組

  • 常用的一種數(shù)組類型

  • 使用數(shù)字索引來訪問數(shù)組元素

  • 在Bash中,數(shù)組默認(rèn)都是索引數(shù)組

# 定義一個(gè)包含3個(gè)元素的索引數(shù)組
Breeds=("Yorkshire" "Landrace" "Duroc")

# 訪問數(shù)組元素
echo ${Breeds[0]} ?# 輸出 "Yorkshire"
echo ${Breeds[1]} ?# 輸出 "Landrace"
echo ${Breeds[@]} ?# 輸出數(shù)組所有元素

關(guān)聯(lián)數(shù)組

  • 使用字符串索引而不是數(shù)字索引來訪問數(shù)組元素,也稱為字典映射

  • 請(qǐng)注意,關(guān)聯(lián)數(shù)組在Bash 4及更高版本才被引入

# 使用declare -A命令定義
declare -A breeds
breeds["Yorkshire"]=YY
breeds["Landrace"]=LL
breeds["Duroc"]=DD

# 訪問數(shù)組元素
echo ${breeds["Landrace"]} ? ?# 輸出 "LL"
echo ${breeds["Duroc"]} ? ? ? # 輸出 "DD"

# 直接使用括號(hào)定義
breeds2=( ["Hampshire"]="HH" ["Pietrain"]="PP" )
echo ${breeds2["Hampshire"]} ? ?# 輸出 "HH"
echo ${breeds2["Pietrain"]} ? ? # 輸出 "PP"

2.4.4 特殊變量

  • $0:代表腳本或命令本身的名稱

  • $1-$9:代表命令行參數(shù)。$1代表第一個(gè)參數(shù), $2代表第二個(gè)參數(shù),以此類推,最多可以有9個(gè)參數(shù)。如果需要獲取更多的參數(shù),可以使用$*或$@

  • $#:代表命令行參數(shù)的數(shù)量,不包括腳本本身

  • $*$@:代表所有命令行參數(shù)。 $* 將所有參數(shù)看作一個(gè)單詞,而 $@ 將每個(gè)參數(shù)看作一個(gè)單詞。這兩個(gè)變量在處理參數(shù)列表時(shí)十分有用

  • $?:代表上一條命令的退出狀態(tài)。如果命令執(zhí)行成功,則 $? 的值為 0,否則為非 0 的值。

  • $$:代表當(dāng)前 shell 進(jìn)程的進(jìn)程ID。

  • $!:代表最近一個(gè)在后臺(tái)運(yùn)行的進(jìn)程的進(jìn)程ID


echo "
?#!/usr/bin/bash

echo
echo \"腳本的名稱是: \$0\"
echo # 打印空行
echo \"第1個(gè)參數(shù)是: ?\$1\"
echo \"第2個(gè)參數(shù)是: ?\$2\"
echo \"第10個(gè)參數(shù)是: \$10\"
echo \"第10個(gè)參數(shù)是: \${10}\"echo \"參數(shù)總個(gè)數(shù): ? \$#\"
echo
echo \"所有參數(shù)(單詞形式):\$*\"
echo \"所有參數(shù)(數(shù)組形式):\$@\"
echo
echo \"上一個(gè)命令的退出狀態(tài)是 \$?\"
echo
echo \"當(dāng)前 shell 進(jìn)程的進(jìn)程 ID 是 \$$\"
sleep 5 &
ps
echo \"最近一個(gè)在后臺(tái)運(yùn)行的進(jìn)程的進(jìn)程 ID 是 \$!\"
"
> tmp.sh

chmod
777 tmp.sh
./tmp.sh A B C D E F G H I J K
rm?tmp.sh

  • 這些變量提供有關(guān)當(dāng)前環(huán)境的有用信息,允許腳本響應(yīng)輸入并與底層系統(tǒng)交互

  • 請(qǐng)注意,當(dāng)引用第10個(gè)及以上的參數(shù)時(shí),必須使用花括號(hào)將參數(shù)編號(hào)括起來,如${10},這是因?yàn)樵贐ash中,$10會(huì)被解釋為將$1后跟一個(gè)0

2.5 環(huán)境變量

  • Bash中的環(huán)境變量是在Shell會(huì)話中可用的特殊變量

  • 在Shell啟動(dòng)時(shí)由操作系統(tǒng)設(shè)置,對(duì)于所有的Shell進(jìn)程都是可用的。

  • 環(huán)境變量允許在不同的Shell會(huì)話之間共享配置和信息,對(duì)于系統(tǒng)配置應(yīng)用程序開發(fā)都非常有用

  • 使用大寫字母命名

  • 使用export命令可將變量從本地Shell變量升級(jí)為環(huán)境變量,使其在其他Shell進(jìn)程中可用

  • 使用env命令可列出當(dāng)前Shell進(jìn)程中所有的環(huán)境變量


# 使用export命令將一個(gè)本地變量升級(jí)為環(huán)境變量
export MY_VAR="Hello, World!"

# 在當(dāng)前Shell中打印環(huán)境變量
echo $MY_VAR

# 啟動(dòng)一個(gè)新的Shell會(huì)話,并打印環(huán)境變量
bash -c 'echo $MY_VAR'

# 使用env命令列出所有的環(huán)境變量
env # 請(qǐng)注意,將會(huì)輸出一大串內(nèi)容
env | grep MY_VAR # 可使用grep命令過濾輸出

  • 通過在${HOME}/.bash_profile文件或/etc/profile.d目錄下創(chuàng)建文件來設(shè)置環(huán)境變量,這些文件在系統(tǒng)啟動(dòng)時(shí)被自動(dòng)加載。

  • 這些文件中設(shè)置的變量只有在新的登錄Shell中才會(huì)被設(shè)置為環(huán)境變量


# 設(shè)置可寫環(huán)境變量
export MY_VAR="Hello, World!"

# 設(shè)置只讀環(huán)境變量
export MY_READ_ONLY_VAR="This variable is read-only."
readonly MY_READ_ONLY_VAR

# 嘗試修改可寫和只讀環(huán)境變量
MY_VAR="Modified value"
MY_READ_ONLY_VAR="Modified value"

# 打印環(huán)境變量
echo $MY_VAR
echo $MY_READ_ONLY_VAR


供稿:李偉寧

編輯:孫福騰

?校對(duì):李偉寧?

團(tuán)隊(duì)其他公眾平臺(tái):

微信公眾號(hào) | 房子下面一頭豬

知乎|房子下面一頭豬 (https://www.zhihu.com/people/mang-guo-c-60-10)?

GitHub | CAU-TeamLiuJF? (https://github.com/CAU-TeamLiuJF)??


2. Shell變量的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
济南市| 南阳市| 花莲市| 九龙坡区| 乐业县| 宁南县| 邵武市| 连山| 普陀区| 水城县| 类乌齐县| 沙河市| 重庆市| 周口市| 灌南县| 黄梅县| 渭南市| 什邡市| 刚察县| 鄂尔多斯市| 江源县| 昔阳县| 错那县| 乌兰察布市| 沂南县| 德兴市| 鸡泽县| 铜梁县| 和龙市| 类乌齐县| 龙川县| 内丘县| 吉木萨尔县| 剑川县| 佳木斯市| 宽甸| 临海市| 东港市| 额济纳旗| 沾益县| 宜君县|