Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
Linux Bash复合表达式及其算法和测试_Linux_Bash_Shell - Fatal编程技术网

Linux Bash复合表达式及其算法和测试

Linux Bash复合表达式及其算法和测试,linux,bash,shell,Linux,Bash,Shell,我试图在Bash中编写一个复合表达式,它使用算术括号(())中的一个表达式和测试[]中的另一个表达式。这就是我所拥有的: if (( ${#INPUT_FILES[@]} > 1 )) -a [ -n "$OUTPUT_FILE" ]; then 但是我得到了错误 ./backup.sh: line 51: syntax error near unexpected token `-a' ./backup.sh: line 51: `if (( ${#INPUT_FILES[@]} >

我试图在Bash中编写一个复合表达式,它使用算术括号
(())
中的一个表达式和测试
[]
中的另一个表达式。这就是我所拥有的:

if (( ${#INPUT_FILES[@]} > 1 )) -a [ -n "$OUTPUT_FILE" ]; then
但是我得到了错误

./backup.sh: line 51: syntax error near unexpected token `-a'
./backup.sh: line 51: `if (( ${#INPUT_FILES[@]} > 1 )) -a [ -n "$OUTPUT_FILE" ]; then'
INPUT\u FILES
是字符串数组,
OUTPUT\u FILE
是常规字符串变量


如何在逻辑上将
这两个表达式结合在一起?

-a
标志是
测试
表达式语法本身的一部分。在括号外,您必须使用
&&
及其类似内容

if (( ${#INPUT_FILES[@]} > 1 )) && [ -n "$OUTPUT_FILE" ]; then
如果你一心想使用
-a
,你可以这样写:

if [ ${#INPUT_FILES[@]} -gt 1 -a -n "$OUTPUT_FILE" ]; then

但正如Adrian Frühwirth在他的评论中指出的那样,
-a
-o
标志,因此您应该更喜欢
&
|

+1。另一方面,
-a
/
-o
实际上已被弃用,由于可能存在副作用,因此不应使用<代码>&&
/
|
几乎总是你想要的。@AdrianFrühwirth啊,谢谢,我没意识到。确认并更新。@AdrianFrühwirth感谢,kojiro感谢链接。这本书读得很好。对于未来的旅行者,向下滚动大约一半到“应用程序使用”部分