shell 指令碼自動化
在日常編寫shell指令碼時,我們通過需要讀取互動輸入的資料來控制程式執行。但是當用戶輸入的這些資料是固定的時候我們可以使這種半自動互動執行方式變成自動執行。
首先寫一個互動式輸入的指令碼:
#!/bin/bash/
# filename:interactive.sh
read -p "Enter your name :" Name;
read -p "Enter your age: " Age
read -p "Enter your fav: " Fav
echo You hava entered $Name , $Age, $Fav
可以按照以下方式命令自動傳送輸入:
$ echo -e "Jim\n18\nfootball\n" | ./interactive.sh
$ You hava entered Jim , 18, football
就這樣輸入生效了,如果執行 ./interactive.sh 就要分三步輸入Jim , 18, football
使用echo -e 可以生成輸入序列,如果輸入的內容比較多,那麼可以通過先輸入檔案再用重定向的方式提供輸入,如下:
$ echo -e "Jim\n18\nfootball\n" > input.data
$ cat input.data
$ Jim
$ 18
$ football
然後通過檔案來進行輸入重定向
$ ./interactive.sh < input.data
$ You hava entered Jim , 18, football
主要直接通過檔案匯入互動式輸入資料, 有時也可以通過這種方式來輸入鍵盤無法輸入的有些鍵值
有時候手動配置的input.data 互動資料的輸入檔案可能就會包含一些多餘的字元,例如 \r ,這個時候我們就要先格式化一下
$ echo -e "Jim\n18\nfootball\n" > tmp
$ tr -d "\r" < tmp > input.data
$ ./interactive.sh < input.data
主要就可以保證輸入資料正確性。
另外一種方式是通過配置檔案生成互動輸入檔案
grep -v '^#' $INIFILE | awk -F '=' '{if($1 ~ /^USB_BIN_/) print $2}' > tmp.ini // 將配置檔案中的配置項生成輸入資料,字首可以自行定義,通過awk的第一個域來來過濾
tr -d "\r" < tmp.ini > input.data // 去掉輸入檔案中多餘的字元 '\r'
./interactive.sh < input.data
還有一種方式是使用expect來完成這種互動式輸入。