我想输入多个字符串。
例如:
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
答案 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
中,然后您可以使用参数扩展将尾随的逗号去除。