Bash中的多行赋值

8
在Windows的.cmd文件中,我执行以下操作:
SET JARS=^
./lib/apache-mime4j-0.6.jar;^
./lib/apache-mime4j-0.6.jar;^
./lib/bsh-1.3.0.jar;^
./lib/cglib-nodep-2.1_3.jar;^
./lib/commons-codec-1.6.jar;^
./lib/commons-collections-3.2.1.jar;^
./lib/commons-exec-1.1.jar;^
./lib/commons-io-2.0.1.jar;^
./lib/commons-io-2.3.jar;

如何在shell中进行多行赋值?
3个回答

9
有很多方法来解决这个问题。
JARS='
./lib/apache-mime4j-0.6.jar;
./lib/apache-mime4j-0.6.jar;
./lib/bsh-1.3.0.jar;
./lib/cglib-nodep-2.1_3.jar;
./lib/commons-codec-1.6.jar;
./lib/commons-collections-3.2.1.jar;
./lib/commons-exec-1.1.jar;
./lib/commons-io-2.0.1.jar;
./lib/commons-io-2.3.jar;
'

这将得到一个变量的多行输入,与您的问题相符。
但是,如果您计划在shell脚本中使用这些文件,您需要告诉我们如何操作,以便我们可以提供适当的答案,而不是让我们猜测。为了在shell脚本中使用,文件需要被有用的东西分隔开。
您问道:“我如何在shell中进行这样的多行赋值”,但实际上您示例中的赋值是单行的,每个输入行末尾的^都否定了后面的换行符(并没有像另一个回答所建议的那样转义它)。
我的解决方案在此答案中是多行的,但您需要更多地解释您需要这个的原因,以确定什么对您有用。
例如,如果您需要遍历要使用“jar”命令处理的文件列表,则可能需要像这样的东西:
#!/bin/sh

JARS='
./lib/apache-mime4j-0.6.jar
./lib/bsh-1.3.0.jar
...
'

set $JARS
for jarfile in "$@"; do
  jar xf "$jarfile" ...
done

1
如果我说 echo $JARS,那么结果字符串是以空格分隔的。 - Stepan Yakovenko
4
是的,如果您运行echo "$JARS"命令,则会按照您指定的方式输出结果。请注意在Bash中如何使用引号,它们非常重要。请务必留意。 - ghoti
我应该在每个字符串的末尾加入换行符吗? - Fedir RYKHTIK
@Fedir - 如果这是你想要的,那当然可以。如果你想对输出进行细粒度控制,请使用 printf 而不是 echo。如果你有一个与 OP 不同的用例,你可能需要提出自己的问题 - ghoti

6
或者,另一种选择是:
SOMEVAR=$( cat <<EOF
value1
value2
value3
value4
value5
EOF
)

这个错误提示是:./parser.sh: 第1行:在查找匹配的 `)' 时出现意外的 EOF ./parser.sh: 第56行:语法错误:意外的文件结尾 - Stepan Yakovenko
由于结束EOF不能缩进。编辑你已经得到了它。 - ormaaj
可能是Markdown和空格的组合。现在已经纠正过来了。 - matcheek

5

这个问题隐含地要求单行输出,我会展示如何实现。

test.bat

@SET JARS=^
./lib/apache-mime4j-0.6.jar;^
./lib/apache-mime4j-0.6.jar;^
./lib/bsh-1.3.0.jar;^
./lib/cglib-nodep-2.1_3.jar;^
./lib/commons-codec-1.6.jar;^
./lib/commons-collections-3.2.1.jar;^
./lib/commons-exec-1.1.jar;^
./lib/commons-io-2.0.1.jar;^
./lib/commons-io-2.3.jar;
@echo %JARS%

输出

c:\home\Steven\Desktop>test.bat
./lib/apache-mime4j-0.6.jar;./lib/apache-mime4j-0.6.jar;./lib/bsh-1.3.0.jar;./li
b/cglib-nodep-2.1_3.jar;./lib/commons-codec-1.6.jar;./lib/commons-collections-3.
2.1.jar;./lib/commons-exec-1.1.jar;./lib/commons-io-2.0.1.jar;./lib/commons-io-2
.3.jar;

test.sh

JARS=\
'./lib/apache-mime4j-0.6.jar;'\
'./lib/apache-mime4j-0.6.jar;'\
'./lib/bsh-1.3.0.jar;'\
'./lib/cglib-nodep-2.1_3.jar;'\
'./lib/commons-codec-1.6.jar;'\
'./lib/commons-collections-3.2.1.jar;'\
'./lib/commons-exec-1.1.jar;'\
'./lib/commons-io-2.0.1.jar;'\
'./lib/commons-io-2.3.jar;'
echo "$JARS"

输出

$ ./test.sh
./lib/apache-mime4j-0.6.jar;./lib/apache-mime4j-0.6.jar;./lib/bsh-1.3.0.jar;./li
b/cglib-nodep-2.1_3.jar;./lib/commons-codec-1.6.jar;./lib/commons-collections-3.
2.1.jar;./lib/commons-exec-1.1.jar;./lib/commons-io-2.0.1.jar;./lib/commons-io-2
.3.jar;

@GordonDavisson,啊是的。没有注意到分号。每个元素只需要加上引号即可。 - Shahbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接