linux 在bash脚本中接受多行输入

kadbb459  于 2023-03-07  发布在  Linux
关注(0)|答案(4)|浏览(164)

我正在编写一个bash脚本,目前的难点是如何一次接受用户的多个输入。
具体来说,当脚本要求输入时,用户必须能够输入多个域名。
示例,脚本运行部分:

Enter the domain names :

和用户必须能够输入的域名一行一行要么通过输入他们每个人手动或他/她只是有复制域名列表从某处,并能够粘贴到脚本输入,如下所示:

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

可能吗?

c86crjj0

c86crjj01#

是的,您可以:使用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")'
vatpfxk5

vatpfxk52#

使用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结束输入。

2mbi3lxu

2mbi3lxu3#

所以@John1024的答案确实让我走上了正确的道路,但它仍然是 * 超级 * 困惑我如何让这个数据不仅分配给一个变量,而且重要的是,保留空格和换行符。
在回答了很多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"
oaxa6hgo

oaxa6hgo4#

下面是我在必须使用BASH脚本请求pem格式证书的情况下所做的事情:

echo "Paste your multi-line text into the terminal, ending with two blank lines"
while [ 1 ]; do
  read line
  echo $line >> file.txt
  lastline=$line
  if [ "${lastline}${line}" == "" ]; then break; fi
done

相关问题