接受多个(任意数量的输入)输入字符串并在shell中连接

时间:2018-08-09 13:17:02

标签: bash shell

我想输入多个字符串。

例如:

abc
xyz
pqr

,我想要在文件中输出如下内容(包括引号):

"abc","xyz","pqr"

我尝试了以下代码,但是没有给出预期的输出。

NextEmail=","
until [ "a$NextEmail" = "a" ];do
   echo "Enter next E-mail: "
   read NextEmail
   Emails="\"$Emails\",\"$NextEmail\""
done
echo -e $Emails

3 个答案:

答案 0 :(得分:1)

这似乎可行:

#!/bin/bash

# via https://stackoverflow.com/questions/1527049/join-elements-of-an-array
function join_by { local IFS="$1"; shift; echo "$*"; }

emails=()
while read line
do
    if [[ -z $line ]]; then break; fi
    emails+=("$line")
done

join_by ',' "${emails[@]}"

$ bash vvuv.sh
my-email
another-email
third-email

my-email,another-email,third-email
$

答案 1 :(得分:1)

使用sed和paste

sed 's/.*/"&"/' infile | paste -sd,

sed命令将""放在每行的周围; paste执行串行粘贴(-s),并使用,作为分隔符(-d,)。

如果输入来自标准输入(而不是文件),则只需从命令中删除输入文件名(infile);要存储在文件中,请在末尾(> outfile)处添加重定向。

答案 2 :(得分:0)

如果您可以忍受结尾的逗号,那么printf可以转换数组,而无需循环...

$ readarray -t a < <(printf 'abc\nxyx\npqr\n' )
$ declare -p a
declare -a a=([0]="abc" [1]="xyx" [2]="pqr")
$ printf '"%s",' "${a[@]}"; echo
"abc","xyx","pqr",

(公平地说,bash内部有一个循环运行,以遍历数组,但是它是用C编写的,而不是bash编写的。:))

如果需要,可以将最后一行替换为:

$ printf -v s '"%s",' "${a[@]}"
$ s="${s%,}"
$ echo "$s"
"abc","xyx","pqr"

这使用printf -v将内含的文本存储到变量$s中,然后您可以使用参数扩展将尾随的逗号去除。