Shell命令學(xué)習(xí)記錄

先學(xué)習(xí)記錄,待整理。。

1. 一分鐘實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的Shell腳本

1.1 創(chuàng)建文件

打開(kāi)文本編輯器(可以使用 vi/vim 命令來(lái)創(chuàng)建文件),新建一個(gè)文件 test.sh,擴(kuò)展名為 sh(sh代表shell)

1.2 編輯內(nèi)容并保存
#!/bin/bash
echo "Hello World !"

解釋:

#! 是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來(lái)執(zhí)行,即使用哪一種 Shell

echo 命令用于向窗口輸出文本

1.3 運(yùn)行Shell腳本
  • 作為可執(zhí)行程序

    cd到相應(yīng)目錄:

    chmod +x ./test.sh  #使腳本具有執(zhí)行權(quán)限
    ./test.sh  #執(zhí)行腳本
    
  • 作為解釋器參數(shù)

    /bin/sh test.sh #直接運(yùn)行解釋器,其參數(shù)就是 shell 腳本的文件名
    
1.4 注釋
  • 單行注釋

    使用#

    #這是一行注釋
    
  • 多行注釋

    :<<'
    注釋內(nèi)容...
    注釋內(nèi)容...
    注釋內(nèi)容...
    '
    
    :<<!
    注釋內(nèi)容...
    注釋內(nèi)容...
    注釋內(nèi)容...
    !
    

2. 變量

2.1 變量的使用
2.1.1 創(chuàng)建變量
your_name="runoob.com"

注意:變量名和等號(hào)之間不能有空格,注意命名規(guī)則

2.1.2 使用變量

使用變量的時(shí)候需要加$

your_name="qinjx"
echo $your_name   #輸出變量your_name的值
echo ${your_name} #輸出變量your_name的值

加{}是為了方便區(qū)別下面循環(huán)場(chǎng)景:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done
2.1.3 只讀變量
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

這樣會(huì)報(bào)錯(cuò),myUrl為只讀的

2.1.4 刪除變量
#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl

以上實(shí)例執(zhí)行將沒(méi)有任何輸出。

2.1.5 變量類型

運(yùn)行shell時(shí),會(huì)同時(shí)存在三種變量:

  • 1) 局部變量 局部變量在腳本或命令中定義,僅在當(dāng)前shell實(shí)例中有效,其他shell啟動(dòng)的程序不能訪問(wèn)局部變量。
  • 2) 環(huán)境變量 所有的程序,包括shell啟動(dòng)的程序,都能訪問(wèn)環(huán)境變量,有些程序需要環(huán)境變量來(lái)保證其正常運(yùn)行。必要的時(shí)候shell腳本也可以定義環(huán)境變量。
  • 3) shell變量 shell變量是由shell程序設(shè)置的特殊變量。shell變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了shell的正常運(yùn)行
2.2 字符串
2.2.1 單引號(hào)和雙引號(hào)
  • 單引號(hào)

    • 單引號(hào)里的任何字符都會(huì)原樣輸出,單引號(hào)字符串中的變量是無(wú)效的;

      #下面這樣是不對(duì)的
      str='123'
      echo 'aaa is $str'
      
    • 單引號(hào)字串中不能出現(xiàn)單獨(dú)一個(gè)的單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義符后也不行),但可成對(duì)出現(xiàn),作為字符串拼接使用。

  • 雙引號(hào)

    • 雙引號(hào)里可以有變量

      #下面這樣是可以的
      str='123'
      echo "aaa is $str"
      
    • 雙引號(hào)里可以出現(xiàn)轉(zhuǎn)義字符

2.2.2 拼接字符串
your_name="runoob"
# 使用雙引號(hào)拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用單引號(hào)拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

輸出結(jié)果為:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
2.2.3 獲取字符串長(zhǎng)度
string="abcd"
echo ${#string} #輸出 4
2.2.4 字符串截取
string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo

3. 參數(shù)傳遞

相關(guān)命令記錄:

$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)。 如"*"用「"」括起來(lái)的情況、以"1 2 …n"的形式輸出所有參數(shù)。
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ *相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。 如"@"用「"」括起來(lái)的情況、以"1" "2" … "$n" 的形式輸出所有參數(shù)。
$- 顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。
#傳遞參數(shù)示例
$ chmod +x test.sh 
$ ./test.sh 1 2 3

上面是運(yùn)行腳本test.sh,并且傳遞了3個(gè)參數(shù)。

3.1 參數(shù)的獲取

腳本內(nèi)獲取參數(shù)的格式為:$n。n 代表一個(gè)數(shù)字,1 為執(zhí)行腳本的第一個(gè)參數(shù),2 為執(zhí)行腳本的第二個(gè)參數(shù)...

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 傳遞參數(shù)實(shí)例!
執(zhí)行的文件名:./test.sh
第一個(gè)參數(shù)為:1
第二個(gè)參數(shù)為:2
第三個(gè)參數(shù)為:3
3.2 補(bǔ)充

* 與@ 區(qū)別:

  • 相同點(diǎn):都是引用所有參數(shù)。
  • 不同點(diǎn):只有在雙引號(hào)中體現(xiàn)出來(lái)。假設(shè)在腳本運(yùn)行時(shí)寫了三個(gè)參數(shù) 1、2、3,,則 " * " 等價(jià)于 "1 2 3"(傳遞了一個(gè)參數(shù)),而 "@" 等價(jià)于 "1" "2" "3"(傳遞了三個(gè)參數(shù))。
echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

執(zhí)行輸出:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

4. 數(shù)組

Bash Shell 只支持一維數(shù)組(不支持多維數(shù)組)

比如:

array_name=(value1 value2 ... valuen)

示例:

my_array=(A B "C" D)

#也可以使用下標(biāo)來(lái)定義數(shù)組:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
4.1 讀取數(shù)組
${array_name[index]}

示例:

my_array=(A B "C" D)

echo "第一個(gè)元素為: ${my_array[0]}"
echo "第二個(gè)元素為: ${my_array[1]}"
echo "第三個(gè)元素為: ${my_array[2]}"
echo "第四個(gè)元素為: ${my_array[3]}"
4.2 獲取數(shù)組中所有元素
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "數(shù)組的元素為: ${my_array[*]}"
echo "數(shù)組的元素為: ${my_array[@]}"

#輸出結(jié)果:
數(shù)組的元素為: A B C D
數(shù)組的元素為: A B C D
4.3 獲取數(shù)組長(zhǎng)度

獲取數(shù)組長(zhǎng)度的方法與獲取字符串長(zhǎng)度的方法相同,例如:

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "數(shù)組元素個(gè)數(shù)為: ${#my_array[*]}"
echo "數(shù)組元素個(gè)數(shù)為: ${#my_array[@]}"

#輸出結(jié)果:
數(shù)組元素個(gè)數(shù)為: 4
數(shù)組元素個(gè)數(shù)為: 4

5. 運(yùn)算符

5.1 算術(shù)運(yùn)算符
運(yùn)算符 說(shuō)明 舉例
+ 加法 expr $a + $b 結(jié)果為 30。
- 減法 expr $a - $b 結(jié)果為 -10。
* 乘法 expr $a \* $b 結(jié)果為 200。
/ 除法 expr $b / $a 結(jié)果為 2。
% 取余 expr $b % $a 結(jié)果為 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等。用于比較兩個(gè)數(shù)字,相同則返回 true。 [ a ==b ] 返回 false。
!= 不相等。用于比較兩個(gè)數(shù)字,不相同則返回 true。 [ a !=b ] 返回 true。

注意:

  1. 表達(dá)式和運(yùn)算符之間要有空格,例如 2+2 是不對(duì)的,必須寫成 2 + 2
  2. 條件表達(dá)式要放在方括號(hào)之間,并且要有空格,例如: [a==b] 是錯(cuò)誤的,必須寫成 [ a ==b ]
  3. 注意使用的是反引號(hào) ` 而不是單引號(hào) '

舉例:

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

輸出:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意:

  • 乘號(hào)(*)前邊必須加反斜杠()才能實(shí)現(xiàn)乘法運(yùn)算;
  • if...then...fi 是條件語(yǔ)句
  • 在 MAC 中 shell 的 expr 語(yǔ)法是:$((表達(dá)式)),此處表達(dá)式中的 "*" 不需要轉(zhuǎn)義符號(hào) ""
5.2 關(guān)系運(yùn)算符
運(yùn)算符 說(shuō)明 舉例
-eq 檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。 [ a -eqb ] 返回 false。
-ne 檢測(cè)兩個(gè)數(shù)是否不相等,不相等返回 true。 [ a -neb ] 返回 true。
-gt 檢測(cè)左邊的數(shù)是否大于右邊的,如果是,則返回 true。 [ a -gtb ] 返回 false。
-lt 檢測(cè)左邊的數(shù)是否小于右邊的,如果是,則返回 true。 [ a -ltb ] 返回 true。
-ge 檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是,則返回 true。 [ a -geb ] 返回 false。
-le 檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。 [ a -leb ] 返回 true。

注意:

關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字。

5.3 布爾運(yùn)算符
運(yùn)算符 說(shuō)明 舉例
! 非運(yùn)算,表達(dá)式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運(yùn)算,有一個(gè)表達(dá)式為 true 則返回 true。 [ a -lt 20 -ob -gt 100 ] 返回 true。
-a 與運(yùn)算,兩個(gè)表達(dá)式都為 true 才返回 true。 [ a -lt 20 -ab -gt 100 ] 返回 false。
5.4 邏輯運(yùn)算符
運(yùn)算符 說(shuō)明 舉例
&& 邏輯的 AND [[ a -lt 100 &&b -gt 100 ]] 返回 false
|| 邏輯的 OR [[ a -lt 100 ||b -gt 100 ]] 返回 true
5.5 字符串運(yùn)算符
運(yùn)算符 說(shuō)明 舉例
= 檢測(cè)兩個(gè)字符串是否相等,相等返回 true。 [ a =b ] 返回 false。
!= 檢測(cè)兩個(gè)字符串是否相等,不相等返回 true。 [ a !=b ] 返回 true。
-z 檢測(cè)字符串長(zhǎng)度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測(cè)字符串長(zhǎng)度是否不為 0,不為 0 返回 true。 [ -n "$a" ] 返回 true。
$ 檢測(cè)字符串是否為空,不為空返回 true。 [ $a ] 返回 true。
5.6 文件測(cè)試運(yùn)算符
操作符 說(shuō)明 舉例
-b file 檢測(cè)文件是否是塊設(shè)備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測(cè)文件是否是字符設(shè)備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測(cè)文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測(cè)文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測(cè)文件是否設(shè)置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測(cè)文件是否設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測(cè)文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測(cè)文件是否設(shè)置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測(cè)文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測(cè)文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測(cè)文件是否可執(zhí)行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測(cè)文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測(cè)文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。

示例:

if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

6. echo

  • 顯示普通字符串

    echo "It is a test"
    
  • 顯示轉(zhuǎn)義字符

    echo "\"It is a test\""
    
    # 輸出結(jié)果:
    "It is a test"
    
  • 顯示變量

    read 命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值指定給 shell 變量

    #!/bin/sh
    read name 
    echo "$name It is a test"
    
    # 以上代碼保存為 test.sh,name 接收標(biāo)準(zhǔn)輸入的變量,結(jié)果將是:
    # sh test.sh
    OK                     #標(biāo)準(zhǔn)輸入
    OK It is a test        #輸出
    
  • 顯示換行

    echo -e "OK! \n" # -e 開(kāi)啟轉(zhuǎn)義
    echo "It is a test"
    # 輸出結(jié)果:
    OK!
    
    It is a test
    
  • 顯示不換行

    #!/bin/sh
    echo -e "OK! \c" # -e 開(kāi)啟轉(zhuǎn)義 \c 不換行
    echo "It is a test"
    
    # 輸出結(jié)果:
    OK! It is a test
    
  • 顯示結(jié)果定向至文件

    echo "It is a test" > myfile
    
  • 原樣輸出字符串,不進(jìn)行轉(zhuǎn)義或者取變量

    echo '$name\"'
    # 輸出結(jié)果:
    $name\"
    
  • 顯示命令執(zhí)行結(jié)果

    # 這里使用的是反引號(hào) `, 而不是單引號(hào) '。
    echo `date`
    # 輸出結(jié)果:
    2020年 9月 7日 星期一 16時(shí)33分53秒 CST
    

7.printf命令

  • 移植性比echo好
  • 不會(huì)像echo默認(rèn)加換行符,可以手動(dòng)加\n

printf 命令的語(yǔ)法:

printf  format-string  [arguments...]
#format-string: 為格式控制字符串
#arguments: 為參數(shù)列表。

舉例1:

#!/bin/bash
# author:菜鳥(niǎo)教程
# url:www.runoob.com
 
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 楊過(guò) 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

輸出結(jié)果:
姓名     性別   體重kg
郭靖     男      66.12
楊過(guò)     男      48.65
郭芙     女      47.99

%s %c %d %f都是格式替代符

%-10s 指一個(gè)寬度為10的字符(-表示左對(duì)齊,沒(méi)有則代表右對(duì)齊),任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過(guò)也會(huì)將內(nèi)容全部顯示出來(lái)。

%-4.2f 指格式化為小數(shù),.2指保留2位小數(shù)

補(bǔ)充:

#!/bin/bash
# author:菜鳥(niǎo)教程
# url:www.runoob.com
 
# format-string為雙引號(hào)
printf "%d %s\n" 1 "abc"

# 單引號(hào)與雙引號(hào)效果一樣 
printf '%d %s\n' 1 "abc" 

# 沒(méi)有引號(hào)也可以輸出
printf %s abcdef

# 格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會(huì)按照該格式輸出,format-string 被重用
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# 如果沒(méi)有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n" 

輸出結(jié)果:
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

8. test命令

test 命令用于檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測(cè)試

8.1 數(shù)值測(cè)試
參數(shù) 說(shuō)明
-eq 等于則為真
-ne 不等于則為真
-gt 大于則為真
-ge 大于等于則為真
-lt 小于則為真
-le 小于等于則為真

示例:

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '兩個(gè)數(shù)相等!'
else
    echo '兩個(gè)數(shù)不相等!'
fi

代碼中的 [] 執(zhí)行基本的算數(shù)運(yùn)算,比如:

#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等號(hào)兩邊不能有空格
echo "result 為: $result"
8.2 字符串測(cè)試
參數(shù) 說(shuō)明
= 等于則為真
!= 不相等則為真
-z 字符串 字符串的長(zhǎng)度為零則為真
-n 字符串 字符串的長(zhǎng)度不為零則為真

示例:

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '兩個(gè)字符串相等!'
else
    echo '兩個(gè)字符串不相等!'
fi
8.3 文件測(cè)試
參數(shù) 說(shuō)明
-e 文件名 如果文件存在則為真
-r 文件名 如果文件存在且可讀則為真
-w 文件名 如果文件存在且可寫則為真
-x 文件名 如果文件存在且可執(zhí)行則為真
-s 文件名 如果文件存在且至少有一個(gè)字符則為真
-d 文件名 如果文件存在且為目錄則為真
-f 文件名 如果文件存在且為普通文件則為真
-c 文件名 如果文件存在且為字符型特殊文件則為真
-b 文件名 如果文件存在且為塊特殊文件則為真

示例:

cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

另外,Shell 還提供了與( -a )、或( -o )、非( ! )三個(gè)邏輯操作符用于將測(cè)試條件連接起來(lái),其優(yōu)先級(jí)為: ! 最高, -a 次之, -o 最低。例如:

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一個(gè)文件存在!'
else
    echo '兩個(gè)文件都不存在'
fi

9. 流程控制

在sh/bash里如果else分支沒(méi)有語(yǔ)句執(zhí)行,就不要寫這個(gè)else。

9.1 if else
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi #末尾的fi就是if倒過(guò)來(lái)拼寫
9.2 if else-if else
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
9.3 for 循環(huán)

當(dāng)變量值在列表里,for循環(huán)即執(zhí)行一次所有命令,使用變量名獲取列表中的當(dāng)前取值。命令可為任何有效的shell命令和語(yǔ)句。in列表可以包含替換、字符串和文件名。

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
9.4 while
while condition
do
    command
done
9.5 無(wú)限循環(huán)
while true
do
    command
done
until 循環(huán)

until 循環(huán)執(zhí)行一系列命令直至條件為 true 時(shí)停止。

until 循環(huán)與 while 循環(huán)在處理方式上剛好相反。

一般 while 循環(huán)優(yōu)于 until 循環(huán),但在某些時(shí)候—也只是極少數(shù)情況下,until 循環(huán)更加有用。

until 語(yǔ)法格式:

until condition
do
    command
done
9.7 case
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

示例:

echo '輸入 1 到 4 之間的數(shù)字:'
echo '你輸入的數(shù)字為:'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒(méi)有輸入 1 到 4 之間的數(shù)字'
    ;;
esac

10. 函數(shù)

函數(shù)定義如下:

[ function ] funname [()]

{

    action;

    [return int;]

}
10.1 不帶參數(shù)和返回值得函數(shù)
demoFun(){
    echo "這是我的第一個(gè) shell 函數(shù)!"
}
echo "-----函數(shù)開(kāi)始執(zhí)行-----"
demoFun
echo "-----函數(shù)執(zhí)行完畢-----"
10.2 帶return語(yǔ)句的函數(shù)
funWithReturn(){
    echo "這個(gè)函數(shù)會(huì)對(duì)輸入的兩個(gè)數(shù)字進(jìn)行相加運(yùn)算..."
    echo "輸入第一個(gè)數(shù)字: "
    read aNum
    echo "輸入第二個(gè)數(shù)字: "
    read anotherNum
    echo "兩個(gè)數(shù)字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個(gè)數(shù)字之和為 $? !"

輸出結(jié)果:
這個(gè)函數(shù)會(huì)對(duì)輸入的兩個(gè)數(shù)字進(jìn)行相加運(yùn)算...
輸入第一個(gè)數(shù)字: 
1
輸入第二個(gè)數(shù)字: 
2
兩個(gè)數(shù)字分別為 1 和 2 !
輸入的兩個(gè)數(shù)字之和為 3 !

函數(shù)返回值在調(diào)用該函數(shù)后通過(guò) $? 來(lái)獲得。

注意:所有函數(shù)在使用前必須定義。這意味著必須將函數(shù)放在腳本開(kāi)始部分,直至shell解釋器首次發(fā)現(xiàn)它時(shí),才可以使用。調(diào)用函數(shù)僅使用其函數(shù)名即可。

10.3 函數(shù)參數(shù)

在Shell中,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過(guò) n 的形式來(lái)獲取參數(shù)的值,例如,1表示第一個(gè)參數(shù),$2表示第二個(gè)參數(shù)...

funWithParam(){
    echo "第一個(gè)參數(shù)為 $1 !"
    echo "第二個(gè)參數(shù)為 $2 !"
    echo "第十個(gè)參數(shù)為 $10 !"
    echo "第十個(gè)參數(shù)為 ${10} !"
    echo "第十一個(gè)參數(shù)為 ${11} !"
    echo "參數(shù)總數(shù)有 $# 個(gè)!"
    echo "作為一個(gè)字符串輸出所有參數(shù) $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

輸出結(jié)果:
第一個(gè)參數(shù)為 1 !
第二個(gè)參數(shù)為 2 !
第十個(gè)參數(shù)為 10 !
第十個(gè)參數(shù)為 34 !
第十一個(gè)參數(shù)為 73 !
參數(shù)總數(shù)有 11 個(gè)!
作為一個(gè)字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !

注意,10 不能獲取第十個(gè)參數(shù),獲取第十個(gè)參數(shù)需要{10}。當(dāng)n>=10時(shí),需要使用${n}來(lái)獲取參數(shù)。

用來(lái)處理參數(shù)的特殊字符:

參數(shù)處理 說(shuō)明
$# 傳遞到腳本或函數(shù)的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。
$- 顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。
11. 輸入/輸出重定向
命令 說(shuō)明
command > file 將輸出重定向到 file。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file。
n > file 將文件描述符為 n 的文件重定向到 file。
n >> file 將文件描述符為 n 的文件以追加的方式重定向到 file。
n >& m 將輸出文件 m 和 n 合并。
n <& m 將輸入文件 m 和 n 合并。
<< tag 將開(kāi)始標(biāo)記 tag 和結(jié)束標(biāo)記 tag 之間的內(nèi)容作為輸入。

需要注意的是文件描述符 0 通常是標(biāo)準(zhǔn)輸入(STDIN),1 是標(biāo)準(zhǔn)輸出(STDOUT),2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)。

11.1 輸出重定向
command1 > file1 #表示執(zhí)行command1然后將輸出的內(nèi)容存入file1,注意任何file1內(nèi)的已經(jīng)存在的內(nèi)容將被新內(nèi)容替代。如果要將新內(nèi)容添加在文件末尾,請(qǐng)使用>>操作符。

示例:

echo "測(cè)試文本內(nèi)容" > aa.txt

執(zhí)行后并沒(méi)有在終端輸出信息,會(huì)將who命令的結(jié)果輸入到aa.txt文件中,并且會(huì)覆蓋原有內(nèi)容,如果想在原有內(nèi)容之后追加,可以使用>>

echo "追加測(cè)試文本" >> aa.txt
11.2 輸入重定向

和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語(yǔ)法為:

command1 < file1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容