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