使用shift關鍵字,寫一個帶二級命令的腳本(如:docker run -a -b -c中的run)

省流:shift關鍵字

探索思路

最近有一個小小的需求,寫一個類似于docker run -a -b -c這樣的腳本,這個腳本名為doline,它本身可以執行(doline -a -b -c),同時又帶有幾個如run、init、start這樣的參數,感覺有點說不明白,以下是幾種場景:

doline -a -b -c      # 直接傳參使用
doline -h            # 查看幫助文檔
doline init -a -b -c # 初始化一些參數,再次執行時可以不帶初始化的參數
doline init -h       # 查看關于'init'的幫助文檔
doline run -a -b -c  # ....

有多個類似于init、run這樣的二級命令,我之前在【Shell 腳本傳遞參數的兩種方式:位置傳參與指令式傳參】中詳細介紹了Shell的兩種傳參方式,因此我基于這兩種方式開始探索,并有了初步的想法(實操之后發現并不可以)。
首先使用最簡單的位置傳參,判斷$1的值是不是init、run這樣的參數,如果不是的話直接getopts如果是的話就在init下面再進行一次getopts,并且在init的結尾進行exit
偽代碼大概如下:

## 如果是 doline init -a 123 -b 123 -c 123 就執行下面的代碼
if [ $1 = 'init' ] ; thenwhile getopts ":a:b:c:h" optdocase $opt ina)....;;?)echo '未知參數';exit 1;;;esacdoneexit 0;
fi## 如果是 doline -a 123 -b 123 -c 123 就執行下面的代碼
while getopts ":a:b:c:h" opt
docase $opt ina)....;;?)echo '未知參數';exit 1;;;esac
done

但是,實操之后失敗了,如果是直接doline -a -b -c是可以的,但是doline init的話就全部執行失敗,我在代碼起始的位置輸出所有的參數echo $*,參數是init -a -b -c,這樣的話init也占了一個位置,后面的所有參數都對不上位置了,顯然是不行的,但是邏輯上是可以的。

成功案例

這時候就要想辦法,比如是否有其他的參數獲取方式?或者如何在判斷是init之后給init這個參數刪除掉呢?經過一番查找,找到了一個十分關鍵的關鍵詞shift切換。

shift 的原理:
如果你輸入的參數是init -a -b -c,在讀取init之后進行shift,參數列表就變為-a -b -c,這個時候就能對應上了。

這個時候只需要對上面的內容稍加改在,在判斷第一個參數是init之后,立刻進行shift就可以了,更改后的腳本如下:

if [ $1 = 'init' ] ; thenshift; # 重讀取過的$1之后開始判斷命令while getopts ":a:b:c:h" optdocase $opt ina)....;;?)echo '未知參數';exit 1;;;esacdoneexit 0;
fi## 如果是 doline -a 123 -b 123 -c 123 就執行下面的代碼
while getopts ":a:b:c:h" opt
docase $opt ina)....;;?)echo '未知參數';exit 1;;;esac
done

以上代碼在判斷第一個參數是init之后,會立刻進行shift,后面的內容就會一一對應起來了。

簡單驗證

寫個簡單的腳本,驗證一下:

#!/bin/bashif [ $1 = 'init' ] ; then echo $* ;exit 0;
fiif [ $1 = 'run' ] ; thenshift; ## SHIFT 在這里echo $*;exit 0;
fi

期望輸出:

執行./testShift init -a -b -c輸出init -a -b -c
執行./testShift run -a -b -c輸出-a -b -c

在這里插入圖片描述
驗證成功!!

參考

Tomcat 啟動腳本

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

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

相關文章

Qt 之 QWidget QLabel

文章目錄 前言一、Qt 工程介紹二、窗口組件1. QWidget 組件2. QLabel組件 總結 前言 一、Qt 工程介紹 Qt Creator 以工程項目的方式對源碼進行管理一個Qt Creator工程包含不同類型的文件 。 .pro 項目描述文件.pro.user用戶配置描述文件- .h頭文件.cpp源文件.ui界面描述文件資…

verilog 實現異步fifo

理論知識參考 異步FIFO_Verilog實現_verilog實現異步fifo_Crazzy_M的博客-CSDN博客 代碼 /* 位寬8bit, 位深8 */ module async_fifo#(parameter FIFO_DEPTH 8,parameter FIFO_WIDTH 8 ) (input rst_n,input wr_clk,input wr_en,input [FIFO_WIDTH - 1:0…

Chrome小技巧---多用戶登錄同一網站不串信息

測試中經常需要用到瀏覽器需要登錄多個賬號 但是有一個問題就是會串號 通過添加不同的用戶再用這用戶登錄,就不串號了: 還可以在瀏覽器的偏好設置中添加啟動地址 這樣每次打開,就進到設置的地址中了

el-table自適應縮放大小

安裝依賴 npm install --save vue-draggable-resizable //或 cnpm install --save vue-draggable-resizablemain.js引入依賴 import VueDraggableResizable from vue-draggable-resizable import "vue-draggable-resizable/dist/VueDraggableResizable.css"; Vue.c…

基于Redis實現全局唯一Id

微信公眾號訪問地址:基于Redis實現全局唯一Id 推薦文章: 1、使用原生Redis命令實現分布式鎖 ? 2、為什么引入Redisson分布式鎖? 3、SpringBoot整合多數據源,并支持動態新增與切換(詳細教程) 4、Sprin…

JVM 查看配置 jinfo 及使用 jstat,查看堆棧jstack及GC

1. Jinfo 查看正在運行的Java應用程序的擴展參數: 包含 JVM 參數與 java 系統參數 命令: jinfo pid 2 jstat 查看堆內存使用情況及 GC 回收頻率等: jstat [-命令選項] [vmid] [間隔時間(毫秒)] [查詢次數] 2.1 jstat -gc pid 最常用,可…

C語言必會題目(2)

W...Y的主頁 😊 代碼倉庫分享💕 今天繼續分享C語言必會的題目,上一篇文章主要是一些選擇題,而今天我們主要內容為編程題的推薦與講解 準備好迎接下面的題了嗎?開始發車了!!! 輸入…

OSI參考模型及TCP/IP協議棧

一、網絡概述 1.1、什么是網絡? 1、網絡的本質就是實現資源共享 2、將各個系統聯系到一起,形成信息傳遞、接收、共享的信息交互平臺 1.2、典型的園區網拓撲 1.3、網絡歷史發展,ARPA和ARPANET 1、1969年,美國國防部高級研究計…

前后端分離------后端創建筆記(03)前后端對接(下)

本文章轉載于【SpringBootVue】全網最簡單但實用的前后端分離項目實戰筆記 - 前端_大菜007的博客-CSDN博客 僅用于學習和討論,如有侵權請聯系 源碼:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

數據結構--棧和隊列3.1(棧-順序結構)

目錄 棧(Stack)棧頂(top)棧底(bottom)空棧(不含任何元素) 創建棧 入棧操作 出棧操作 銷毀一個棧 計算棧的當前容量 實例分析 棧的插入操作叫做進棧(Push&#xf…

基于Mybatis Plus的SQL輸出攔截器。完美的輸出打印 SQL 及執行時長、statement

我們需要想辦法打印出完成的SQL,Mybatis為我們提供了 org.apache.ibatis.plugin.Interceptor接口,我們來實現該接口做一些打印SQL的工作 package org.springjmis.core.mp.plugins;import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; impor…

創新零售,京東重新答題?

繼新一輪組織架構調整后,京東從低價到下沉動作不斷。 新成立的創新零售部在京東老將閆小兵的帶領下悄然完成了整合。近日,京喜拼拼已改名為京東拼拼,與七鮮、前置倉等業務共同承載起京東線上線下加速融合的夢想。 同時,拼拼的更…

【從零學習python 】19. 循環遍歷列表和列表嵌套的應用

文章目錄 列表的循環遍歷1. 使用while循環2. 使用for循環3. 交換2個變量的值1. 列表嵌套2. 應用 進階案例 列表的循環遍歷 1. 使用while循環 為了更有效率的輸出列表的每個數據,可以使用循環來完成 namesList [xiaoWang,xiaoZhang,xiaoHua] length len(namesLi…

零售行業供應鏈管理核心KPI指標(一) – 能力、速度、效率和成本

有關零售行業供應鏈管理KPI指標的綜合性分享,涉及到供應鏈能力、速度、效率和成本總共九大指標,是一個大框架,比較核心也比較綜合。 衡量消費品零售企業供應鏈管理效率和水平的核心KPI通常有哪些? 圖片來源-派可數據(…

C++ unique_ptr概述 常用操作

文章目錄 unique_ptr概述unique_ptr常用操作 unique_ptr概述 uniue_ptr是一個獨占式的指針,同一個時刻, 就只能有一個unique_ptr指向這個對象(內存),unique_ptr的使用格式 unique_ptr<Class_Tyep> P_Name; unique_ptr的常規初始化: unique_ptr<int> p; 創建一個空…

監控Kafka的關鍵指標

Kafka 架構 上面綠色部分 PRODUCER&#xff08;生產者&#xff09;和下面紫色部分 CONSUMER&#xff08;消費者&#xff09;是業務程序&#xff0c;通常由研發人員埋點解決監控問題&#xff0c;如果是 Java 客戶端也會暴露 JMX 指標。組件運維監控層面著重關注藍色部分的 BROKE…

Vue 實現重定向、404和路由鉤子(六)

一、重定向 1.1 修改 Main.vue <template><div><el-container><el-aside width"200px"><el-menu :default-openeds"[1]"><el-submenu index"1"><template slot"title"><i class"…

MongoDB常用命令

什么是MongoDB ? MongoDB 是由C語言編寫的&#xff0c;是一個基于分布式文件存儲的開源數據庫系統。 在高負載的情況下&#xff0c;添加更多的節點&#xff0c;可以保證服務器性能。 MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 MongoDB 將數據存儲為一個…

【網絡基礎實戰之路】基于BGP協議中的聯邦號連接三個AS區域的實戰詳解

系列文章傳送門&#xff1a; 【網絡基礎實戰之路】設計網絡劃分的實戰詳解 【網絡基礎實戰之路】一文弄懂TCP的三次握手與四次斷開 【網絡基礎實戰之路】基于MGRE多點協議的實戰詳解 【網絡基礎實戰之路】基于OSPF協議建立兩個MGRE網絡的實驗詳解 【網絡基礎實戰之路】基于…

Dalsa線陣相機說明(Linea Color GigESeries 2k and 4K)

文章目錄 一. Dalsa相機軟件整體架構二. 相機編號說明以及軟件要求三. 相機硬件參數三. 相機基本參數四. 軟件參數設置列表1. Sensor Control Category2. I/O Control Category3. Counter and Timer Control Category4. Advanced Processing Control Category(1) 平場校正介紹(…