Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用bash连接多行中的字符串_String_Bash - Fatal编程技术网

String 使用bash连接多行中的字符串

String 使用bash连接多行中的字符串,string,bash,String,Bash,给定一个参数列表,我尝试使用bash脚本生成如下所示的字符串: - arg_1 - arg_2 - arg_3 - arg_4 下面是我的脚本,它试图做到这一点: seeds= for i in $*; do seeds=`printf "$seeds - $i\n"` done; echo "$seeds" 但是,当我使用inputarg_1 arg_2 arg_3 arg_4运行它时,上面的脚本生成以下输出,这显然忽略了我的间距和新行字符: - arg_1 - arg_

给定一个参数列表,我尝试使用bash脚本生成如下所示的字符串:

 - arg_1
 - arg_2
 - arg_3
 - arg_4
下面是我的脚本,它试图做到这一点:

seeds=
for i in $*; do
  seeds=`printf "$seeds    - $i\n"`
done;
echo "$seeds"
但是,当我使用input
arg_1 arg_2 arg_3 arg_4
运行它时,上面的脚本生成以下输出,这显然忽略了我的间距和新行字符:

- arg_1 - arg_2 - arg_3 - arg_4

我能知道我在脚本中做错了什么吗?或者有更好的方法吗?

我觉得你的脚本太复杂了。我认为你不需要命令替换。你可以试试这个吗

seeds=
for i in $*; do
  seeds="$seeds\n- $i"
done;
echo -e ${seeds#\\n}

我觉得你的剧本太复杂了。我认为你不需要命令替换。你可以试试这个吗

seeds=
for i in $*; do
  seeds="$seeds\n- $i"
done;
echo -e ${seeds#\\n}

引号和空格在shell中非常重要:

#!/usr/bin/env bash

for arg in "$@"; do
    seed="$seed    - $arg\n"
done
echo -ne "$seed"
演示:


引号和空格在shell中非常重要:

#!/usr/bin/env bash

for arg in "$@"; do
    seed="$seed    - $arg\n"
done
echo -ne "$seed"
演示:

正如sudo_O所说(并且会指出),您应该使用
“$@”
而不是
$*
来进行最小修复

你问是否有更好的方法,当然,确实有。如果给定的参数多于实现格式字符串所需的参数,
printf
将根据需要重复输出。这让我们简单地写下:

printf "- %s\n" "$@" 
正如sudo_O所说(并且会指出),您应该使用
“$@”
而不是
$*
来进行最小修复

你问是否有更好的方法,当然,确实有。如果给定的参数多于实现格式字符串所需的参数,
printf
将根据需要重复输出。这让我们简单地写下:

printf "- %s\n" "$@" 

谢谢你,它看起来很有效,只是在开始时增加了一条新的线路(虽然很容易修复)。我根据你的需要更改了它,而不是第一条线路。从bash的参考手册中:
如果模式匹配参数扩展值的开头,那么扩展的结果就是参数的扩展值,删除了最短的匹配模式
谢谢,除了在开头添加一行新行(尽管很容易修复)1.我根据你的需要换了,不只是第一个。来自bash的参考手册:
如果模式匹配参数扩展值的开头,那么扩展的结果就是参数的扩展值,删除了最短的匹配模式
。此外,我不想打印它们,但更重要的是将它们存储在字符串中,因为我稍后将调用
sed
来使用它们修改文件。@keelar另外,我不想打印它们,但更重要的是将它们存储在字符串中,因为我稍后将调用
sed
来使用它们修改文件。@keelar+1进行拼写检查,但是请检查我答案上的OP注释
我不想打印它们,但更重要的是将它们存储在字符串中
@sudo\O:这很容易更改:
种子=$(printf“-%s\n”“$”)
(尽管请注意,最终换行将在存储到变量中之前进行修剪——如果这是一个问题,有解决方案,但有点混乱)。+1对于拼写检查,请检查我答案上的OP注释
,我不想打印它们,但更重要的是,将它们存储在字符串中
@sudo\O:这很容易更改:
种子=$(printf“-%s\n”“$”)
(尽管请注意,最终换行将在存储到变量中之前进行修剪——如果这是一个问题,有一些解决方案,但有点混乱)。