[英]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.