
我有一個簡單的腳本,它從互動式鍵盤「讀取」中獲取 4 個變量,但是我的命令中有一個逗號。我閱讀了 IFS 分隔符值,但範例僅顯示它從檔案讀取而不是鍵盤輸入。是否有更改輸入的技巧,或者我需要透過 SED/AWK 透過管道傳輸命令才能成為腳本讀取的正確格式?
腳本沒什麼花哨的,只是輸入文本,它會添加輸入值並回顯可以與輸入的文本一起運行的命令字串。
[網路] [卡],[連接埠] [主機名稱] 0123 0123,A1 ABCDEFG
#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing
echo -e "${green}ping test and ssh into $VAR4${NC}"
答案1
要將逗號視為單字分隔符,請嘗試:
IFS="$IFS," read a b c d
這會暫時在 中新增一個逗號IFS
,它是 shell 用於欄位分隔符號的字元清單。
例如,讓我們收集一些輸入:
$ IFS="$IFS," read a b c d
1, 2,3 , 4
讓我們看看 bash 如何解釋該輸入:
$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4
改進
我們可以將提示符號和讀取命令結合起來:
IFS="$IFS," read -p "Enter network info: " a b c d
文件
從man bash
:
IFS
內部字段分隔符號用於擴展後的字拆分以及使用 read 內建命令將行拆分為字。預設值為<space><tab><newline>
選擇
如果出於某種未指定的原因,人們確實想使用sed
此任務:
read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')
該指令s/,/ /g
告訴 sed 將每個逗號替換為空格。 q
告訴它在第一行之後退出。
孤獨的人<
表明重定向read
:它告訴 shell從命令列後面的類似檔案的物件取得命令的輸入。
此構造<(...)
稱為流程替代並根據括號中包含的命令建立一個類似文件的物件。該命令是sed
將逗號替換為空格的命令。
對於相同的方法但與 awk 一起使用:
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')