2014-09-04 237 views
1

我試圖將命令的輸出傳遞給變量。 嘗試了很多報價,但不成功,請檢查將命令的輸出傳遞給shell腳本中的變量

我正在讀取$ line中的文件輸入並處理它,試圖將輸出保存在變量a中。

set a="$($line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g’)" 

回答

1

使用echo

a="$(echo $line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 
2

有幾件事情。

首先是你不應該使用set,那是shell變量而不是環境變量。

其次,除非$line是一個實際命令,需要呼應它

第三,sed命令的結束報價是錯誤的類型,而不是'

所以,你應該用:

pax> line="date=2014.09.05-time=12.34.56" 
pax> a="$(echo $line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 
pax> echo $a 
12 

其抓住第二-分隔場(time=12.34.56),那麼第一:

a="$(echo $line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 

您可以在下面的成績單看到這個動作.time=12)的分隔字段,然後剝離開始處的所有非數字,僅給出12

+0

或者,使用這裏的字符串:'cut -d'-'-f 2 <<<「$ line」'。 – 2014-09-04 04:17:54

+0

什麼是shell變量?無論如何,'set a = 42'將'$ 1'設置爲字符串'a = 42',這當然不是OP所要求的,但似乎並不符合爲什麼它「不起作用」 ...另外,它可能應該是'echo'$ line「'。 – rici 2014-09-04 06:11:10

0

假設$filename是文件名,你從閱讀,你幾乎沒有:

a="$(<$filename cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 

的問題是:

  • 調用set,這是沒有幫助
  • 不正確的讀取文件($line執行它,你想讀取它。
  • 錯誤報價後//g - 你想要一個簡單的單引號(')這裏
+0

感謝您的回覆!但我想逐行閱讀$ filename ...這也適用於這...我還沒有嘗試代碼 – Pankaj 2014-09-04 12:05:23

0

而不是用很長的多工藝管道,使用由殼本身提供的參數擴展工具。

tmp1=${line#*-} # Remove everything up to and include the first - 
tmp2=${tmp1%%.*} # Remove everything from the first . onward 
a=${tmp2//[!0-9]} # Remove anything that isn't a numerical digit 

如果從文件中讀取,你可以摺疊的第一步到讀取命令本身

while IFS=- read first second rest; do 
    tmp=${second%%.*} 
    a=${tmp//[!0-9]} 
done 

這也可能是簡單定義一個正則表達式來捕獲字符串的一部分你想要的(樣本行將有助於定義這樣的正則表達式)。

[[ $line =~ $regex ]] && a=${BASH_REMATCH[1]} # Assuming the first capture group