在寫shell代碼的程序如下
DJY_1time1="6 6 * 4 *"
b="DJY_$i"time"$i"
i=1
eval a=`echo -e "\$""DJY_$i"time"$i"`
eval b=`echo \$"DJY_$i"time"$i"`
eval c=`echo '$'"DJY_$i"time"$i"`
eval d=$(echo -e "\$""DJY_$i"time"$i")
eval e=$(echo \$"DJY_$i"time"$i")
eval f=$(echo '$'"DJY_$i"time"$i")
echo "$a"
echo "$b"
echo "$c"
echo "$d"
echo "$e"
echo "$f"
運行結果:
6 6 * 4 *
DJY_1time1
6 6 * 4 *
6 6 * 4 *
6 6 * 4 *
6 6 * 4 *
都說反引號和$()在嵌套變數的用法一樣,但是這里的$b什么會出現這種差異呢?
uj5u.com熱心網友回復:
\$ 你已經把$轉義了,它就是一個$字符了...echo -e 若字串中出現¥字符,則特別加以處理,而不會將它當成一般文字輸出,所以能得到相要的效果,而不加-e 那么$就是個字符而已
uj5u.com熱心網友回復:
但后面的eval不是可以把它重新宣告為變數嗎?
uj5u.com熱心網友回復:
echo \$"DJY_$i"time"$i"分解開看吧,它實際就相當于\$ 得到 $ ,后面一段 “DIY_$1time1”
實際得到 echo $"DIY_$1time1" ,注意后面是加雙引號的,通過``執行,它的實際效果是得到字串 DIY_$1time1
所以,最終echo "$b"就是字串 DIY_$1time1
這么說,能理解么
uj5u.com熱心網友回復:
呃,上面解答中多加了一個$,不過原理就是因為echo $"PATH"和echo $PATH 的區別,一個得到PATH,一個得到環境變數
uj5u.com熱心網友回復:
如果像你說的這樣,通過``執行,實際得字串。那請看變數e那里,里面都一樣,區別僅在于``和$(),但它為什么不也是和``一樣輸出字串呢
uj5u.com熱心網友回復:
呃,之前的解釋確實有問題,查了下相關內容, man bash里面有這么一段,進入后輸入/When the old 回車,可以看到如下內容When the old-style backquote form of substitution is used, backslash
retains its literal meaning except when followed by $, `, or \. The
first backquote not preceded by a backslash terminates the command
substitution. When using the $(command) form, all characters between
the parentheses make up the command; none are treated specially.
當使用舊式的反引號替換形式時,反斜杠保留其字面意義,除非后跟$、`或\\。這個第一個不帶反斜杠的反引號終止命令替代。使用$(command)表單時,所有字符括號組成了命令;沒有一個是特別處理的
也就是說,如果內容中有\時,反引號跟$()是存在差異的~
uj5u.com熱心網友回復:
似乎懂了,感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/276454.html
標籤:專題技術討論區
上一篇:配置linux網路
