真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

shell知識點有哪些

這篇文章給大家分享的是有關(guān)shell知識點有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

商州網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

$? 前一命令退出狀態(tài),0表示成功

$$ shell進(jìn)程ID

PPID 父進(jìn)程ID

LANG 當(dāng)前Locale的默認(rèn)名稱,其他LC_*變量會覆蓋此值

LC_ALL 當(dāng)前Locale名稱,會覆蓋LANG和其他LC_*

PS1(prompt sign) 當(dāng)前提示字符串

exit 終止整個腳本的執(zhí)行

return 退出當(dāng)前函數(shù)并返回數(shù)字 return N或者$?

shift

shift 3表示原來的$4現(xiàn)在變成$1,原來的$5現(xiàn)在變成$2等等,原來的$1、$2、$3丟棄,$0不移動。不帶參數(shù)的shift命令相當(dāng)于shift 1

getopts

http://blog.sina.com.cn/s/blog_674b5aae0100o2nz.html 

getopts一般格式為:getopts option_string variable

指定變量取值,即在option_string中將一個冒號放在選項后;但當(dāng)冒號放在第一個選項時,代表其作為一個選項存在;

具體含意為如果某選項設(shè)置為取值傳遞但卻未傳值時,返回該選項后的信息,若未添加此選項則默認(rèn)系統(tǒng)也會返回一個錯誤信息,只是錯誤信息提示并不明確。

如getopts ahfvc: option表明選項a、h、f、v可以不加實際值進(jìn)行傳遞,而選項c必須取值。使用選項取值時,必須使用變量OPTARG保存該值。

在使用getopts命令的時候,shell會自動產(chǎn)生兩個變量OPTIND和OPTARG。

OPTIND初始值為1,其含義是下一個待處理的參數(shù)的索引。只要存在,getopts命令返回true,所以一般getopts命令使用while循環(huán);

OPTARG是當(dāng)getopts獲取到其期望的參數(shù)后存入的位置。

#!/bin/bash

if [ $# -lt 1 ]

then

    echo "there is no option";

else

    while getopts ":Iti:s:v" opt;

    do

        case $opt  in

        I)echo "option is I "

        ;;

        t)echo "option is t "

        ;;

        i)ii=$OPTARG;echo "option is i,the value is $ii";

        ;;

        s)ss=$OPTARG;echo "option is s ,the value is $ss";

        ;;

        v)echo "option is v \n";

        ;;

        :)

                echo ">>> Error: '-$OPTARG' requires an argument"

                ;;

        ?)paralist=-1;

        echo ">>> Error: '-$OPTARG' not supported,please input valid argument [Itisv]"

        ;;

        esac

        done   

fi

下面給出幾個執(zhí)行的例子:

(1)sh datediff.sh -i 1 -I -v

option is i,the value is 1

option is I

option is v 

(2)sh datediff.sh -s -i 1

option is s, the value is -i //取s選項后的值

(3)sh datediff.sh -s       //選項中有前置冒號

>>> Error: '-s' requires an argument

sh datediff.sh -s            //去除選項中的前置冒號后的輸出

datediff.sh: option requires an argument -- s

>>> Error: '-' not supported,please input valid argument [Itisv]

subshell和代碼塊

前者由()包圍,后者則是{};

subshell可以在行上任何位置執(zhí)行,會創(chuàng)建一個新進(jìn)程,除此之外,調(diào)用&提交后臺作業(yè)/管道,都會創(chuàng)建新進(jìn)程;

代碼塊只能位于換行字符、分號或關(guān)鍵字之后,與主腳本共享狀態(tài);

http://stackoverflow.com/questions/5547787/running-shell-script-in-parallel
subshell模擬并行運算

#!/bin/bash
for i in $(seq 1 1000)
do
   ( Generating random numbers here , sorting  and outputting to file$i.txt ) &
   if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait

tee

http://linux.chinaunix.net/docs/2007-08-07/4538.shtml 

tee命令會從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),將其內(nèi)容輸出到標(biāo)準(zhǔn)輸出設(shè)備,同時又可將內(nèi)容保存成文件。例如有如下的腳本片段,其作用是獲取本機的ip地址:

ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d : -f3 | awk '{print $1}'` 

#注意=號后面的整句是用反引號(數(shù)字1鍵的左邊那個鍵)括起來的。

echo $ipaddr

運行這個腳本,實際輸出的卻不是本機的ip地址,而是廣播地址,這時我們可以借助tee命令,輸出某些中間結(jié)果,將上述腳本片段修改為:

ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | tee temp.txt | cut -d : -f3 | awk '{print $1}'`

echo $ipaddr

之后,將這段腳本再執(zhí)行一遍,然后查看temp.txt文件的內(nèi)容:

$ cat temp.txt

inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0

我們可以發(fā)現(xiàn)中間結(jié)果的第二列(列之間以:號分隔)才包含了IP地址,而在上面的腳本中使用cut命令截取了第三列,

故我們只需將腳本中的cut -d : -f3改為cut -d : -f2即可得到正確的結(jié)果

trap

http://linux.chinaunix.net/docs/2007-08-07/4538.shtml  

trap命令用于捕獲指定的信號并執(zhí)行預(yù)定義的命令。

其基本的語法是:

trap 'command' signal

其中signal是要捕獲的信號,command是捕獲到指定的信號之后,所要執(zhí)行的命令。

可以用kill –l命令看到系統(tǒng)中全部可用的信號名,捕獲信號后所執(zhí)行的命令可以是任何一條或多條合法的shell語句,也可以是一個函數(shù)名。

shell腳本在執(zhí)行時,會產(chǎn)生三個所謂的“偽信號”,之所以稱之為“偽信號”是因為這三個信號是由shell產(chǎn)生的,而其它的信號是由操作系統(tǒng)產(chǎn)生的

表 1. shell偽信號

信號名 何時產(chǎn)生

EXIT 從一個函數(shù)中退出或整個腳本執(zhí)行完畢

ERR     當(dāng)一條命令返回非零狀態(tài)時(代表命令執(zhí)行不成功)

DEBUG 腳本中每一條命令執(zhí)行之前

通過捕獲EXIT信號,我們可以在shell腳本中止執(zhí)行或從函數(shù)中退出時,輸出某些想要跟蹤的變量的值,并由此來判斷腳本的執(zhí)行狀態(tài)以及出錯原因,其使用方法是:

trap 'command' EXIT或 trap 'command' 0

通過捕獲ERR信號,我們可以方便的追蹤執(zhí)行不成功的命令或函數(shù),并輸出相關(guān)的調(diào)試信息,

以下是一個捕獲ERR信號的示例程序,其中的$LINENO是一個shell的內(nèi)置變量,代表shell腳本的當(dāng)前行號。

$ cat -n exp1.sh

     1  ERRTRAP()

     2  {

     3    echo "[LINE:$1] Error: Command or function exited with status $?"

     4  }

     5  foo()

     6  {

     7    return 1;

     8  }

     9  trap 'ERRTRAP $LINENO' ERR

    10  abc

    11  foo

其輸出結(jié)果如下:

$ sh exp1.sh

exp1.sh: line 10: abc: command not found

[LINE:10] Error: Command or function exited with status 127

[LINE:11] Error: Command or function exited with status 1

在調(diào)試過程中,為了跟蹤某些變量的值,我們常常需要在shell腳本的許多地方插入相同的echo語句來打印相關(guān)變量的值,這種做法顯得煩瑣而笨拙。

而通過捕獲DEBUG信號,我們只需要一條trap語句就可以完成對相關(guān)變量的全程跟蹤。

以下是一個通過捕獲DEBUG信號來跟蹤變量的示例程序:

$ cat –n exp2.sh

     1  #!/bin/bash

     2  trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG

     3  a=1

     4  if [ "$a" -eq 1 ]

     5  then

     6     b=2

     7  else

     8     b=1

     9  fi

    10  c=3

    11  echo "end"

其輸出結(jié)果如下:

$ sh exp2.sh

before execute line:3, a=,b=,c=

before execute line:4, a=1,b=,c=

before execute line:6, a=1,b=,c=

before execute line:10, a=1,b=2,c=

before execute line:11, a=1,b=2,c=3

end

從運行結(jié)果中可以清晰的看到每執(zhí)行一條命令之后,相關(guān)變量的值的變化。

eval

http://www.cnblogs.com/friedwm/archive/2012/04/06/2435171.html  

eval 相當(dāng)于一個參數(shù)替換器,它會把所有 $開頭的變量 進(jìn)行求值替換,然后把替換后的結(jié)果當(dāng)作一條命令來執(zhí)行

#!/bin/bash

PARA="hello world my friend"

function Process()

{

  temp=$(eval echo \$$1 | cut -d ' ' -f 2-)      #1 

  eval $1=\$temp  #2

}

Process PARA

echo $PARA

[oracle@ ~]$ sh tesh.sh
world my friend

說明:

#1處eval先將它后面所有變量求值,$1==PARA,然后再執(zhí)行 echo $PARA | cut -d ' ' -f 2-,得到處理后的值,臨時存于temp。

#2處,先進(jìn)行替換,替換結(jié)果為: PARA=$temp,再執(zhí)行這條命令,結(jié)果復(fù)制回源參數(shù)。

http://doudouclever.blog.163.com/blog/static/175112310201252111104169/  

set 11 22 33 44

如果要輸出最近一個參數(shù),即44,可以使用如下命令,

echo $4

但是如果我們不知道有幾個參數(shù)的時候,要輸出最后一個參數(shù),大家可能會想到使用$#來輸出最后一個參數(shù),

如果使用命令:

echo "\$$#"

則得到的結(jié)果是 $4,而不是我們想要的44。這里涉及到一個變量間接引用的問題,我們的本意是輸出 $4,默認(rèn)情況下,命令后忽略變量間接引用的情況。

這時候,就可以使用eval命令。

eval echo "\$$#"

得到的結(jié)果為44

source、exec與system

http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580749.html   

bash shell的命令分為兩類:外部命令和內(nèi)部命令;

外部命令是通過系統(tǒng)調(diào)用或獨立的程序?qū)崿F(xiàn)的,如sed、awk等等;

內(nèi)部命令是由特殊的文件格式(.def)所實現(xiàn),如cd、history、exec等等。

有兩種方法執(zhí)行shell scripts,一種是新產(chǎn)生一個shell,然后執(zhí)行相應(yīng)的shell scripts;一種是在當(dāng)前shell下執(zhí)行,不再啟用其他shell。

新產(chǎn)生一個shell然后再執(zhí)行scripts的方法是在scripts文件開頭加入以下語句

#!/bin/sh

一般的script文件(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子進(jìn)程),然后在其下執(zhí)行命令。

另外一種方法就是上面說過的source命令,不再產(chǎn)生新的shell,而在當(dāng)前shell下執(zhí)行一切命令。

source命令即點(.)命令。

在bash下輸入man source,找到source命令解釋處,可以看到解釋”Read and execute commands from filename in the current shell environment and …”。

從中可以知道,source命令是在當(dāng)前進(jìn)程中執(zhí)行參數(shù)文件中的各個命令,而不是另起子進(jìn)程(或sub-shell)。

exec:

在bash下輸入man exec,找到exec命令解釋處,可以看到有”No new process is created.”這樣的解釋,這就是說exec命令不產(chǎn)生新的子進(jìn)程。那么exec與source的區(qū)別是什么呢?

1. 系統(tǒng)調(diào)用exec是以新的進(jìn)程去代替原來的進(jìn)程,但進(jìn)程的PID保持不變。因此,可以這樣認(rèn)為,exec系統(tǒng)調(diào)用并沒有創(chuàng)建新的進(jìn)程,只是替換了原來進(jìn)程上下文的內(nèi)容。

原進(jìn)程的代碼段,數(shù)據(jù)段,堆棧段被新的進(jìn)程所代替。

一個進(jìn)程主要包括以下幾個方面的內(nèi)容:

(1)一個可以執(zhí)行的程序

(2) 與進(jìn)程相關(guān)聯(lián)的全部數(shù)據(jù)(包括變量,內(nèi)存,緩沖區(qū))

(3)程序上下文(程序計數(shù)器PC,保存程序執(zhí)行的位置) 

2. exec是一個函數(shù)簇,由6個函數(shù)組成,分別是以excl和execv打頭的。

執(zhí)行exec系統(tǒng)調(diào)用,一般都是這樣,用fork()函數(shù)新建立一個進(jìn)程,然后讓進(jìn)程去執(zhí)行exec調(diào)用。

我們知道,在fork()建立新進(jìn)程之后,父進(jìn)各與子進(jìn)程共享代碼段,但數(shù)據(jù)空間是分開的,但父進(jìn)程會把自己數(shù)據(jù)空間的內(nèi)容copy到子進(jìn)程中去,還有上下文也會copy到子進(jìn)程中去。

而為了提高效率,采用一種寫時copy的策略,即創(chuàng)建子進(jìn)程的時候,并不copy父進(jìn)程的地址空間,父子進(jìn)程擁有共同的地址空間,

只有當(dāng)子進(jìn)程需要寫入數(shù)據(jù)時(如向緩沖區(qū)寫入數(shù)據(jù)),這時候會復(fù)制地址空間,復(fù)制緩沖區(qū)到子進(jìn)程中去。從而父子進(jìn)程擁有獨立的地址空間。

而對于fork()之后執(zhí)行exec后,這種策略能夠很好的提高效率,如果一開始就copy,那么exec之后,子進(jìn)程的數(shù)據(jù)會被放棄,被新的進(jìn)程所代替。

3. exec與system的區(qū)別

(1) exec是直接用新的進(jìn)程去代替原來的程序運行,運行完畢之后不回到原先的程序中去。

(2) system是調(diào)用shell執(zhí)行你的命令,system=fork+exec+waitpid,執(zhí)行完畢之后,回到原先的程序中去。繼續(xù)執(zhí)行下面的部分。

總之,如果你用exec調(diào)用,首先應(yīng)該fork一個新的進(jìn)程,然后exec. 而system不需要你fork新進(jìn)程,已經(jīng)封裝好了。

exec命令在執(zhí)行時會把當(dāng)前的shell process關(guān)閉,然后換到后面的命令繼續(xù)執(zhí)行。

感謝各位的閱讀!關(guān)于“shell知識點有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


網(wǎng)站名稱:shell知識點有哪些
文章路徑:http://weahome.cn/article/gsisji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部