如果我運行第一個命令,它會輸出a="A", b="B",但如果我運行第二個命令,它不會輸出任何內容。
第一的
while read a && read b; do echo "a=$a, b=$b"; done <<<$(echo '["A", "B"]' | jq '.[]')
第二
while read a && read b; do echo "a=$a, b=$b"; done <<<"A B"
為什么我不能讀取提供的字串,除非它來自命令輸出?
uj5u.com熱心網友回復:
在第二個示例中,read a使用整個 here 字串。read b沒有什么可閱讀的,所以它失敗了。這會導致while回圈條件失敗,這意味著永遠不會執行主體。
第一個命令的不同之處在于它jq產生兩行輸出,因此每個read命令讀取其中的一個。(分隔它們的換行符被保留,因為命令替換的結果不受分詞的影響,作為 here 字串的值。)
$ echo '["A", "B"]' | jq '.[]'
"A"
"B"
uj5u.com熱心網友回復:
這不是這里發生的事情。你的第二次嘗試產生一行,它被第一次消耗read;第二個read然后失敗,這導致它回傳一個錯誤,導致while不進入回圈。
正確的解決方案看起來像
while read -r a b; do
echo "a='$a' b='$b'"
done <<<'"A" "B"'
并且,就此而言,您的第一次嘗試可能根本不應該使用<<<;
while read -r a && read -r b; do
echo "a='$a' b='$b'"
done < <(echo '["A", "B"]' | jq '.[]')
或者
echo '["A", "B"]' | jq '.[]' |
while read -r a && read -r b; do
echo "a='$a' b='$b'"
done
或者,正如評論中敏銳地指出的那樣 (-;
jq '.[]' <<<'["A", "B"]' |
while read -r a && read -r b; do
echo "a='$a' b='$b'"
done
在<<<下面的字串語法真的只有有意義的使用,當你有什么實際上已經是一個字串。使用管道或行程替換從子行程中讀取內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/396789.html
