我正在编写一个bash脚本。我坚持的待定点是如何一次接受来自用户的多个输入。
具体而言,当脚本要求输入输入时,用户必须能够输入多个域名。
示例,脚本运行部分:
Enter the domain names :
用户必须能够逐行输入每个域名,或者他/她只需要从某个地方复制域名列表并将其粘贴到脚本输入中,如下所示:
domain1.com
domain2.com
domain3.com
domain4.com
有可能吗?。
答案 0 :(得分:4)
是的,您可以:使用readarray
:
printf "Enter the domain names: "
readarray -t arr
# Do something...
declare -p arr
上面的最后一行只记录了bash现在看作数组的内容。
用户可以键入或复制并粘贴数组名称。用户完成后,在行的开头键入 Ctrl-D 。
示例:
$ bash script
Enter the domain names: domain1.com
domain2.com
domain3.com
domain4.com
declare -a arr='([0]="domain1.com" [1]="domain2.com" [2]="domain3.com" [3]="domain4.com")'
答案 1 :(得分:3)
使用loop
:
#!/bin/bash
arrDomains=()
echo "Enter the domain names :"
while read domain
do
arrDomains+=($domain)
# do processing with each domain
done
echo "Domain List : ${arrDomains[@]}"
输入所有域名后,按ctrl + D
即可结束输入。
答案 2 :(得分:0)
所以@John1024's answer确实使我走上了正确的道路,但是 super 仍然使我感到困惑,不仅如何将这些数据分配给变量,而且重要的是,保留空格和换行符。
稍后有许多StackOverflow和StackExchange答案之后,我创建了以下代码片段,其中显示了操作方法。来自我的Uber BashScripts project @ wifi-autorun-on-connect.installer:
#############################################################
# Grab the script from an existing file -or- user input... #
# #
# Copyright © 2020 Theodore R. Smith #
# License: Creative Commons Attribution v4.0 International #
# From: https://github.com/hopeseekr/BashScripts/ #
# @see https://stackoverflow.com/a/64486155/430062 #
#############################################################
function grabScript()
{
if [ ! -z "$1" ] && [ -f "$1" ]; then
echo $(<"$1")
else
echo "" >&2
echo "Please type/paste in bash script you wish to be run when NetworkManager connects to '${HOTSPOT}'." >&2
echo "Press CTRL+D when finished." >&2
echo "You should start with '#!/bin/bash'..." >&2
echo "" >&2
# Read user input until CTRL+D.
# @see https://stackoverflow.com/a/38811806/430062
readarray -t user_input
# Output as a newline-dilemeted string.
# @see https://stackoverflow.com/a/15692004/430062
printf '%s\n' "${user_input[@]}"
fi
}
SCRIPT=$(grabScript "$2")
# Preserve white spaces and newlines.
# @see https://stackoverflow.com/a/18018422/430062
echo "$SCRIPT"