簡體   English   中英

在 Bash 中將變量重定向到字符串有什么作用?

[英]What does redirecting a variable into a String do in Bash?

首先,我知道當使用 > 或 < 將 Bash 中的字符串與單括號進行比較時,必須對其進行轉義。 但是,我想知道如果它沒有逃脫它會做什么。 這是什么意思? 它不會引發錯誤。 這是代碼:

((a = 1))
if [ a > 2 ]; then echo "Foo"; else echo "bar"; fi

> 2 在做什么? 將 1 重定向到 2 會做什么以及為什么,如果沒用,它不會給出錯誤。

我懷疑,沒有進一步的背景,它的意圖是評估。

((a = 1))
if [ a > 2 ]; then echo "Foo"; else echo "bar"; fi

如前所述,是一個錯誤。 [test的同義詞(“語法糖”,Larry Wall 喜歡這樣稱呼它),所以這里實際要做的是:

let a=1
if test a 1>2 # evaluate a, redirect stdout (there is none) to file "2"
then echo "Foo"
else echo "bar"
fi

查看周圍的邏輯,看看它是否不應該是這樣的:

((a = 1))
if (( a > 2 )); then echo "Foo"; else echo "bar"; fi

那將是一個適當的算術評估。

$: (( 1 > 2 )) && echo ok || echo no
no
$: (( 20 > 100 )) && echo ok || echo no
no
$: (( 100 > 20 )) && echo ok || echo no
ok

當心使用雙方括號的更微妙的錯誤:

((a = 1))
if [[ a > 2 ]]; then echo "Foo"; else echo "bar"; fi

在這種情況下,這通常會給出預期的結果,但它在字符串上下文中進行評估,可能根據 LOCALE 設置。 當位數不同時,它通常會失敗,例如[[ 10 > 2 ]]

$: [[ 1 > 2 ]] && echo ok || echo no
no
$: [[ 10 > 2 ]] && echo ok || echo no
no
$: [[ 2 > 10 ]] && echo ok || echo no
ok

重定向,如> outputfile可以放在任何 position 中(在一個簡單的命令中)。 這些是相等的,盡管最后一個可能是最常見的:

> hello.txt echo hi
echo > hello.txt hi
echo hi > hello.txt 

因此,命令[ a > 2 ][ a ] > 2相同,即它運行[命令,帶有兩個 arguments a] 除了結尾]之外只有一個參數,它測試該參數是否不是空字符串。 不是,所以測試是真的,並且echo "Foo"運行。 你得到一個名為2的文件,一個空的,因為[沒有 output 任何東西。

如果您改為運行[ a \> 2 ] ,則>2作為 arguments 傳遞給[ ,它測試字符串a是否在字符串2之后排序(如果它支持該測試,則 Bash 的[ / test可以)。 不是數值比較, a這個詞只是一個static字符串,不是變量展開,所以算術語句((a = 1))在這里不相關。

重定向在命令中的任何地方都以相同的方式工作。 也就是說,以下都是相同的:

> 2 [ a ]
[ > 2 a ]
[ a > 2 ]
[ a ] > 2

...他們每個人都創建了一個名為2的文件,並在運行命令[ a ]時將標准輸出重定向到該文件(該命令不會生成任何 output,因此該文件為空)。

沒有將“重定向到字符串”這樣的事情。 所有這些都重定向到一個文件中。

使用set -x我們看到以下行為:

+ (( a = 1 ))
+ '[' a ']'
+ echo Foo
Foo

> 2部分被讀取為重定向,因此它創建了一個名為2的文件

由於[ a ]不返回任何值,因此文件將為


然后,重定向后, [ a ]將解析為true ,因此執行echo "Foo"

暫無
暫無

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

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