我试图让这个bash脚本只用一行编写。主要是出于好玩的缘故。
该脚本基本上编译.c脚本if($1=0)
。并且if($1=1)
,它检查lifemp是否存在,如果不存在,则编译它,然后使用2nd - 5th
命令行参数运行lifemp。
这是带有正常if语句的工作脚本:
#!/bin/bash
cd gol
if [ $1 -eq 0 ]; then
make clean
make lifemp USE_FILE=$2
elif [ $1 -eq 1 ]; then
if [ ! -f lifemp ]; then
make lifemp
fi
./lifemp $2 $3 $4 $5
fi
以下是我在一条线上提出的问题。
如果$1 = 0
,这运行正常。问题出现在$1 = 1
。
我认为它与我有一个嵌套的三元表达式来检查lifemp文件是否存在。
#!/bin/bash
cd gol && eval `[[ $1 = "1" ]] && (echo [[ ! -f lifemp ]] && (echo "make lifemp && ./lifemp $2 $3 $4 $5") || ("./lifemp $2 $3 $4 $5")) || (echo "make clean && make lifemp USE_FILE=$2")`
如果有人想和我一起试图解决问题,我会非常感激!
谢谢!
答案 0 :(得分:1)
我终于明白了!
以下是我提出的方法
cd gol && eval `[[ $1 = "1" ]] && ([[ ! -f lifemp ]] && (echo "make lifemp && ./lifemp $2 $3 $4 $5") || (echo "./lifemp $2 $3 $4 $5")) || (echo "make clean && make lifemp USE_FILE=$2")`
我基本上改变了第二个三元表达式以摆脱[[,然后在“./lifemp $ 2 $ 3 $ 4 $ 5”之前添加一个回声的回声。)
答案 1 :(得分:1)
在这里,我将你的if语句(减去缩进)粘贴到一个交互式shell中,然后点击向上箭头,使bash在一行显示:
if [ $1 -eq 0 ]; then make clean; make lifemp USE_FILE=$2; elif [ $1 -eq 1 ]; then if [ ! -f lifemp ]; then make lifemp; fi; ./lifemp $2 $3 $4 $5; fi
eval
总是一个坏主意,特别是对于用户提供的数据。现在,您将把参数视为代码而不是数据,如果它们中的任何一个包含空格元字符,包括空格,撇号,美元符号和圆角字符,它将会以有趣和令人兴奋的方式打破。