0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在bash shell腳本中接受參數(shù)

CHANBAEK ? 來源:TIAP ? 作者:GLIU ? 2022-12-09 17:34 ? 次閱讀

終端命令通常包含一些參數(shù),在使用的時候可以提供不同的參數(shù)來確定命令的執(zhí)行方式。POSIX規(guī)范中包含了用于命令行接口的選項。這也是與最早的UNIX應(yīng)用程序建立的一個由來已久的約定,所以當(dāng)你在寫bash腳本的時候,需要知道如何在腳本中接受參數(shù)。

bash中的參數(shù)(選項)解析

Bash中解析選項的策略是循環(huán)遍歷傳遞給shell腳本的所有參數(shù),確定它們是不是選項,然后切換到下一個參數(shù)。重復(fù)此過程,直到?jīng)]有剩余選項。

從一個簡單的布爾選項(有時稱為開關(guān)或標志)開始:

#!/bin/bash


while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done


echo $ALPHA

在這段代碼中,我創(chuàng)建了一個while循環(huán),它作為一個無限循環(huán),直到?jīng)]有更多的參數(shù)要處理為止。if語句嘗試將在第一個位置($1)找到的任何參數(shù)與--alpha或-a匹配(這些是沒有特殊意義的任意選項名稱。在實際腳本中,可以使用--verbose和-v來觸發(fā)詳細輸出)。

shift關(guān)鍵字使所有參數(shù)移位1,這樣位置2($2)中的參數(shù)將移動到位置1($1)。當(dāng)沒有其他參數(shù)要處理時,將觸發(fā)else語句,這將中斷while循環(huán)。

在腳本的末尾,將$ALPHA的值打印到終端。

測試一下這個腳本:

$ bash ./test.sh --alpha
1
$ bash ./test.sh


$ bash ./test.sh -a
1

已正確檢測到該選項。

檢測Bash中的參數(shù)

但有一個問題:額外的參數(shù)被忽略。

$ bash ./test.sh --alpha foo
1
$

要捕獲不作為選項的參數(shù),可以將剩余參數(shù)轉(zhuǎn)儲到Bash數(shù)組中。

#!/bin/bash


while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done


echo $ALPHA


ARG=( "${@}" )
for i in ${ARG[@]}; do
    echo $i
done

測試一下修改后的腳本:

$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo


foo
$ bash ./test.sh --alpha foo bar
1
foo
bar

帶參數(shù)的選項

有些選項本身需要一個參數(shù)。例如,您可能希望允許用戶設(shè)置圖形的顏色或分辨率等屬性,或者將應(yīng)用程序指向自定義配置文件。

要在Bash中實現(xiàn)這一點,可以像使用布爾開關(guān)一樣使用shift關(guān)鍵字,但將參數(shù)移位2而不是1。

#!/bin/bash


while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
    CONFIG=$2
    shift 2
else
    break
fi
done


echo $ALPHA
echo $CONFIG


ARG=( "${@}" )


for i in ${ARG[@]}; do
    echo $i
done

在這段代碼中,我添加了一個elif子句來將每個參數(shù)與--config和-c進行比較。在匹配的情況下,名為CONFIG的變量的值被設(shè)置為第二個參數(shù)的值(這意味著--CONFIG選項需要一個參數(shù))。所有參數(shù)移位2:1移位--config或-c,1移位其參數(shù)。與往常一樣,循環(huán)會重復(fù),直到?jīng)]有匹配的參數(shù)。

下面是對新版本腳本的測試:

$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz

選項解析變得很容易

在Bash中還有其他解析選項的方法。您可以交替使用case語句或getopt命令。無論您選擇使用什么,用戶的選項都是任何應(yīng)用程序的重要特性,Bash使其變得簡單。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1657

    瀏覽量

    31873
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    382

    瀏覽量

    14760
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    10134
收藏 人收藏

    評論

    相關(guān)推薦

    【RT-Thread學(xué)習(xí)筆記】bash shell -e參數(shù)

    bash shell -e參數(shù)的含義與用途,你了解嗎?
    的頭像 發(fā)表于 07-28 05:20 ?1666次閱讀
    【RT-Thread學(xué)習(xí)筆記】<b class='flag-5'>bash</b> <b class='flag-5'>shell</b> -e<b class='flag-5'>參數(shù)</b>

    何在bash shell腳本中使用變量

    如果你使用編程語言編寫過程序,那么一定接觸過變量。而在 bash 腳本的編寫時,變量也是一個很重要的概念。今天我們分享一下如何在 bash 腳本
    發(fā)表于 12-02 16:32 ?1892次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>bash</b> <b class='flag-5'>shell</b><b class='flag-5'>腳本</b>中使用變量

    shell腳本編寫之本地腳本的編寫和執(zhí)行

    /scrip_test$ vim myshell.sh在該文件,添加:#!/bin/bashecho "my first shell !"其中#!/bin/bash
    發(fā)表于 08-28 09:36

    何在 Shell 腳本執(zhí)行語法檢查調(diào)試模式

    shell 腳本中發(fā)現(xiàn)有錯誤,shell 會在終端輸出錯誤,不然就不會顯示任何東西。激活語法檢查的命令如下:$ bash -n scri
    發(fā)表于 12-31 11:04

    【RT-Thread學(xué)習(xí)筆記】bash和dash-shell

    ? 最近在工作遇到一個很奇葩的問題,就是一個嵌入式的SDK編譯,它里面執(zhí)行shell命令的時候,使用的dash shell來解析,而通常我們默認用的是bash
    的頭像 發(fā)表于 07-30 13:49 ?1121次閱讀
    【RT-Thread學(xué)習(xí)筆記】<b class='flag-5'>bash</b>和dash-<b class='flag-5'>shell</b>

    Raspberry Pi Bash Shell 腳本簡介

      拋開潛在的麻煩不談,Bash 可以是一個非常強大的工具,讓您可以自動執(zhí)行各種任務(wù)。在即將發(fā)表的文章,我將展示如何使用 Bash 腳本以及一些硬件技巧來自動化我的 Raspberr
    的頭像 發(fā)表于 08-15 15:08 ?1058次閱讀
    Raspberry Pi <b class='flag-5'>Bash</b> <b class='flag-5'>Shell</b> <b class='flag-5'>腳本</b>簡介

    Bash腳本特殊變量$0是什么?

    Bash 腳本,`$0` 是一個特殊變量,它代表當(dāng)前腳本的路徑和名稱。這個變量用于表示腳本自身,它是
    的頭像 發(fā)表于 05-12 14:41 ?1743次閱讀

    分享249個拿來即用的shell腳本

    ? 由于腳本案例太多,在此僅展示部分,完整版領(lǐng)取方式請見文末 ? ? ? 249個拿來即用的shell腳本! ? 這249個Shell腳本
    的頭像 發(fā)表于 07-07 10:52 ?1040次閱讀
    分享249個拿來即用的<b class='flag-5'>shell</b><b class='flag-5'>腳本</b>

    BASH shell腳本篇—條件命令

    這篇文章介紹下BASH shell的條件相關(guān)的命令,包括:if, case, while, until, for, break, continue。
    的頭像 發(fā)表于 10-11 15:21 ?466次閱讀
    <b class='flag-5'>BASH</b> <b class='flag-5'>shell</b><b class='flag-5'>腳本</b>篇—條件命令

    BASH shell腳本篇—函數(shù)

    函數(shù)是代碼重用的最重要方式。Bash函數(shù)可以定義為一組命令,在bash腳本多次調(diào)用。
    的頭像 發(fā)表于 10-20 16:31 ?710次閱讀

    BASH shell腳本篇—文件處理介紹

    Bash Shell腳本,可以使用多種方法來對文件進行操作,包括讀取文件或?qū)懭胛募?/div>
    的頭像 發(fā)表于 10-23 16:51 ?480次閱讀

    如何利用shell進行腳本程序的設(shè)計?

    利用Shell進行腳本程序的設(shè)計可以按照以下步驟進行: 選擇Shell解釋器:在Unix和Linux系統(tǒng),通常會默認安裝一個或多個Shell
    的頭像 發(fā)表于 11-08 10:17 ?431次閱讀

    shell并行調(diào)用腳本

    Shell腳本,可以使用一些技巧來實現(xiàn)并行調(diào)用。以下是幾種常見的方法: 使用后臺進程:在Shell腳本
    的頭像 發(fā)表于 11-08 10:23 ?797次閱讀

    Shell腳本檢查工具ShellCheck介紹

    ShellCheck是一個用于bash/sh shell腳本的靜態(tài)分析工具,可以輔助檢查腳本語法錯誤,給出建議增強腳本健壯性。
    的頭像 發(fā)表于 12-27 13:43 ?1596次閱讀
    <b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>檢查工具ShellCheck介紹

    執(zhí)行shell腳本的方式包括什么

    執(zhí)行Shell腳本的方式有很多種,以下是一些常見的方法: 直接運行腳本文件 在命令行,可以直接使用腳本文件的路徑來運行
    的頭像 發(fā)表于 08-30 15:17 ?153次閱讀