我把这个字符串存储在一个变量中:
IN="bla@some.com;john@home.com"
Run Code Online (Sandbox Code Playgroud)
现在我想通过;分隔符拆分字符串,以便我有:
ADDR1="bla@some.com"
ADDR2="john@home.com"
Run Code Online (Sandbox Code Playgroud)
我不一定需要ADDR1和ADDR2变量.如果它们是阵列的元素甚至更好.
根据以下答案的建议,我最终得到了以下内容,这就是我所追求的:
#!/usr/bin/env bash
IN="bla@some.com;john@home.com"
mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do
echo "> [$addr]"
done
Run Code Online (Sandbox Code Playgroud)
输出:
> [bla@some.com]
> [john@home.com]
Run Code Online (Sandbox Code Playgroud)
有一个涉及设置Internal_field_separator(IFS)的解决方案;.我不确定该答案发生了什么,你如何重置IFS为默认值?
RE:IFS解决方案,我试过这个并且它可以工作,我保持旧的IFS然后恢复它:
IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
echo "> [$x]"
done
IFS=$OIFS
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我试过的时候
mails2=($IN)
Run Code Online (Sandbox Code Playgroud)
我只是在循环打印时得到第一个字符串,没有括号围绕$IN它工作.
我必须拆分URL字符串并将变量分配给少数分裂.这是字符串
http://web.com/sub1/sub2/sub3/sub4/sub5/sub6
Run Code Online (Sandbox Code Playgroud)
我想从bash中分配如下变量
var1=sub2
var2=sub4
var3=sub5
Run Code Online (Sandbox Code Playgroud)
如何在bash中执行此操作?
我试图通过拆分变量来初始化读取数组.
x=abc:def:gh
declare -a xa
# I want xa[0] = abc, xa[1] = def, and so on
IFS=: read -a xa <<< $x
echo ${#xa[@]} $xa ######### the above did not work
1 abc def gh
# but type the same value from console?
IFS=: read -a xa
abc:def:gh ########## this is what I typed in
echo ${#xa[@]} $xa ######### this worked
3 abc
Run Code Online (Sandbox Code Playgroud)
使用<<<读取变量时如何使IFS工作?
非常感谢您的建议.
此外,这是我的实际问题,以防万一有更智能的解决方案.我使用SVN,不同的人有兴趣知道不同的路径集.在SVN提交后,我想过滤更改列表,并根据他们的愿望向不同的人群发送电子邮件.所以我想我会在hooks-env中设置类似下面的内容
NOTIFY_LIST=mailinglist:grep options:grep options:......
Run Code Online (Sandbox Code Playgroud)
然后,在post-commit中,解析svnlook数据以查看是否有任何候选电子邮件.有没有一种声明性的方式可以说这种和这样的路径的变化对这样的人员名单有意义?
谢谢Dinesh
编辑:尝试组合IFS和简单xa=($x).因此看起来IFS=: 不能与阅读合并.所以我有办法完成我的工作,但仍然好奇发生了什么?
IFS=: xa=($x) …Run Code Online (Sandbox Code Playgroud) 运行这些命令会产生预期结果
$ bash --version
GNU bash, version 4.1.11(2)-release
$ foo=(111 222 333)
$ IFS=, cat <<< "${foo[*]}"
111,222,333
Run Code Online (Sandbox Code Playgroud)
但是,在Bash 4.2中显示IFS值被忽略
$ bash --version
GNU bash, version 4.2.0(1)-release
$ foo=(111 222 333)
$ IFS=, cat <<< "${foo[*]}"
111 222 333
Run Code Online (Sandbox Code Playgroud)
是什么造成了这种差异?
我在这里找到了答案
http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00065.html
看起来这一直是一个错误.根据Chet的说法,重定向永远不应该访问临时环境(IFS在这种情况下)