shell指令碼的建立與執行
指令碼的開頭(第一行):
規範的指令碼在指令碼的第一行會指出由哪個程式(直譯器)來執行指令碼中的內容
在linux bash的程式設計中一般為:
#!/bin/bash
或 #!/bin/sh‘#!’被稱為幻數,用來指出執行指令碼所用的直譯器,並且此行必須用在第一行,若不是指令碼第一行則其就是註釋行
sh與bash的區別:
[[email protected] SHELL]# ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Jan 15 2016 /bin/sh -> bash
[[email protected] SHELL]# ll /bin/bash
-rwxr-xr-x. 1 root root 960368 Jan 29 2014 /bin/bash
[[email protected] SHELL]#
sh為bash的軟連線,但又有區別;
當使用/bin/sh執行指令碼不正常的時候,可以使用/bin/bash執行
也可以不加#!/bin/bash,是因為linux系統預設/bin/bash
指令碼的註釋:
在shell指令碼中,跟在(#)號後面的內容表示註釋,用來對指令碼進行解釋說明;
註釋可以自成一行,也可以跟在指令碼命令後面與命令在同一行。
shell指令碼的執行:
在執行shell指令碼之前,它會先載入系統環境變數ENV(該變數指定了環境檔案,通常是 .bashrc , .bash_profile , /etc/bashrc , /etc/profile等),然後執行指令碼。
特殊:設定定時任務時,最好把系統環境變數在定時任務指令碼中重新定義,否則,一些系統環境變數將不被載入
shell指令碼的執行方式:
<1>bash script-name 或 sh script-name(推薦使用)
該方法是當指令碼檔案本身沒有可執行許可權時,或者檔案開頭沒有指定直譯器時常使用的方法
[root@localhost SHELL]# vim test.sh
[root@localhost SHELL]# cat test.sh
echo 'hello world'
[root@localhost SHELL]# sh test.sh
hello world
[root@localhost SHELL]#
[root@localhost SHELL]# cat >test1.sh //用cat向檔案中寫內容
echo 'ni hao, ming tian'
^C
[root@localhost SHELL]# cat test1.sh
echo 'ni hao, ming tian'
[root@localhost SHELL]# /bin/sh test1.sh
ni hao, ming tian
[root@localhost SHELL]# /bin/bash test1.sh
ni hao, ming tian
[root@localhost SHELL]#
<2>path/script-name 或 ./script-name (當前路徑下執行指令碼)
該方式需要指令碼有執行許可權
[[email protected] SHELL]# ll
total 8
-rw-r--r-- 1 root root 25 Dec 31 10:55 test1.sh
-rw-r--r-- 1 root root 19 Dec 31 10:50 test.sh
[[email protected] SHELL]# chmod +x test.sh
[[email protected] SHELL]# ll
total 8
-rw-r--r-- 1 root root 25 Dec 31 10:55 test1.sh
-rwxr-xr-x 1 root root 19 Dec 31 10:50 test.sh
[[email protected] SHELL]# ./test.sh
hello world
[[email protected] SHELL]#
<3>source script-name 或 . script-name <注意 . 號>
[root@localhost SHELL]# source test.sh
hello world
[root@localhost SHELL]# . test.sh
hello world
[root@localhost SHELL]#
<4>用重定向或者管道來執行
[root@localhost SHELL]# sh <test1.sh
ni hao, ming tian
[root@localhost SHELL]# cat test1.sh | sh
ni hao, ming tian
[root@localhost SHELL]#
例題:
其執行結果為<空>,即就是沒有輸出結果
原因:echo $user是父shell,而test.sh是子shell,父shell不能直接繼承子shell的變數,函式等,反之可以
如果希望可以繼承(即讓父繼承子),用source或者點號執行就可以