在bash脚本中接受多行输入

时间:2016-08-07 06:57:47

标签: linux bash unix awk sed

我正在编写一个bash脚本。我坚持的待定点是如何一次接受来自用户的多个输入。

具体而言,当脚本要求输入输入时,用户必须能够输入多个域名。

示例,脚本运行部分:

Enter the domain names :

用户必须能够逐行输入每个域名,或者他/她只需要从某个地方复制域名列表并将其粘贴到脚本输入中,如下所示:

domain1.com
domain2.com
domain3.com
domain4.com

有可能吗?。

3 个答案:

答案 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"