2017-06-17 49 views
0

當我嘗試運行下面的代碼時,shell正在替換(因爲它們沒有被定義爲bash變量)$ 4和$ 2帶空格。我的問題是,如何避免bash試圖評估awk的位置參數作爲其變量? 我試過在位置參數周圍放置雙引號和單引號,但是,它並沒有將bash解釋爲局部變量而不是字符串。從位置參數字符串執行BASH shell

這將返回什麼,當我echo "$x$i$y"

date -r /root/capture/capture11.mp4 | awk '{print }' | awk -F":" '/1/ {print }' 

代碼:

#!/bin/sh 
i=$(cat /etc/hour.conf) 
x="date -r /root/capture/capture" 
y=".mp4 | awk '{print $4}' | awk -F\":\" '/1/ {print $2}'" 
$x$i$y 

任何幫助將不勝感激!

+0

建立一個命令行使用簡單的字符串連接和報價玩火。 – anubhava

+0

也許,但更好的方法來獲得現有文件過去一小時的分鐘數? – user3308131

+0

使用shell數組 – anubhava

回答

0

$4加倍引用。 雖然有單引號,但它包含在雙引號中。所以單引號只是字符串的一部分,它不會保留$的字面含義。所以,你可以逃脫$

y=".mp4 | awk '{print \$4}' | awk -F\":\" '/1/ {print \$2}'" 

或者,使用圍繞整體單引號:

y='.mp4 | awk "{print \$4}" | awk -F':' "/1/ {print \$2}"' 
3

變量在雙引號內插入。使用單引號,或者像\$2那樣轉義它們。

但是,您嘗試將命令拆分爲單獨的變量的方式將不起作用。相反,你應該使用一個函數。那麼你根本不需要處理引號和轉義。例如:

do_thing() { 
    date -r "/root/capture/capture$1.mp4" | awk '{print $4}' | awk -F':' '/1/ {print $2}' 
} 

do_thing "$(cat /etc/hour.conf)" 
+0

感謝你的例子。我是一個新手(如果你不知道)bash shell腳本。在你的例子中結果如何返回?用一個任務調用它? time = do_thing「$(cat /etc/hour.conf)」 – user3308131

+0

功能與普通命令一樣工作。 'do_thing「$(cat /etc/hour.conf)」'會將其輸出打印到標準輸出。如果你想捕獲輸出,請執行'time = $(do_thing「$(cat/etc/hour)。如果你想將它傳遞給另一個命令,執行'do_thing「$(cat /etc/hour.conf)」| awk | sed | grep'。 –

+0

謝謝!我感謝你的幫助! – user3308131

0

串聯那樣的變量建立一個命令行排序作品,但內引用變量不會引用任何內容,它們只會被視爲文字引號。

這類作品(但可怕的):

$ x=prin; y="tf %f\\n"; z=" 123456789" 
$ $x$y$z 
123456789.000000 

這不會做你想要的:

$ z='"foo bar"'; printf $y ; echo 
"foo 

而不是一個參數foo barprintf得到兩個參數"foobar"