shell中處理使用者輸入
1、使用命令列引數
在shell執行的時候命令列中輸入的所有引數可以賦值給一些特殊變數,這些變數成為位置變數引數。
包括:
$0返回指令碼名稱、$1為第一個引數、$2為第二個引數 ...$9第九個引數 在變數到9個之後,必須使用大括號將變數括起來 ${10}第十個引數 $#是獲取傳入的引數數量 $*是獲取所有引數 $@和$*類似 案例 [root@hzy sbin]# sh crname.sh a b c 指令碼的名字是:crname.sh 指令碼的引數1:a 指令碼的引數2:b 指令碼的引數3:c 指令碼的引數4: --------------------------------一共有:3個引數 指令碼的引數1:a b c --------------------------------$@和*的區別 指令碼的引數1:a 指令碼的引數2:b 指令碼的引數3:c [root@hzy sbin]# cat crname.sh #!/bin/bash echo 指令碼的名字是:$0 echo 指令碼的引數1:$1 echo 指令碼的引數2:$2 echo 指令碼的引數3:$3 echo 指令碼的引數4:$4 sleep 5 vv=1 for i in "$*" do echo --------------------------------一共有:$#個引數 echo "指令碼的引數$vv:$i" vv=$[ $vv + 1 ] done sleep 2 v=1 echo --------------------------------\$@和\*的區別 for i in "$@" do echo "指令碼的引數$v:$i" v=$[ $v + 1 ] done 總結--$*和$@在同樣可以獲取所有傳入的引數,但是$*會把引數當成一個整體,而$@則不會。
shift命令
使用shift命令能夠改變命令列引數的相對位置
例項 [root@hzy sbin]# sh shift.sh a b c d e 第一個引數:a和所有參個數:5 第一個引數:b和所有參個數:4 第一個引數:c和所有參個數:3 第一個引數:d和所有參個數:2 第一個引數:e和所有參個數:1 [root@hzy sbin]# cat shift.sh #!/bin/bash while [ -n "$*" ] do echo "第一個引數:$1和所有參個數:$#" shift done
2、設定選項
2.1 處理選項
處理一些簡單選項
使用case命令 [root@hzy sbin]# sh case.sh -c 選項-c [root@hzy sbin]# cat case.sh #!/bin/bash while [ -n "$1" ];do case $1 in -d)echo 選項-d ;; -c)echo 選項-c ;; -a)echo 選項-a ;; *) echo 其他 ;; esac shift done 這裡設定shift命令讓shell解釋$1移位後$0的值,就會退出迴圈
2.2 getopts命令的用法
getopts和getopt功能相似但又不完全相同,其中getopt是獨立的可執行檔案,而getopts是由Bash內建的。
getopts命令使用的是倆個環境變數: OPTARG-中包含需要引數值的選項要使用的值 OPTIND-中包含的值表示getopts停止處理時在引數列表中的位置 先來看看引數傳遞的典型用法: * ./test.sh -a -b -c: 短選項,各選項不需引數 * ./test.sh -abc: 短選項,和上一種方法的效果一樣,只是將所有的選項寫在一起。 * ./test.sh -a args -b -c :短選項,其中-a需要引數,而-b -c不需引數。 * ./test.sh --a-long=args --b-long :長選項 貌似getopts不支援長選項 案例1 [root@hzy sbin]# sh getopt.sh -ab test1 -c -f -a -b ----whit vale test1 -c -?,whit vale f [root@hzy sbin]# cat getopt.sh #!/bin/bash while getopts :ab:c opt do case "$opt" in a) echo -a ;; b) echo -b ----whit vale $OPTARG ;; c) echo -c ;; ?) echo -?,whit vale $OPTARG ;; esac done 案例2 [root@hzy sbin]# sh getopt.sh -ab test -c -f -a -b ----whit vale test -c -?,whit vale 5 [root@hzy sbin]# cat getopt.sh #!/bin/bash while getopts :ab:c opt do case "$opt" in a) echo -a ;; b) echo -b ----whit vale $OPTARG ;; c) echo -c ;; ?) echo -?,whit vale $OPTIND ;; esac done
3、獲取使用者輸入
有時指令碼在執行過程中需要詢問一個問題並等待執行指令碼人員的應答時,bash shell提供的read命令可以解決這個問題。
案例1 [root@hzy sbin]# cat test.sh #!/bin/bash echo 輸入c/C顯示cpu負載 echo 輸入m/M顯示記憶體大小 echo 輸入p/P檢視磁碟讀寫 for i in `seq 1 10 `; do echo "迴圈10次,這是第$i次"; read pattion echo "---------------------------------------------------------" case $pattion in c | C) uptime ;; m | M) free ;; P | p) sar ;; *) echo "請輸入c/m/p檢視" esac done > cmp.txt [root@hzy sbin]# cat cmp.txt 迴圈10次,這是第1次 --------------------------------------------------------- Linux 3.10.0-862.14.4.el7.x86_64 (hzy)2018年10月06日_x86_64_(2 CPU) 02時36分56秒LINUX RESTART 02時40分01秒CPU%user%nice%system%iowait%steal%idle 02時50分02秒all0.050.000.110.050.0099.79 03時00分01秒all1.850.012.711.100.0094.34 ... 平均時間:all0.090.000.150.100.0099.66 迴圈10次,這是第2次 --------------------------------------------------------- totalusedfreesharedbuff/cacheavailable Mem:4028400109452817682001538811656722548276 Swap:209714802097148 迴圈10次,這是第3次 --------------------------------------------------------- 15:55:58 up 13:19,5 users,load average: 0.04, 0.03, 0.05 迴圈10次,這是第4次 --------------------------------------------------------- 請輸入c/m/p檢視 迴圈10次,這是第5次 --------------------------------------------------------- 請輸入c/m/p檢視 迴圈10次,這是第6次 --------------------------------------------------------- 請輸入c/m/p檢視 迴圈10次,這是第7次 --------------------------------------------------------- 請輸入c/m/p檢視 迴圈10次,這是第8次 --------------------------------------------------------- 請輸入c/m/p檢視 迴圈10次,這是第9次 --------------------------------------------------------- 請輸入c/m/p檢視 迴圈10次,這是第10次 --------------------------------------------------------- 請輸入c/m/p檢視 案例2 使用計時-t指定read命令等待輸入的時間。當計時器數值滿了時,read命令返回一個非零的狀態: [root@hzy sbin]# cat test.sh #!/bin/bash echo 輸入c/C顯示cpu負載 echo 輸入m/M顯示記憶體大小 echo 輸入p/P檢視磁碟讀寫 for i in `seq 1 10 `; do echo "迴圈10次,這是第$i次"; if read -t 5 pattion ;then echo "5秒內輸入個引數:$pattion" else pattion=c echo "輸出預設值:" fi echo "---------------------------------------------------------" case $pattion in c | C) uptime ;; m | M) free ;; P | p) sar ;; *) echo "請輸入c/m/p檢視" esac done > uer.txt [root@hzy sbin]# cat uer.txt 迴圈10次,這是第1次 5秒內輸入個引數:p --------------------------------------------------------- Linux 3.10.0-862.14.4.el7.x86_64 (hzy)2018年10月08日_x86_64_(2 CPU) 00時00分01秒CPU%user%nice%system%iowait%steal%idle 00時10分01秒all0.030.000.090.010.0099.88 00時20分01秒all0.030.000.080.000.0099.89 00時30分01秒all0.020.000.070.000.0099.91 00時40分01秒all0.030.000.070.000.0099.90 00時50分01秒all0.040.000.100.130.0099.73 01時00分01秒all0.030.000.090.000.0099.88 01時10分01秒all0.040.000.090.280.0099.59 01時20分01秒all0.030.000.080.190.0099.70 01時30分01秒all0.030.000.070.000.0099.90 01時40分01秒all0.030.000.070.160.0099.74 01時50分01秒all0.030.000.080.210.0099.67 02時00分01秒all0.030.000.070.170.0099.74 平均時間:all0.030.000.080.100.0099.79 02時53分00秒LINUX RESTART 03時00分01秒CPU%user%nice%system%iowait%steal%idle 03時10分01秒all0.050.000.180.080.0099.69 平均時間:all0.050.000.180.080.0099.69 迴圈10次,這是第2次 5秒內輸入個引數:c --------------------------------------------------------- 03:13:59 up 21 min,4 users,load average: 0.00, 0.03, 0.11 迴圈10次,這是第3次 5秒內輸入個引數:m --------------------------------------------------------- totalusedfreesharedbuff/cacheavailable Mem:40284009342162329896152927642882742908 Swap:209714802097148 迴圈10次,這是第4次 輸出預設值: --------------------------------------------------------- 03:14:06 up 21 min,4 users,load average: 0.00, 0.03, 0.11 迴圈10次,這是第5次 5秒內輸入個引數:p --------------------------------------------------------- Linux 3.10.0-862.14.4.el7.x86_64 (hzy)2018年10月08日_x86_64_(2 CPU) 00時00分01秒CPU%user%nice%system%iowait%steal%idle 00時10分01秒all0.030.000.090.010.0099.88 00時20分01秒all0.030.000.080.000.0099.89 00時30分01秒all0.020.000.070.000.0099.91 00時40分01秒all0.030.000.070.000.0099.90 00時50分01秒all0.040.000.100.130.0099.73 01時00分01秒all0.030.000.090.000.0099.88 01時10分01秒all0.040.000.090.280.0099.59 01時20分01秒all0.030.000.080.190.0099.70 01時30分01秒all0.030.000.070.000.0099.90 01時40分01秒all0.030.000.070.160.0099.74 01時50分01秒all0.030.000.080.210.0099.67 02時00分01秒all0.030.000.070.170.0099.74 平均時間:all0.030.000.080.100.0099.79 02時53分00秒LINUX RESTART 03時00分01秒CPU%user%nice%system%iowait%steal%idle 03時10分01秒all0.050.000.180.080.0099.69 平均時間:all0.050.000.180.080.0099.69 迴圈10次,這是第6次 輸出預設值: --------------------------------------------------------- 03:14:16 up 21 min,4 users,load average: 0.00, 0.03, 0.11 迴圈10次,這是第7次 5秒內輸入個引數:c --------------------------------------------------------- 03:14:19 up 21 min,4 users,load average: 0.00, 0.03, 0.11 迴圈10次,這是第8次 輸出預設值: --------------------------------------------------------- 03:14:24 up 22 min,4 users,load average: 0.00, 0.03, 0.11 迴圈10次,這是第9次 輸出預設值: --------------------------------------------------------- 03:14:29 up 22 min,4 users,load average: 0.00, 0.03, 0.11 迴圈10次,這是第10次 5秒內輸入個引數: --------------------------------------------------------- 請輸入c/m/p檢視
4、讀取檔案
同樣利用read命令可以讀取linux系統中的檔案資料,每次呼叫一次read命令,都會讀取檔案中的一行文字。
[root@hzy sbin]# vim read.sh [root@hzy sbin]# sh read.sh line 1:迴圈10次,這是第1次 line 2:5秒內輸入個引數:p line 3:--------------------------------------------------------- line 4:Linux 3.10.0-862.14.4.el7.x86_64 (hzy)2018年10月08日_x86_64_(2 CPU) line 5: line 6:00時00分01秒CPU%user%nice%system%iowait%steal%idle line 7:00時10分01秒all0.030.000.090.010.0099.88 line 8:00時20分01秒all0.030.000.080.000.0099.89 line 9:00時30分01秒all0.020.000.070.000.0099.91 line 10:00時40分01秒all0.030.000.070.000.0099.90 line 11:00時50分01秒all0.040.000.100.130.0099.73 line 12:01時00分01秒all0.030.000.090.000.0099.88 line 13:01時10分01秒all0.040.000.090.280.0099.59 line 14:01時20分01秒all0.030.000.080.190.0099.70 line 15:01時30分01秒all0.030.000.070.000.0099.90 line 16:01時40分01秒all0.030.000.070.160.0099.74 line 17:01時50分01秒all0.030.000.080.210.0099.67 line 18:02時00分01秒all0.030.000.070.170.0099.74 line 19:平均時間:all0.030.000.080.100.0099.79 line 20: line 21:02時53分00秒LINUX RESTART line 22: line 23:03時00分01秒CPU%user%nice%system%iowait%steal%idle ^C------------------ [root@hzy sbin]# cat read.sh #!/bin/bash count=1 cat uer.txt | while read line do echo "line $count:$line" count=$[ $count + 1 ] sleep 1 done echo ------------------