相关疑难解决方法(0)

如何在Bash中的分隔符上拆分字符串?

我把这个字符串存储在一个变量中:

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)

我不一定需要ADDR1ADDR2变量.如果它们是阵列的元素甚至更好.


根据以下答案的建议,我最终得到了以下内容,这就是我所追求的:

#!/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 shell scripting split

1885
推荐指数
22
解决办法
204万
查看次数

如何将数组作为参数传递给Bash中的函数

我们知道,在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)

结果都不如我所愿.那么,有没有人知道如何正确地在函数之间传递数组?

arrays bash shell

43
推荐指数
3
解决办法
7万
查看次数

参数扩展可以嵌套在Bash中吗?

可能重复:
$ {var}参数扩展表达式可以嵌套在bash中吗?

是否可以嵌套shell参数扩展(${})

如果我想做这样的事情:

foo=( 1 2 3 4 5 )
echo ${${foo[@]/3/bar}:1}
Run Code Online (Sandbox Code Playgroud)

bash

19
推荐指数
2
解决办法
8022
查看次数

bash中字符串的多个替换

我有一个名为的变量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这个时间?

bash

14
推荐指数
2
解决办法
1万
查看次数

Bash 子字符串和参数扩展而不分配给变量

更新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 shell

6
推荐指数
1
解决办法
2022
查看次数

可以一次使用多个BASH变量操作吗?

一枪可以执行多个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变量操作”的实例,所以也许您做不到,但也许我只是在搜索为正确的条款。

string variables bash scripting

5
推荐指数
1
解决办法
303
查看次数

Bash:需要帮助将变量传递给 rsync

我想将$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)

variables bash rsync

2
推荐指数
1
解决办法
678
查看次数

标签 统计

bash ×7

shell ×3

scripting ×2

variables ×2

arrays ×1

rsync ×1

split ×1

string ×1