我想用分隔符逗号分割字符串并将其写入文件。我有下面的脚本但是当我看到输出(temp.txt)时,我看到写入文件的完整for循环代码.. 任何人都可以帮我解决这个问题
#!/bin/bash -e
string1=a/b,b/c,c/d
IFS=', ' read -a array <<< "$string1"
cat << 'EOF' > temp.txt
for element in "${array[@]}"
do
echo "$element"
done
EOF
a/b
b/c
c/d
答案 0 :(得分:2)
使用printf
:
#!/bin/bash -e
string1=a/b,b/c,c/d
IFS=', ' read -ra array <<< "$string1"
printf '%s\n' "${array[@]}" > temp.txt
更长的路:
for e in "${array[@]}"; do
echo "$e"
done > temp.txt
另一个使用IFS:
IFS=$'\n' eval 'echo "${array[*]}" > temp.txt'
注意:更改IFS是不必要的,但如果您想用逗号严格拆分字符串,请将其更改为IFS=,
:
IFS=, read -ra array <<< "$string1"
答案 1 :(得分:1)
您的IFS
不正确,应该没有空格。此外,您可以将循环的输出间接到文件:
#!/bin/bash -e
string1=a/b,b/c,c/d
IFS=',' read -a array <<< "$string1"
for element in "${array[@]}"
do
echo "$element"
done > temp.txt
如果您的唯一目的是将逗号转换为换行符,则可以使用像tr
这样简单的内容:
tr , '\n' <<<"$string1" > temp.txt
答案 2 :(得分:1)
你也可以在这样的循环中使用read builtin命令的-d
选项:
while read -d, -r; do
echo "$REPLY"
done <<<"$string1," > temp.txt
您会注意到我在,
扩展的末尾添加了string1
,因为-d
正在用,
替换换行符。
虽然它需要更多的代码,但是你可以避免在循环之后通过另一个echo $REPLY
向此字符串添加额外的逗号。
{ while read -d, -r; do
echo "$REPLY"
done <<<"$string1"
echo $REPLY
} > temp.txt
你也可以使用子行到echo
你的数组使用换行符IFS
:
IFS=, read -ra array <<<"$string1"
(IFS=$'\n'; echo -e "${array[*]}") > temp.txt