自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

每個(gè)程序員都應(yīng)知道的五個(gè) Bash 編碼技巧

開(kāi)發(fā)
在本文中,我將介紹一些 Bash 編碼技巧,您可以在您的 Shell 腳本中包含它們,使它們現(xiàn)代化、快速和可讀。

Bash 無(wú)疑已經(jīng)成為每個(gè)現(xiàn)代類(lèi) Unix 系統(tǒng)或基于 Unix 的操作系統(tǒng)的本地內(nèi)置自動(dòng)化解決方案。程序員使用 Bash 創(chuàng)建 Shell 腳本來(lái)自動(dòng)化重復(fù)的命令行任務(wù)。Bash 的主要目標(biāo)是提供一種最小的語(yǔ)法來(lái)執(zhí)行其他程序并處理它們的退出代碼和輸出。但是,現(xiàn)代的 Bash 解釋器具有完整的命令語(yǔ)言,提供大多數(shù)通用編程語(yǔ)言的功能。因此,我們可以通過(guò)包含傳統(tǒng)的命令行調(diào)用和算法代碼編寫(xiě)高度可讀的Shell腳本?,F(xiàn)代的Bash版本引入了關(guān)聯(lián)數(shù)組和支持按引用傳遞的性能相關(guān)特性,使 Bash 具有與其他準(zhǔn)備好進(jìn)行 Shell 腳本編寫(xiě)的語(yǔ)言競(jìng)爭(zhēng)的能力。

在本文中,我將介紹一些 Bash 編碼技巧,您可以在您的 Shell 腳本中包含它們,使它們現(xiàn)代化、快速和可讀。使用這些技巧,您可以使用 Bash 編寫(xiě)通用編程或算法實(shí)現(xiàn),例如算法原型、實(shí)現(xiàn)實(shí)用程序,甚至是競(jìng)爭(zhēng)編程!

在 Shell 腳本中使用數(shù)組

傳統(tǒng)的 Bash 變量通常沒(méi)有類(lèi)型,但是您可以根據(jù)特定的處理上下文將其處理為整數(shù)、小數(shù)或字符串。我們通常使用Bash變量來(lái)存儲(chǔ)命令輸出、算法參數(shù)和其他臨時(shí)值。Bash還支持兩種數(shù)組類(lèi)型:一維(按數(shù)字索引)和關(guān)聯(lián)(鍵值結(jié)構(gòu))。與其他流行的動(dòng)態(tài)類(lèi)型通用語(yǔ)言(例如Python、PHP 或 JavaScript)一樣,使用 Bash 數(shù)組非常容易。以下是如何在 Bash 中創(chuàng)建數(shù)組的方法:

#!/bin/bash
#Linux迷 www.linuxmi.com

numbers=(9 3 1 3 9)

declare -a words
words[0]='Linux迷'
words[1]='LinuxMi'

echo ${numbers[@]} ${words[@]}

以上代碼輸出的數(shù)組內(nèi)容如下:

您可以通過(guò) declare 內(nèi)置命令檢查每個(gè)數(shù)組引用的聲明,如下所示:

在 Bash 中檢查數(shù)組聲明,作者的屏幕截圖 您還可以使用最小的語(yǔ)法進(jìn)行數(shù)組操作和處理活動(dòng),例如追加新項(xiàng)、刪除現(xiàn)有項(xiàng)、處理數(shù)組元素、排序等。例如,以下代碼刪除無(wú)效的分?jǐn)?shù)值并打印前三個(gè)最高分?jǐn)?shù):

#!/bin/bash
#Linux迷 www.linuxmi.com

declare -a marks
marks+=(75 65 80 102 26) # class A marks
marks+=(103 68) # class B marks

# 刪除無(wú)效標(biāo)記
for i in "${!marks[@]}"; do
if ((marks[i] > 100)); then
unset "marks[$i]"
fi
done

# 對(duì)所有標(biāo)記進(jìn)行排序
marks_s=($(printf '%s\n' "${marks[@]}" | sort -nr))

# 打印前 3
echo ${marks_s[0]} ${marks_s[1]} ${marks_s[2]}

以上代碼會(huì)生成一個(gè)單獨(dú)的進(jìn)程進(jìn)行排序,因?yàn)槲覀兪褂昧?sort 外部命令,但是您可以通過(guò)使用一些 Bash 代碼實(shí)現(xiàn)簡(jiǎn)單的排序算法,例如選擇排序,來(lái)避免這種情況。

創(chuàng)建映射或字典

在一些編程場(chǎng)景中,我們需要在 shell 腳本中存儲(chǔ)鍵值對(duì)數(shù)據(jù)。程序員通常使用鍵值數(shù)據(jù)結(jié)構(gòu)來(lái)創(chuàng)建字典結(jié)構(gòu)、映射和緩存容器(通過(guò)記憶化)。如果您使用 Python 編寫(xiě)您的 shell 腳本,您可以使用內(nèi)置的字典數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)鍵值數(shù)據(jù)。如何在 Bash 中使用字典結(jié)構(gòu)?

Bash 4.0 版本引入了關(guān)聯(lián)數(shù)組功能,用于存儲(chǔ)鍵值數(shù)據(jù)。下面是一個(gè) Bash 關(guān)聯(lián)數(shù)組的簡(jiǎn)單示例:

#!/bin/bash
#Linux迷 www.linuxmi.com

declare -A marks=([linux]=39 [ubuntu]=27 [debian]=83 [fedora]=59)

for key in "${!marks[@]}"; do
printf "$key \t ${marks[$key]} \n"
done

在這里,我們使用了 !mapvar[@] 語(yǔ)法來(lái)提取所有字典鍵作為數(shù)組進(jìn)行迭代。上述代碼將打印出所有鍵和對(duì)應(yīng)的值,如下所示:

Bash 讓你可以使用最少的語(yǔ)法來(lái)操作和訪問(wèn)關(guān)聯(lián)數(shù)組數(shù)據(jù)。使用Bash關(guān)聯(lián)數(shù)組的方式就像使用 Python 字典一樣。請(qǐng)看下面的例子:

#!/bin/bash
#Linux迷 www.linuxmi.com

read -p "Enter coords (i.e., [x]=10 [y]=12): " coords
declare -A "coords=($coords)"

if [ ! -v "coords[x]" ]; then
coords[x]=5
fi

if [ ! -v "coords[y]" ]; then
coords[y]=10
fi

for key in "${!coords[@]}"; do
printf "$key = ${coords[$key]} \n"
done

以上源代碼向用戶(hù)請(qǐng)求x和y坐標(biāo),為缺失的坐標(biāo)軸值設(shè)置默認(rèn)值,并在終端上打印它們。在這里,我們使用! -v語(yǔ)法,因?yàn)橥ǔN覀兪褂?Python 字典中的 not in。

實(shí)現(xiàn)命名參數(shù)支持

當(dāng)您通過(guò) Bash 解釋器執(zhí)行 shell 腳本時(shí),操作系統(tǒng)會(huì)創(chuàng)建一個(gè)新的 Bash 進(jìn)程,并將您的腳本文件作為第一個(gè)命令行參數(shù)。操作系統(tǒng)通常允許您將一系列參數(shù)傳遞給每個(gè)操作系統(tǒng)進(jìn)程。當(dāng)您為其他命令/進(jìn)程提供命令行參數(shù)時(shí),您也可以將它們傳遞到您的 Bash 腳本中。假設(shè)您需要將兩個(gè)整數(shù)值傳遞給腳本。然后,您可以輕松使用 $1 和 $2 分別訪問(wèn)第一個(gè)和第二個(gè)參數(shù)值。但是,當(dāng)您使用更多索引參數(shù)并且需要實(shí)現(xiàn)可選參數(shù)(也稱(chēng)為命令行標(biāo)志或選項(xiàng))時(shí),事情將變得復(fù)雜。

作為這種情況的解決方案,您可以使用內(nèi)置的 getopts 來(lái)使用命名參數(shù)。使用以下 shell 腳本,我們可以覆蓋一些腳本中的默認(rèn)值:

#!/bin/bash
#Linux迷 www.linuxmi.com

title="Linux迷 www.linuxmi.com"
message="Hello world!www.linuxmi.com Linux迷"

while getopts ":t:m:" option; do
echo $option
case "${option}" in
t)
title=${OPTARG}
;;
m)
message=${OPTARG}
;;
esac
done

zenity --info --title="$title" --text="$message"

默認(rèn)情況下,上面的腳本顯示一個(gè)帶有默認(rèn)標(biāo)題和消息的 GTK 消息框,但是您可以使用命名的命令行參數(shù)來(lái)覆蓋它們,如下所示:

./linuxmi.com.sh -t "hello"

./linuxmi.com.sh -m "world"

getopts 內(nèi)置支持僅使用單個(gè)字母選項(xiàng)。您可以使用 getopt 來(lái)使用長(zhǎng)形式選項(xiàng)(即–title),如此 gist 所示。

使用函數(shù)中的引用傳遞

引用傳遞是一種編程語(yǔ)言特性,它允許您通過(guò)內(nèi)存引用將數(shù)據(jù)傳遞到函數(shù)中,而不是將整個(gè)數(shù)據(jù)段復(fù)制到新變量中。C ++ 程序員總是努力編寫(xiě)性能優(yōu)先的代碼,對(duì)于類(lèi)對(duì)象,結(jié)構(gòu)體和字符串,使用引用傳遞而不是值傳遞。

如果您使用的是 Bash 4.3 或更新版本,則可以使用名稱(chēng)引用在 shell 腳本中實(shí)現(xiàn)引用傳遞。以下是一個(gè)簡(jiǎn)單的示例代碼片段,通過(guò)函數(shù)更改字符串變量:

#!/bin/bash
#Linux迷 www.linuxmi.com

function change_str_var() {
local str_new="Bash"
local -n str_ref=$1
echo "$str_ref -> $str_new" # Python -> Bash
str_ref=$str_new
}

str="Python"
change_str_var str
echo $str # Bash

上述 change_str_var 函數(shù)使用 local 命令創(chuàng)建一個(gè)局部的 str_ref 引用,引用全局的 str 變量。然后,它通過(guò)覆蓋舊字符串值來(lái)分配一個(gè)新的字符串值。

一些程序員在函數(shù)內(nèi)部使用 echo 命令,并通過(guò)命令替換特性調(diào)用特定函數(shù)以從 Bash 函數(shù)返回值(因?yàn)樵?Bash return 關(guān)鍵字僅支持返回有效的退出代碼)。這會(huì)生成另一個(gè)子 shell 并消耗更多資源。因此,現(xiàn)在程序員可以使用引用傳遞并編寫(xiě)性能優(yōu)先的Bash函數(shù)返回,如果他們使用新的 Bash 版本。

使用類(lèi)型和修飾符屬性的變量

Bash 被稱(chēng)為一種無(wú)類(lèi)型命令語(yǔ)言。換句話說(shuō),它通常將變量數(shù)據(jù)處理為字符串,但根據(jù)上下文(例如在算術(shù)擴(kuò)展中)進(jìn)行相應(yīng)處理。另一方面,Bash 也允許程序員使用類(lèi)型屬性,并提供兩種內(nèi)置的數(shù)組類(lèi)型。即使有了這些功能,我們也不能將 Bash 視為純動(dòng)態(tài)類(lèi)型語(yǔ)言,但這些變量屬性將Bash置于無(wú)類(lèi)型和動(dòng)態(tài)類(lèi)型語(yǔ)言之間。

Bash 支持使用整數(shù)變量屬性將特定變量標(biāo)記為整數(shù)。一旦創(chuàng)建了一個(gè)整數(shù)變量,當(dāng)您分配非整數(shù)值時(shí),Bash 會(huì)發(fā)出警告,如下所示:

Bash 還允許使用 declare -r 命令創(chuàng)建常量。每當(dāng)您的腳本嘗試更改常量時(shí),Bash 會(huì)在屏幕上打印錯(cuò)誤消息。此外,正如我們之前使用的那樣,您可以使用 declare 內(nèi)置函數(shù)創(chuàng)建數(shù)組。

Bash 還允許您為變量添加一些修飾符屬性。例如,您可以創(chuàng)建僅包含小寫(xiě)字母或大寫(xiě)字母的字符串,如下所示:

declare -l lc_str="Hello World"
declare -u uc_str
uc_str="Hello"
uc_str="World"

echo $lc_str # hello world
echo $uc_str # WORLD

使用 Bash 變量屬性,您可以編寫(xiě)更少出錯(cuò)、更易讀、更現(xiàn)代的 shell 腳本。

責(zé)任編輯:趙寧寧 來(lái)源: Linux迷
相關(guān)推薦

2024-04-24 14:52:26

JavaScriptWeb 開(kāi)發(fā)

2012-02-28 10:52:13

2018-03-07 12:57:53

2012-10-11 10:32:48

Linux命令程序員

2022-09-11 15:20:05

程序員命令開(kāi)發(fā)

2023-12-27 09:00:00

Python魔術(shù)方法開(kāi)發(fā)

2023-01-31 15:43:47

2021-10-18 10:21:28

程序員技能優(yōu)化

2021-10-20 06:05:01

編程語(yǔ)言開(kāi)發(fā)

2020-09-03 12:54:37

Python程序員macOS

2023-06-27 00:04:10

程序員JavaScript

2013-01-28 10:25:46

開(kāi)發(fā)人員設(shè)計(jì)技巧

2014-10-22 10:54:14

程序員

2023-11-02 14:21:06

2024-04-10 12:36:41

硬件代碼

2015-03-20 11:50:09

程序員程序員警句

2015-05-26 10:09:51

程序員反面模式

2014-07-16 09:34:44

2015-11-05 09:19:12

程序員jQuery技巧

2017-09-26 13:08:51

程序員開(kāi)發(fā)定律
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)