sh指令碼變數賦值時同時執行命令時的環境問題

2022-09-01 19:45:11 字數 1580 閱讀 5636

在v2ex看到乙個問題:

允許在乙個命令之前立即發生乙個或多個變數賦值,這些賦值為跟隨著的命令更改環境變數,這個賦值的影響是暫時的。 

那為什麼:

int=100

int=10 echo $(($int - 10))

結果是 90 而不是 0

其實是這樣:

int=100 

int=10 echo $(($int - 10))

echo $int

sh -x 輸出:

+ int=100

+ int=10 echo 90

90 + echo 100

100

-----------------------------------------

int=100

int=10 echo $((int=$int - 10))

echo $int

sh -x 輸出:

+ int=100

+ int=10 echo 90

90 + echo 90

90 -----------------------------------------

int=100

xx=10 echo $((int=$int - 10))

echo $int

echo $xx

sh -x 輸出:

+ int=100

+ xx=10 echo 90

90 + echo 90

90 + echo

所以:

int=100 

int=10 echo $(($int - 10))

echo int

等同於:

parent=100

child=10 echo $(($parent-10))

echo $parent

輸出:

+ parent=100

+ child=10 echo 90

90 + echo 100

100

--------------------------------------------

下面這行 

int=10 echo $(($int - 10))

其實是開了乙個新的子環境,並且子環境可以訪問全部父環境變數 

因為「允許在乙個命令之前立即發生乙個或多個變數賦值」 

所以先執行 echo 命令,然後做賦值 int=10 

其實這個 int 是子環境新建的乙個變數,與主環境 int 是兩個不同的變數 

換成 c 語言( linux 是 c 寫的,所以設計思想往 c 靠攏): 

int num = 100; 

printf("%d\n",num);

輸出:

90 100

學過 c 的都應該知道,子作用域新建變數與父作用域變數重名時,子作用域變數會覆蓋父作用域變數 

當子作用域結束時,子作用域變數被銷毀,父作用域變數恢復可見狀態,所以出現以上情況。

乙個sh指令碼 同時執行 多個sh指令碼

原來的啟動方式 cd opt openimscore pcscf.sh icscf.sh scscf.sh cd opt openimscore fhoss deploy startup.sh太過麻煩了,希望只執行乙個指令碼啟動所有的指令碼。在 opt openimscore 下,用乙個指令碼進行啟...

shell多個指令碼同時執行

1 編寫多程序實驗指令碼 demo.sh bin bash sub1.log sub2.log sub3.log function sub1 doecho date t sub1.log 注意date 和 號之間有空格。如 date m d date取 月 日 的命令列。sleep 1 done f...

Linux同時執行多條命令

一次性執行多條指令有很多好處,例如節省時間 加強指令之間的關聯 增大同事的維護難度等等。這個技巧在終端命令列和指令碼都可以用到,主要有三種體現方式 1 使用 符號執行多條指令 使用方式 cmd1 cmd2 cmd3首先執行cmd1,然後執行cmd2,最後執行cmd3。這種是aoe技能,無論你輸入多少...