shell基礎05 處理用戶輸入

1.? 命令行參數------類似javac? 參數1 參數2

? ? ?類似Java中編譯的javac parm1....。在shell中,參數與參數之間用空格隔開。采用位置參數來識別對應的參數值:$0是程序名,$1是第一個參數,以此類推,知道第9個參數$9。對于大于9個參數的需要在變量數字周圍添加花括號,比如${10}。

? ? ?note:命令行上不僅可以處理數值,還可以處理字符串。

 1 [Hermioner@localhost Documents]$ cat test2.sh
 2 #!/bin/bash
 3 total=$[ $1*$2 ]
 4 echo The first parm is $1
 5 echo The second parm is $2
 6 a=$3
 7 echo the third parm is $3
 8 b=$4
 9 echo the forth parm is $4
10 [Hermioner@localhost Documents]$ bash test2.sh 2 3 "hello world" min
11 The first parm is 2
12 The second parm is 3
13 the third parm is hello world
14 the forth parm is min
View Code
1 [Hermioner@localhost Documents]$ cat test3
2 #!/bin/bash
3 echo the tenth parm is ${10}
4 echo the eleventh parm is ${11}
5 [Hermioner@localhost Documents]$  bash test3 1 2 3 4 5 6 7 8 9 10 11
6 the tenth parm is 10
7 the eleventh parm is 11
8 [Hermioner@localhost Documents]$ 
View Code

? ? ? note: $0返回腳本名,如果用bash,就只返回腳本名;如果./腳本來運行,返回當前路徑名;? 因此,還可以嘗試basename命令來返回不包含路徑的腳本名。

2. $#,$*,$@,${!#}

? ? s#? ? ? 用來統計命令行的參數個數

? ? s*? ? ? ?用來訪問所有的命令行參數,并且構成一個字符串整體輸出

? ? s@? ? ?同s*,只是結果是分散成字符串數組,每個數組中的元素都是一個參數

? ? ${!#}? ?代表的最后一個參數,因為花括號中不可以用$,因此用!來代替它

 1 [Hermioner@localhost Documents]$ cat testfile
 2 #!/bin/bash
 3 echo the "\$*" is  $*
 4 echo the "\$@" is $@
 5 echo the "\$#" is $#
 6 echo the "\${!#}" is ${!#}
 7 
 8 [Hermioner@localhost Documents]$ bash testfile a b c d
 9 the $* is a b c d
10 the $@ is a b c d
11 the $# is 4
12 the ${!#} is d
View Code
 1 [Hermioner@localhost Documents]$ cat testfile
 2 #!/bin/bash
 3 echo
 4 count=1
 5 for param in "$*"
 6 do 
 7    echo "\$* Parameter #$count = $param"
 8    count=$[ $count+1 ]
 9 done
10 
11 echo
12 count=1
13 for param in "$@"
14 do
15    echo "\$@ Parameter #$count = $param"
16    count=$[ $count+1 ]
17 done
18 
19 [Hermioner@localhost Documents]$ bash testfile a b c d
20 
21 $* Parameter #1 = a b c d
22 
23 $@ Parameter #1 = a
24 $@ Parameter #2 = b
25 $@ Parameter #3 = c
26 $@ Parameter #4 = d
27 [Hermioner@localhost Documents]$ 
View Code

3. shift 移動變量??

? ? ?shift可以用來在不知道有多少參數,以及每個參數的值的情況下進行遍歷,因為它始終可以只打印第一個值。默認情況下它會將每個參數變量向左移動一個位置。所以變量$3的值會移動到$2中,$2的值會移動到$1中,而變量$1的值則會被刪除(note:$0代表程序嗎,不會改變)

? ? ?也可以shift n 來指定左移動多少個,eg: shift 2? ?,則$3的會移動到$1中,這樣就可以跳過一些值不遍歷了。

1 [Hermioner@localhost Documents]$ cat test3.sh
2 #!/bin/bash
3 echo "the original parameters is $*"
4 shift 2
5 echo "the new first parameter is $1"
6 [Hermioner@localhost Documents]$ bash test3.sh 1 2 3 4 5
7 the original parameters is 1 2 3 4 5
8 the new first parameter is 3
9 [Hermioner@localhost Documents]$
View Code

? ? ?note:配合shift的使用,同樣可以通過shell腳本中的邏輯來判斷是選項還是參數,從而讓參數得到應有的輸出。并在在bash shell中還提供了getopt和getopts來判斷是選項還是參數-------用時參考它們用法即可。

4. 獲取用戶輸入-------交互性更強,類似java中的scanner+system.in用法

? ? 采用read命令。read后面跟變量名,就可以將輸入的值保存到變量中;如果不輸入變量名,那么就自動保存在了特殊環境變量REPLY中。

1 [Hermioner@localhost Documents]$ cat test1
2 #!bin/bash
3 echo -n "Enter your name:"
4 read name
5 echo "hello $name"
6 [Hermioner@localhost Documents]$ bash test1
7 Enter your name:Tom
8 hello Tom
9 [Hermioner@localhost Documents]$ 
View Code

? ? ? note1:如果用戶一直不輸入,read會一直等待,因此可以設置計時器,用-t選項。時間過了,就不等了。

? ? ? eg:read -t 5 name

? ? ? note2: 類似密碼輸入,隱藏方式讀取,只需要添加 -s就可以

? ? ? note3: 還可以從文件中讀取,一行一行的讀取

 1 [Hermioner@localhost Documents]$ cat test1
 2 #!bin/bash
 3 a
 4 b
 5 c
 6 [Hermioner@localhost Documents]$ cat test2
 7 #!/bin/bash
 8 cat test1 | while read line    #采用了管道
 9 do
10     echo "the line is $line"
11 done
12 echo "read is done"
13 [Hermioner@localhost Documents]$ bash test2
14 the line is #!bin/bash
15 the line is a
16 the line is b
17 the line is c
18 read is done
19 [Hermioner@localhost Documents]$ 
View Code

補充管道:

? ? ?command1 | command2? ?就是將命令1的輸出重定向到了command2中。 可以多級重定向,多添加|就好了。

?

參考文獻

Linux命令行與shell腳本編程大全(第3版)[美]?布魯姆(Richard Blum),布雷斯納漢(Christine Bresnahan) 著,門佳,武海峰?譯

?

轉載于:https://www.cnblogs.com/Hermioner/p/9383629.html

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

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

相關文章

OpenCV 2.4.0 正式版發布,開源計算機視覺庫

OpenCV 于近日發布了 2.4.0 正式版。 OpenCV是一個基于BSD許可證授權發行的跨平臺開源計算機視覺庫,可以運行在Linux、Windows和Mac OS操作系統上。作為一款簡潔而且高效的視覺庫,OpenCV由一系列 C 函數和少量 C 類構成,同時提供了Python、Ru…

最小編輯代價-golang

題目: 給定兩個字符串str1和str2,在給定三個整數ic,dc和rc,分別代表插入、刪除和替換一個 字符,返回將str1編輯成str2的最小代價。 解題方法: 動態規劃。首先生成大小為(M1)X(N1)的矩陣dp。 假設str1"avb12cd3", str2&q…

You can't specify target table 'TS_AUTH_ADMIN' for update in FROM clause記錄

1. 報錯:You cant specify target table TS_AUTH_ADMIN for update in FROM clause, 百度查到說是,不能在同一語句中先select出同一表中的某些值,再update這個表 。 我原本的sql是:(刪除角色的時候&#…

study of javaserver faces lifecycle

JavaServer Faces應用程序的生命周期在客戶端為頁面發出HTTP請求時開始,并在服務器響應該頁面并轉換為HTML時結束。 通常將JSF的生命周期分為兩個階段: #執行階段 #渲染階段 1.執行階段 JavaServer Faces應用程序生命周期執行階段包含以下子階段&#xf…

從開源軟件開發中體會到的心得

Mitchell Hashimoto 是一名開源軟件工程師。由他托管到 GitHub 上的 開源項目 Vagrant,是一個用于創建和部署虛擬化開發環境的工具。近日,Mitchell撰文講述了在開發 Vagrant 的過程中學到的有關開源軟件開發的一些心得。 以下為原文文章: 把 …

學成在線--25.課程圖片管理(圖片查詢)

文章目錄一. 需求分析二. API三. 服務端開發1. Dao2. Service3. Controller四. 前端開發1. API方法2. 頁面一. 需求分析 課程圖片上傳成功,再次進入課程上傳頁面應該顯示出來已上傳的圖片。 二. API 在課程管理服務定義查詢方法 文件位置:xcEduServic…

redux源碼解讀

背景 因為就得去實習了。所以打算開始補補坑。比如自己閱讀源碼的計劃。所以今天來聊聊redux的源碼。后續會有redux-thunk和react-redux的源碼閱讀。搞定這些的話,就開始閱讀一個node的庫的源碼了,比如eventproxy和anywhere。 開始 總覽, redux的文件結構…

sql語句update中多個case/when的寫法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 又如: update xxxx_xxxx set xxx_typeCASE WHEN xxx_type 0 THENYXLX-0WHEN xxx_type 1 THENYXLX-1WHEN xxx_type 2 THE…

Redis-ha(sentinel)搭建

服務器描述:本次搭建是用來測試,所以是在一臺服務器上搭建三個redis服務(一主兩從) 服務角色 端口 Redis.conf名稱 sentinel配置文件名稱 sentinel端口 redis日志路徑 sentinel路勁 主(master) 6379 redis.conf sentine…

學成在線--26.課程圖片管理(圖片刪除)

文章目錄一. 需求分析二. API三. 服務端開發1. Dao2. Service3. Controller四. 前端開發1. API方法2. 頁面1.before-remove鉤子方法2.handleRemove鉤子方法一. 需求分析 課程圖片上傳成功后,可以重新上傳,方法是先刪除現有圖片再上傳新圖片;…

警惕開源代碼庫中的安全隱患

最近的一項研究發現, 在調查的31個流行庫(框架)的1261個版本中,超過三分之一存在已知的安全漏洞,大約四分之一的下載文件已經被污染。 該項研究由Aspect Security和Sonatype發起。Aspect Security是一家評估軟件安全漏…

jsp注釋

jsp注釋 <%--注釋內容--%> html注釋 <!--注釋內容-->

線程間的協作(3)——管道輸入/輸出流

2019獨角獸企業重金招聘Python工程師標準>>> 1.管道輸入/輸出流類 分為兩類&#xff0c;字節流管道類&#xff08;PipedInputStream/PipedOutputStream&#xff09;和字符流管道類&#xff08;PipedReader/ PipedWriter&#xff09;。這兩個IO流實現了可以在不同的任…

windows簡易版本 Redis 使用 demo樣例(ssm框架下)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 在網上下載 windows 版本 的Redis 。下載了直接解壓出來 &#xff1a; 2. 雙擊 redis-server.exe 啟動服務&#xff08;如下圖&#…

Redhat7.3安裝配置Telnet詳細教程

請參考&#xff1a;https://blog.csdn.net/weixin_39934520/article/details/84835949 謝謝樓主分享&#xff01;

程序員的半衰期只有15年?

曾在Google工作負責過技術工作的科技編輯 Matt Heusser總結了他在Google的生活經歷&#xff0c;得出結論&#xff1a; 作為程序員&#xff0c;你只有15年時間。Matt 寫道當我在Google工作時&#xff0c;發現Google大部分人都是20出頭的年輕人&#xff0c;他們經歷的很多事情都是…

EasyNVR、EasyDSS二次開發之:RTMP、HLS流在web頁面進行無插件播放示例Demo代碼

不管是基于EasyNVR還是EasyDSS&#xff0c;都是支持無插件直播&#xff0c;這也是未來視頻直播的一個趨勢。對于傳統的瀏覽器插件播放誰用誰知道&#xff1b; 以上是軟件自帶播放展示 背景需求 對于EasyNVR和EasyDSS的使用方式大概分為兩大類&#xff0c;一類是直接將軟件作為視…

jsp中%@ % 與% % 與%! %

<% %> 有個符號的&#xff0c;叫做指令用來提供整個JSP 網頁相關的信息&#xff0c;并且用來設定JSP網頁的相關屬性&#xff0c; 例如&#xff1a;網頁的編碼方式、語法、信息等。<% %>這個叫做小腳本&#xff0c;是寫java代碼的<%! %>這個是jsp中腳本聲明&a…

Hadoop的學習路線圖

目錄&#xff1a;.1.Hadoop家族產品2.Hadoop家族學習路線圖 Hadoop家族產品截止到2013年&#xff0c;根據cloudera的統計&#xff0c;Hadoop家族產品已經達到20個&#xff01;接下來&#xff0c;我把這20個產品&#xff0c;分成了2類。?第一類&#xff0c;是我已經掌握的?第二…