shell set命令使用詳解

2021-10-14 04:32:57 字數 3607 閱讀 9175

會顯示所有的環境變數和 shell 函式

$ cat script.sh

set

a=1b=2

c=3echo

$aecho

$becho

$cecho

$d

$ script.sh

bash script.sh

bash=/bin/bash

bashopts=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath

bash_aliases=()

bash_argc=()

bash_ar**=()

bash_cmds=()

bash_lineno=

([0]

="0"

)bash_source=

([0]

="script.sh"

)bash_versinfo=

([0]

="4"

[1]=

"3"[2]

="48"

[3]=

"1"[4]

="release"

[5]=

"x86_64-pc-linux-gnu"

)bash_version=

'4.3.48(1)-release'

遇到不存在的變數就會報錯,並停止執行,或者-o nounset

$ cat script.sh

set -u #-o nounset

a=1b=2

c=3echo

$aecho

$becho

$cecho

$d

$ bash script.sh12

3script.sh: line 9: d: unbound variable

用來在執行結果之前,先輸出執行的那一行命令,或者set -o xtrace

$ cat script.sh 

set -x #set -o xtrace

a=1b=2

c=3echo

$aecho

$becho

$cecho

$d

執行結果:

$ bash script.sh

+ a=1

+ b=2

+ c=3

+ echo 1

1+ echo 2

2+ echo 3

3+ echo

#!/usr/bin/env bash

fooecho bar

上面指令碼中,foo是乙個不存在的命令,執行時會報錯。但是,bash 會忽略這個錯誤,繼續往下執行。

$ bash script.sh

script.sh:行3: foo: 未找到命令

bar

可以看到,bash 只是顯示有錯誤,並沒有終止執行。

這種行為很不利於指令碼安全和除錯。實際開發中,如果某個命令失敗,往往需要指令碼停止執行,防止錯誤累積。這時,一般採用下面的寫法。

command

||exit 1

上面的寫法表示只要command有非零返回值,指令碼就會停止執行。

如果停止執行之前需要完成多個操作,就要採用下面三種寫法。

# 寫法一

command

||# 寫法二if!

command

;then

echo

"command failed"

;exit 1;

fi# 寫法三

commandif[

"$?" -ne 0 ]

;then

echo

"command failed"

;exit 1;

fi

另外,除了停止執行,還有一種情況。如果兩個命令有繼承關係,只有第乙個命令成功了,才能繼續執行第二個命令,那麼就要採用下面的寫法。

command1 && command2
set -e從根本上解決了這個問題,它使得指令碼只要發生錯誤,就終止執行。或者set -o errexit

#!/usr/bin/env bash

set -e

fooecho bar

執行結果如下。

$ bash script.sh

script.sh:行4: foo: 未找到命令

可以看到,第4行執行失敗以後,指令碼就終止執行了。

set -e根據返回值來判斷,乙個命令是否執行失敗。但是,某些命令的非零返回值可能不表示失敗,或者開發者希望在命令失敗的情況下,指令碼繼續執行下去。這時可以暫時關閉set -e,該命令執行結束後,再重新開啟set -e。

set +e

command1

command2

set -e

上面**中,set +e表示關閉-e選項,set -e表示重新開啟-e選項。

還有一種方法是使用command || true,使得該命令即使執行失敗,指令碼也不會終止執行。

#!/bin/bash

set -e

foo ||

true

echo bar

set -e有乙個例外情況,就是不適用於管道命令。

所謂管道命令,就是多個子命令通過管道運算子(|)組合成為乙個大的命令。bash 會把最後乙個子命令的返回值,作為整個命令的返回值。也就是說,只要最後乙個子命令不失敗,管道命令總是會執行成功,因此它後面命令依然會執行,set -e就失效了。

請看下面這個例子。

#!/usr/bin/env bash

set -e

foo |

echo a

echo bar

執行結果如下。

$ bash script.sh

ascript.sh:行4: foo: 未找到命令

bar

上面**中,foo是乙個不存在的命令,但是foo | echo a這個管道命令會執行成功,導致後面的echo bar會繼續執行。

set -o pipefail用來解決這種情況,只要乙個子命令失敗,整個管道命令就失敗,指令碼就會終止執行。

#!/usr/bin/env bash

set -eo pipefail

foo |

echo a

echo bar

執行後,結果如下。

$ bash script.sh

ascript.sh:行4: foo: 未找到命令

AT命令使用詳解

日常管理工作中,常常要求某項服務能定時開啟 關閉。windows 提供的at命令能夠實現這一點。利用它可實現ras服務定時開關,其具體步驟如下 1.在 設定 控制面板 服務 或執行中輸入services.msc啟動schedule服務,並將其啟動方式屬性設定為自動。2.在命令視窗中使用at命令設定服...

FTP命令使用詳解

ftp命令是internet使用者使用最頻繁的命令之一,不論是在dos還是unix作業系統下使用ftp,都會遇到大量的ftp內部命令。熟悉並靈活應用ftp的內部命令,可以大大方便使用者,並收到事半功倍之效。ftp的命令列格式為 ftp v d i n g 主機名 其中 v 顯示遠端伺服器的所有響應資...

linux ps命令使用詳解

ps 是linux 下最常用的也是非常強大的程序檢視命令 1.ps 簡介前面介紹的兩個命令都是用於檢視當前系統使用者的情況,下面就來看看程序的情況,這也是本章的主題。要對程序進行監測和控制,首先必須要了解當前程序的情況,也就是需要檢視當前程序,而 ps命令就是最基本 同時也是非常強大的程序檢視命令。...