[英]Bash Shell Scripting - Dialog form variables
因此,我剛開始學習Shell Scripting,並且正在開發通訊錄。
為了讓用戶插入聯系人,我填寫了以下表格:
form=$(dialog \
--title "INSERIR" \
--form "" \
0 0 0 \
"Nome:" 1 1 "$nome" 1 10 20 0 \
"Morada:" 2 1 "$morada" 2 10 20 0 \
"Telefone:" 3 1 "$telefone" 3 10 20 0 \
"E-Mail:" 4 1 "$mail" 4 10 20 0 \
2>&1 1>&3)
我想通過MySQL查詢插入這些值。 我看到了必須使用的地方,例如:
form[$1]
為了訪問變量$ nome。 但是,這是2008年的評論。訪問這些變量的最簡單方法是什么?
謝謝!
因此,經過一番修補后,我得到了我想要的東西。 這是新表格:
exec 3>&1
dialog \
--separate-widget $'\n' \
--title "INSERIR" \
--form "" \
0 0 0 \
"Nome:" 1 1 "$nome" 1 10 30 0 \
"Morada:" 2 1 "$morada" 2 10 30 0 \
"Telefone:" 3 1 "$telefone" 3 10 30 0 \
"E-Mail:" 4 1 "$mail" 4 10 30 0 \
2>&1 1>&3 | {
read -r nome
read -r morada
read -r telefone
read -r mail
#The rest of the script goes here
}
exec 3>&-
IFS=$'\n' read -r -d '' nome morada telefone mail < <( dialog ... )
與dialog ... | { read; ... }
不同dialog ... | { read; ... }
dialog ... | { read; ... }
dialog ... | { read; ... }
(它將讀取到子外殼程序的變量的范圍限定在內),這種方法將對話框放在子外殼程序中,而您的變量放在主外殼程序中-更加方便。
有關訪問結果的最簡單方法的問題部分取決於項目是否可能包含空格。 如果項目可以包含任意數據,那么行輸出(默認)似乎是唯一的方法。 如果它們受到更嚴格的約束,例如不包含一些可用作定界符的易於使用的標點符號,那么這將使其更加簡單。
手冊頁提到了一個選項(和別名),可用於執行此操作:
--separator
符字符串
--output-separator
字符串指定一個字符串,該字符串將對話框輸出中的輸出與清單分開,而不是換行符(用於
--separate-output
)或空格。 這適用於其他小部件,例如通常使用換行符的表單和編輯框 。
例如,如果數據不包含:
冒號),則可以使用該選項
--output-separator :
並在一行上獲取冒號分隔的值。
如果字符串中沒有逗號或引號,則可以想象使用
--output-separator \",\"
並將結果直接嵌入到SQL語句中。 但是,逗號比提到的其他標點符號更頻繁地出現,因此使用sed
處理表單的輸出是最有可能進行的方式。
經過幾天的尋找,找到了獲取這些變量的方法,這是我在表格中使用的:
nome=""
morada=""
telefone=""
mail=""
user_record=$(\
dialog \
--separate-widget $'\n' \
--title "INSERIR" \
--form "" \
0 0 0 \
"Nome:" 1 1 "$nome" 1 10 30 0 \
"Morada:" 2 1 "$morada" 2 10 30 0 \
"Telefone:" 3 1 "$telefone" 3 10 30 0 \
"E-Mail:" 4 1 "$mail" 4 10 30 0 \
3>&1 1>&2 2>&3 3>&- \
)
nome=$(echo "$user_record" | sed -n 1p)
morada=$(echo "$user_record" | sed -n 2p)
telefone=$(echo "$user_record" | sed -n 3p)
mail=$(echo "$user_record" | sed -n 4p)
echo $nome
echo $morada
echo $telefone
echo $mail
這樣,您可以稍后在腳本中使用這些變量。 希望它能幫助別人。
因此,您實際上可以將輸出放入數組中並進行處理。 避免所有子shell /子進程垃圾。 (只是信任軟盤重定向,是的,這很丑陋,但是您基本上只是消減了stdin並將其交換回去。)不確定為什么5年后它是如此難以捉摸,但是,嘿。 我想晦澀難懂。
response=$(dialog \
--title "INSERIR" \
--form "" \
0 0 0 \
"Nome:" 1 1 "$nome" 1 10 20 0 \
"Morada:" 2 1 "$morada" 2 10 20 0 \
"Telefone:" 3 1 "$telefone" 3 10 20 0 \
"E-Mail:" 4 1 "$mail" 4 10 20 0 \
3>&1 1>&2 2>&3 3>&-)
#convert the space separated string to an array.. the madness!!
responsearray=($response)
echo ${responsearray[0]} #nome
echo $(responsearray[1]} #morada
echo ${responsearray[2]} #telefone
echo ${responsearray[3]} #mail
鮑勃是你的叔叔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.