簡體   English   中英

使用三元表達式打擊單行

[英]Bash one-liner using ternary expressions

我試圖讓這個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")`

如果有人想和我一起試圖把它弄清楚,我會非常感激!

謝謝!

我終於想通了!

這是我提出的那條線

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”之前添加回聲)之前的回聲。

在這里,我將你的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總是一個壞主意,特別是對於用戶提供的數據。 現在,您將把參數視為代碼而不是數據,如果它們中的任何一個包含空格元字符,包括空格,撇號,美元符號和全局字符,它將會破壞有趣和令人興奮的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM