我把这个字符串存储在一个变量中:
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它工作.
我们知道,在bash编程中,传递参数的方式是$1...... , $N. 但是,我发现将数组作为参数传递给接收多个参数的函数并不容易.这是一个例子:
f(){
x=($1)
y=$2
for i in "${x[@]}"
do
echo $i
done
....
}
a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF
f "${a[@]}" $b
f "${a[*]}" $b
Run Code Online (Sandbox Code Playgroud)
如上所述,函数f接收两个参数:第一个分配给x一个数组,第二个分配给y.
f可以通过两种方式调用.第一种方法使用"${a[@]}"第一个参数,结果是:
jfaldsj
jflajds
Run Code Online (Sandbox Code Playgroud)
第二种方式使用"${a[*]}"第一个参数,结果是:
jfaldsj
jflajds
LAST
Run Code Online (Sandbox Code Playgroud)
结果都不如我所愿.那么,有没有人知道如何正确地在函数之间传递数组?
是否可以嵌套shell参数扩展(${})?
如果我想做这样的事情:
foo=( 1 2 3 4 5 )
echo ${${foo[@]/3/bar}:1}
Run Code Online (Sandbox Code Playgroud) 我有一个名为的变量inet,其中包含以下字符串:
inet="inetnum: 10.19.153.120 - 10.19.153.127"
Run Code Online (Sandbox Code Playgroud)
我想将此字符串转换为下面的符号:
10.19.153.120 10.19.153.127
Run Code Online (Sandbox Code Playgroud)
我可以轻松实现这一点sed 's/^inetnum: *//;s/^ -//',但我更喜欢更紧凑/优雅的解决方案并使用bash.嵌套参数扩展也不起作用:
$ echo ${${inet//inetnum: /}// - / }
bash: ${${inet//inetnum: /}// - / }: bad substitution
$
Run Code Online (Sandbox Code Playgroud)
还有其他建议吗?或者我应该使用sed这个时间?
更新2:这个问题与这个问题相关,可能是因为这可能/可能不起作用的根本原因是相同的。但我不确定它是否实际上是重复的,因为嵌套只是如何在其中获取字符串的一个示例。同样的基本问题也可以改写为:
expr更多“假”语法的例子来说明这些目标......
${$(echo "b"; b="ABCDE")::3} # Assign output inside?
... | grep -o "ABCDE" | ${-::2} # pipe to placeholder inside?
Run Code Online (Sandbox Code Playgroud)
因此,根据您的目标,它可能是骗局,也可能不是骗局。无论如何,从目前的答案来看,这种方法听起来无论如何都是不可能的......
这是关于 bash 操作的一般问题,而不是试图获取特定的字符串子程序......
我知道您可以使用参数扩展和其他技巧来提取或替换已定义变量的部分内容。
例如:
$ MYVAR=$(date) # just to generate text; could be "ABCDE"
$ echo $MYVAR
Mon Oct 20 15:55:07 PDT 2014
$ echo ${MYVAR:11}
15:55:07 PDT 2014
$ echo ${MYVAR%:*}
Mon Oct 20 15:55
Run Code Online (Sandbox Code Playgroud)
我想要的是一种“嵌套”这些操作而不创建中间变量的方法。
例如,当你这样做时你会得到什么:
$ TIME=${MYVAR:11}
$ echo ${TIME%:*}
15:55
Run Code Online (Sandbox Code Playgroud)
我希望能够将正在发生的操作嵌套在TIME正在发生的操作内部MYVAR。
我想到的潜在语法类似于$()让您嵌套操作,但对变量执行此操作。它可能看起来像这样......(这不起作用——我已经尝试过!) …
一枪可以执行多个bash变量操作吗?
例如:
# for this variable
foo="string_that_is_lower"
# can I do this in one shot?
$foo="${foo:0:4}"
echo "${foo^^}"
Run Code Online (Sandbox Code Playgroud)
有没有办法将这些结合起来?我意识到这是一个微不足道的问题,因为它可以正常工作,或者一个人可以简单地使用其他内置工具(例如)echo ${foo:0:4} | tr [[:lower:]] [[:upper:]],但这很is脚。
我已经尝试了所有我认为可能可行的逻辑组合:
${${foo^^}:0:4}
${{foo^^}:0:4}
${foo^^,:0:4}
${foo^^;:0:4}
${foo^^ :0:4}
Run Code Online (Sandbox Code Playgroud)
全部产生语法错误。
我在Advanced Bash 脚本手册,联机帮助页或Google或此处都找不到“(combine | multiple)bash变量操作”的实例,所以也许您做不到,但也许我只是在搜索为正确的条款。
我想将$home作为运行rsync时要排除的目录列表传递。文件:
cat backup_system.sh
#!/bin/bash
set -x
home=''
home=$home'"/home/ravas/Documents/*"',
home=$home'"/home/ravas/Downloads/*"',
home=$home'"/home/ravas/pCloudDrive/*"',
home=$home'"/home/ravas/pCloudLocal/*"',
home=$home'"/home/ravas.old/*"'
echo $home
sudo rsync -aAXv / --exclude={$home,"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /run/media/ravas/system_backup
Run Code Online (Sandbox Code Playgroud)
备份在没有$home变量的情况下运行良好,但如果我添加它,它不会产生任何效果。
输出的最后两行显示$home中列出的目录未使用--exclude扩展,而其他目录则扩展。
不用说,我不太擅长 bash,任何帮助将不胜感激!
./backup_system.sh
+ home=
+ home='"/home/ravas/Documents/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"'
+ echo '"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"'
"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"
+ sudo rsync -aAXv /
'--exclude="/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"'
'--exclude=/dev/*' '--exclude=/proc/*' '--exclude=/sys/*' '--exclude=/tmp/*' '--exclude=/run/*' '--exclude=/mnt/*' '--exclude=/media/*' --exclude=/lost+found** /run/media/ravas/system_backup
Run Code Online (Sandbox Code Playgroud)