1. 程式人生 > >shell指令碼的建立與執行

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或者點號執行就可以