簡體   English   中英

在bash shell腳本中設置列的變量

[英]Setting variables for columns inside bash shell script

我的腳本在運行時

./program < "$1" | awk -F '!' '{print $3 $4, $5, $6, $7}

返回值

900 200 30 400 5
51 31 2 3 4

如何為我嘗試的每一行的列設置變量

LINE=`./program < $1`
for i in $LINE
do
$LINE | awk -f '!' | read a b c d e <<< "$(echo $i | cut -f4 -d:}'

但無論我怎么做,我似乎都無法將值轉化為變量

您可以使用進程替換為awk每一行輸出讀取這些值:

while read -r a b c d e; do
   echo "<$a><$b><$c><$d><$e>"
done < <(./program < "$1" | awk -F '!' '{print $3 $4, $5, $6, $7}')

實際上,由於awk僅打印以!分隔的列! 您甚至可以完全刪除awk:

while IFS='!' read -r a b c d e; do
   echo "<$a><$b><$c><$d><$e>"
done < <(./program < "$1")
for i in $LINE

將在LINE中遍歷令牌 您可以修改IFS以使令牌等於一行,但是您也可以這樣做

./program <"$1" |
while IFS='!' read -r a b c d e f g _; do
    echo "<$c$d><$e><$f><$g>"
done

您嘗試的其他問題:

  • LINE不是一個好的變量名。 使用小寫的變量名; 大寫字母應視為保留給Shell的特殊變量使用。

  • 您的進程替換嘗試在循環外使用循環變量$i ,但這是不可能的。 它是不確定的。

  • LINE不是命令名稱,因此無法將其標准輸出傳遞給awk 要將字符串傳遞給Awk,請echo "$LINE" | awk echo "$LINE" | awk或僅在Bash中的此處字符串: <<<"$LINE" awk

  • 您有雙重重定向來read 它無法同時從管道和here字符串讀取標准輸入; 此處的字符串將獲勝。 但是在這種情況下,由於read在管道的末尾,它將在子shell中運行,並且在子shell退出時會丟失其值。 (您可以在Bash中避免這種情況。有關討論,請參見http://mywiki.wooledge.org/BashFAQ/024 。)

  • 您在$(echo ... | cut ... }括號不匹配

  • 您應該在echo "$i"對字符串加雙引號(盡管在這種情況下,它實際上可能已經起作用)。 通常,除非您特別要求Shell對變量的值執行通配符擴展和令牌拆分,否則應將其雙引號。

  • 沒有done關閉for ...; do for ...; do塊。

暫無
暫無

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

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