久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

shell知識點有哪些

149次閱讀
沒有評論

共計 6383 個字符,預計需要花費 16 分鐘才能閱讀完成。

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

$?  前一命令退出狀態,0 表示成功

$$ shell 進程 ID

PPID  父進程 ID

LANG  當前 Locale 的默認名稱,其他 LC_* 變量會覆蓋此值

LC_ALL  當前 Locale 名稱,會覆蓋 LANG 和其他 LC_*

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

exit  終止整個腳本的執行

return  退出當前函數并返回數字  return N 或者 $?

shift

shift 3 表示原來的 $4 現在變成 $1,原來的 $5 現在變成 $2 等等,原來的 $1、$2、$3 丟棄,$0 不移動。不帶參數的 shift 命令相當于 shift 1

getopts

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

getopts 一般格式為:getopts option_string variable

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

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

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

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

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

OPTARG 是當 getopts 獲取到其期望的參數后存入的位置。

#!/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

下面給出幾個執行的例子:

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

option is i,the value is 1

option is I

option is v \n

(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 可以在行上任何位置執行,會創建一個新進程,除此之外,調用 提交后臺作業 / 管道,都會創建新進程;

代碼塊只能位于換行字符、分號或關鍵字之后,與主腳本共享狀態;

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 命令會從標準輸入讀取數據,將其內容輸出到標準輸出設備, 同時又可將內容保存成文件。例如有如下的腳本片段,其作用是獲取本機的 ip 地址:

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

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

echo $ipaddr

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

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

echo $ipaddr

之后,將這段腳本再執行一遍,然后查看 temp.txt 文件的內容:

$ cat temp.txt

inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0

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

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

trap

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

trap 命令用于捕獲指定的信號并執行預定義的命令。

其基本的語法是:

trap  command  signal

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

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

shell 腳本在執行時,會產生三個所謂的“偽信號”,之所以稱之為“偽信號”是因為這三個信號是由 shell 產生的,而其它的信號是由操作系統產生的

表  1. shell 偽信號

信號名 何時產生

EXIT 從一個函數中退出或整個腳本執行完畢

ERR   當一條命令返回非零狀態時(代表命令執行不成功)

DEBUG 腳本中每一條命令執行之前

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

trap  command  EXIT 或 trap  command  0

通過捕獲 ERR 信號, 我們可以方便的追蹤執行不成功的命令或函數,并輸出相關的調試信息,

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

$ 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

其輸出結果如下:

$ 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

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

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

以下是一個通過捕獲 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

其輸出結果如下:

$ 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

從運行結果中可以清晰的看到每執行一條命令之后,相關變量的值的變化。

eval

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

eval  相當于一個參數替換器,它會把所有  $ 開頭的變量   進行求值替換,然后把替換后的結果當作一條命令來執行

#!/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,然后再執行  echo $PARA | cut -d     -f 2-,得到處理后的值,臨時存于 temp。

#2 處,先進行替換,替換結果為: PARA=$temp,再執行這條命令,結果復制回源參數。

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

set 11 22 33 44

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

echo $4

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

如果使用命令:

echo  \$$#

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

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

eval echo  \$$#

得到的結果為 44

source、exec 與 system

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

bash shell 的命令分為兩類:外部命令和內部命令;

外部命令是通過系統調用或獨立的程序實現的,如 sed、awk 等等;

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

有兩種方法執行 shell scripts,一種是新產生一個 shell,然后執行相應的 shell scripts;一種是在當前 shell 下執行,不再啟用其他 shell。

新產生一個 shell 然后再執行 scripts 的方法是在 scripts 文件開頭加入以下語句

#!/bin/sh

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

另外一種方法就是上面說過的 source 命令,不再產生新的 shell,而在當前 shell 下執行一切命令。

source 命令即點 (.) 命令。

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

從中可以知道,source 命令是在當前進程中執行參數文件中的各個命令,而不是另起子進程(或 sub-shell)。

exec:

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

1.  系統調用 exec 是以新的進程去代替原來的進程,但進程的 PID 保持不變。因此,可以這樣認為,exec 系統調用并沒有創建新的進程,只是替換了原來進程上下文的內容。

原進程的代碼段,數據段,堆棧段被新的進程所代替。

一個進程主要包括以下幾個方面的內容:

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

(2)  與進程相關聯的全部數據(包括變量,內存,緩沖區)

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

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

執行 exec 系統調用,一般都是這樣,用 fork()函數新建立一個進程,然后讓進程去執行 exec 調用。

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

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

只有當子進程需要寫入數據時(如向緩沖區寫入數據), 這時候會復制地址空間,復制緩沖區到子進程中去。從而父子進程擁有獨立的地址空間。

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

3. exec 與 system 的區別

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

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

總之,如果你用 exec 調用,首先應該 fork 一個新的進程,然后 exec.  而 system 不需要你 fork 新進程,已經封裝好了。

exec 命令在執行時會把當前的 shell process 關閉,然后換到后面的命令繼續執行。

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

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計6383字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 荣昌县| 黑龙江省| 通州区| 根河市| 定南县| 宁晋县| 台湾省| 汶川县| 霍城县| 桂平市| 仁化县| 寻甸| 开远市| 吉林省| 大渡口区| 顺平县| 滨海县| 阿城市| 乌拉特中旗| 宣恩县| 黄龙县| 工布江达县| 廉江市| 文登市| 沾化县| 湾仔区| 桓仁| 紫云| 桑日县| 清河县| 敖汉旗| 东乡族自治县| 滕州市| 新干县| 海城市| 中卫市| 象州县| 屏东县| 华坪县| 根河市| 宾川县|