1. 程式人生 > >shell中處理使用者輸入

shell中處理使用者輸入

1、使用命令列引數 在shell執行的時候命令列中輸入的所有引數可以賦值給一些特殊變數,這些變數成為位置變數引數。 包括:

$0返回指令碼名稱、$1為第一個引數、$2為第二個引數 ...$9第九個引數
在變數到9個之後,必須使用大括號將變數括起來
${10}第十個引數
$#是獲取傳入的引數數量
$*是獲取所有引數
[email protected]和$*類似

案例
[[email protected] sbin]# sh crname.sh a b c
指令碼的名字是:crname.sh
指令碼的引數1:a
指令碼的引數2:b
指令碼的引數3:c
指令碼的引數4:
--------------------------------一共有:3個引數
指令碼的引數1:a b c
[email protected]
和*的區別 指令碼的引數1:a 指令碼的引數2:b 指令碼的引數3:c [[email protected] 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 --------------------------------\
[email protected]
和\*的區別 for i in "[email protected]" do echo "指令碼的引數$v:$i" v=$[ $v + 1 ] done 總結--$*和[email protected]在同樣可以獲取所有傳入的引數,但是$*會把引數當成一個整體,而[email protected]則不會。

shift命令 使用shift命令能夠改變命令列引數的相對位置

例項
[[email protected] sbin]# sh shift.sh a b c d e
第一個引數:a和所有參個數:5
第一個引數:b和所有參個數:4
第一個引數:c和所有參個數:3
第一個引數:d和所有參個數:2
第一個引數:e和所有參個數:1
[
[email protected]
sbin]# cat shift.sh #!/bin/bash while [ -n "$*" ] do echo "第一個引數:$1和所有參個數:$#" shift done

2、設定選項 2.1 處理選項 處理一些簡單選項

使用case命令
[[email protected] sbin]# sh case.sh -c
選項-c
[[email protected] 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
[[email protected] sbin]# sh getopt.sh -ab test1 -c -f
-a
-b ----whit vale test1
-c
-?,whit vale f
[[email protected] 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
[[email protected] sbin]# sh getopt.sh -ab test -c -f 
-a
-b ----whit vale test
-c
-?,whit vale 5
[[email protected] 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
[[email protected] 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
[[email protected] 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秒     all      0.05      0.00      0.11      0.05      0.00     99.79
03時00分01秒     all      1.85      0.01      2.71      1.10      0.00     94.34
...
平均時間:     all      0.09      0.00      0.15      0.10      0.00     99.66
迴圈10次,這是第2次
---------------------------------------------------------
              total        used        free      shared  buff/cache   available
Mem:        4028400     1094528     1768200       15388     1165672     2548276
Swap:       2097148           0     2097148
迴圈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命令返回一個非零的狀態:
[[email protected] 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

[[email protected] 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秒     all      0.03      0.00      0.09      0.01      0.00     99.88
00時20分01秒     all      0.03      0.00      0.08      0.00      0.00     99.89
00時30分01秒     all      0.02      0.00      0.07      0.00      0.00     99.91
00時40分01秒     all      0.03      0.00      0.07      0.00      0.00     99.90
00時50分01秒     all      0.04      0.00      0.10      0.13      0.00     99.73
01時00分01秒     all      0.03      0.00      0.09      0.00      0.00     99.88
01時10分01秒     all      0.04      0.00      0.09      0.28      0.00     99.59
01時20分01秒     all      0.03      0.00      0.08      0.19      0.00     99.70
01時30分01秒     all      0.03      0.00      0.07      0.00      0.00     99.90
01時40分01秒     all      0.03      0.00      0.07      0.16      0.00     99.74
01時50分01秒     all      0.03      0.00      0.08      0.21      0.00     99.67
02時00分01秒     all      0.03      0.00      0.07      0.17      0.00     99.74
平均時間:     all      0.03      0.00      0.08      0.10      0.00     99.79

02時53分00秒       LINUX RESTART

03時00分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
03時10分01秒     all      0.05      0.00      0.18      0.08      0.00     99.69
平均時間:     all      0.05      0.00      0.18      0.08      0.00     99.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
---------------------------------------------------------
              total        used        free      shared  buff/cache   available
Mem:        4028400      934216     2329896       15292      764288     2742908
Swap:       2097148           0     2097148
迴圈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秒     all      0.03      0.00      0.09      0.01      0.00     99.88
00時20分01秒     all      0.03      0.00      0.08      0.00      0.00     99.89
00時30分01秒     all      0.02      0.00      0.07      0.00      0.00     99.91
00時40分01秒     all      0.03      0.00      0.07      0.00      0.00     99.90
00時50分01秒     all      0.04      0.00      0.10      0.13      0.00     99.73
01時00分01秒     all      0.03      0.00      0.09      0.00      0.00     99.88
01時10分01秒     all      0.04      0.00      0.09      0.28      0.00     99.59
01時20分01秒     all      0.03      0.00      0.08      0.19      0.00     99.70
01時30分01秒     all      0.03      0.00      0.07      0.00      0.00     99.90
01時40分01秒     all      0.03      0.00      0.07      0.16      0.00     99.74
01時50分01秒     all      0.03      0.00      0.08      0.21      0.00     99.67
02時00分01秒     all      0.03      0.00      0.07      0.17      0.00     99.74
平均時間:     all      0.03      0.00      0.08      0.10      0.00     99.79

02時53分00秒       LINUX RESTART

03時00分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
03時10分01秒     all      0.05      0.00      0.18      0.08      0.00     99.69
平均時間:     all      0.05      0.00      0.18      0.08      0.00     99.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命令,都會讀取檔案中的一行文字。

[[email protected] sbin]# vim read.sh 
[[email protected] 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秒     all      0.03      0.00      0.09      0.01      0.00     99.88
line 8:00時20分01秒     all      0.03      0.00      0.08      0.00      0.00     99.89
line 9:00時30分01秒     all      0.02      0.00      0.07      0.00      0.00     99.91
line 10:00時40分01秒     all      0.03      0.00      0.07      0.00      0.00     99.90
line 11:00時50分01秒     all      0.04      0.00      0.10      0.13      0.00     99.73
line 12:01時00分01秒     all      0.03      0.00      0.09      0.00      0.00     99.88
line 13:01時10分01秒     all      0.04      0.00      0.09      0.28      0.00     99.59
line 14:01時20分01秒     all      0.03      0.00      0.08      0.19      0.00     99.70
line 15:01時30分01秒     all      0.03      0.00      0.07      0.00      0.00     99.90
line 16:01時40分01秒     all      0.03      0.00      0.07      0.16      0.00     99.74
line 17:01時50分01秒     all      0.03      0.00      0.08      0.21      0.00     99.67
line 18:02時00分01秒     all      0.03      0.00      0.07      0.17      0.00     99.74
line 19:平均時間:     all      0.03      0.00      0.08      0.10      0.00     99.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------------------
[[email protected] 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 ------------------

簡書連結