《shell編程實戰》第2章shell腳本入門(下)

一、sh和./的區別
[root@thzzc1994 ~]# cat test.sh
echo I am thzzc1994
[root@thzzc1994 ~]# sh test.sh
I am thzzc1994
[root@thzzc1994 ~]# bash test.sh
I am thzzc1994
[root@thzzc1994 ~]# ./test.sh
-bash: ./test.sh: 權限不夠
想要讓./能夠執行,須要在用戶位加權限x(可執行exec的意思),
在個人環境下執行chmod u+x test.sh等價於chmod 744 test.sh:
[root@thzzc1994 ~]# ll test.sh
-rw-r--r-- 1 root root 20 4月 22 11:45 test.sh
[root@thzzc1994 ~]# chmod u+x test.sh(chmod 744 test.sh)
[root@thzzc1994 ~]# ll test.sh
-rwxr--r-- 1 root root 20 4月 22 11:45 test.sh
[root@thzzc1994 ~]# ./test.sh
I am thzzc1994
提示:因爲./方法每次都須要給定執行權限,但容易被忘記,且多了一些步驟,增長了複雜性,因此通常都是用sh執行。
二、sh和source的區別
[root@thzzc1994 ~]# echo 'userdir=pwd'>test.sh
[root@thzzc1994 ~]# cat test.sh
userdir=pwd
[root@thzzc1994 ~]# sh test.sh
[root@thzzc1994 ~]# echo $userdirlinux

在當前shell查看userdir的值,發現值是空的。如今以一樣的步驟改用source來執行,再來看看userdir變量的值:
[root@thzzc1994 ~]# source test.sh
[root@thzzc1994 ~]# echo $userdir
/root
結論:經過source或.加載執行過的的腳本,因爲是在當前shell中執行腳本,所以在腳本結束以後,腳本中的變量(包括函數)值在當前shell中依然存在,而sh和bash執行腳本都會啓動新的子shell執行,執行完後回到父shell,變量和函數值沒法保留。
平時在進行shell腳本開發時,若是腳本中有引用或執行其餘腳本的內容或配置文件的需求時,最好用.或source先加載該腳本或配置文件,再加載腳本的下文。
趁熱打鐵:這是某互聯網公司linux運維職位筆試題。請問echo $user的返回結果爲()
[root@thzzc1994 ~]# cat test.sh
user=whoami
[root@thzzc1994 ~]# sh test.sh
[root@thzzc1994 ~]# echo $user
(A)當前用戶
(B)thzzc1994
(C)空值
前面已經講過了,sh的變量值,父shell是得不到的。因此這題能夠當作只有一句話,那就是
[root@thzzc1994 ~]# echo $user
結果固然是空值了。
結論:(1)子shell腳本會直接繼承父shell的變量、函數等,就好像兒子隨父親姓,基因繼承父親的,反之則不能夠。
(2)若是但願父shell繼承子shell,就先用source或.加載子shell腳本,後面父shell就能用子shell的變量和函數值了。
三、介紹一個簡單編輯腳本命令cat>,能大大方便開發
cat>test.sh,輸入內容後按回車,再按Ctrl+d組合鍵結束編輯。
[root@thzzc1994 ~]# cat>test.sh
echo I am thzzc1994 [Enter][Ctrl+d]
[root@thzzc1994 ~]# sh test.sh
I am thzzc1994shell

相關文章
相關標籤/搜索