Shell腳本中$0、$?、$!、$$、$*、$#、$@等的意義以及linux命令執行返回值代表意義


Shell腳本中\(0、\)?、\(!、\)\(、\)*、\(#、\)@等的意義以及linux命令執行返回值代表意義

Shell腳本中\(0、\)?、\(!、\)\(、\)*、\(/#、\)@等的意義說明

簡要說明

 ps: 你在Linux環境下多試下就明白了
$$
Shell本身的PID(ProcessID,即腳本運行的當前 進程ID號)
$!
Shell最后運行的后台Process的PID(后台運行的最后一個進程的 進程ID號)
$?
最后運行的命令的結束代碼(返回值)即執行上一個指令的返回值 (顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤)
$-
顯示shell使用的當前選項,與set命令功能相同
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數,此選項參數可超過9個。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$@ 跟$*類似,但是可以當作數組用
$#
添加到Shell的參數個數
$0
Shell本身的文件名
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。 

腳本舉例

 我們先寫一個簡單的腳本,執行以后再解釋各個變量的意義
# touch variable
# vi variable
腳本內容如下:
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
保存退出
賦予腳本執行權限
# chmod +x variable
執行腳本
# ./variable aa bb
number:2
scname:./variable
first: aa
second:bb
argume:aa bb

結果分析

通過顯示結果可以看到:
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1是傳遞給該shell腳本的第一個參數
\(2是傳遞給該shell腳本的第二個參數 \)@ 是傳給腳本的所有參數的列表

linux命令執行返回值說明

在 Linux 下,不管你是啟動一個桌面程序也好,還是在控制台下運行命令,所有的程序在結束時,都會返回一個數字值,這個值叫做返回值,或者稱為錯誤號 ( Error Number )。

在控制台下,有一個特殊的環境變量 $?,保存着前一個程序的返回值,我們可以試試:

$ ls *.png
Diagram1.png  eqn.png         peazip.png
eqn4.png      Mandelbrot.png  x2.png
$ echo $?
0

先隨便執行個命令,比如像上面的 ls 某些文件,然后通過 echo $?,打印 $? 的值~
我們發現返回值是 0,這是什么意思呢?
只要返回值是 0,就代表程序執行成功了~
也就是說,如果 $? 變量的值不是 0 的話,就表示上一個命令在執行的過程中出錯了。

我們可以試着 ls 一個不存在的文件:

$ ls linuxgem
ls: 無法訪問 linuxgem: 沒有那個文件或目錄
$ echo $?
2

這樣,對於某些打印出一堆不熟悉的英文信息的命令,可以方便的看出它是否成功執行結束。
不過,每次都 echo $? 一下太累了,沒關系,你可以把 $? 放在提示符里去:

將上次命令執行是否成功的返回值放到提示符里面去:

export PS1="[\$?]${PS1}"

tom@localhost ~ $ export PS1="[\$?]${PS1}"
[0]tom@localhost ~ $

export PS1="[\$?]${PS1}"  

這個命令把 $? 的值放在的提示符的最前面,這樣每次執行完命令,這個值都會自動更新,這下就一目了然了~

用perror查看錯誤提示

那么如果返回的值不是 0,我們要怎么知道是那里出錯了呢? 大多數的程序出錯都會給出提示,如果沒有提示的話,可以用 perror 這個程序來查看錯誤的信息,比如返回值是 2,我們可以運行:

$ perror 2
OS error code   2:  No such file or directory

這樣就清楚了,原來是文件不存在~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM