構建shell腳本一文就夠

2021-12-30 生信技能樹

收錄於話題 #一文就夠 10個

非常多的朋友在看我們公眾號過往轉錄組,WES,等流程分享的時候發現很難理解我們的代碼,其實就是缺乏shell腳本知識,那麼這篇教程你就不容錯過。

內容

使用多個命令

創建腳本文件

顯示消息

使用變量

輸入輸出重定向

管道

數學運算

退出腳本

一個腳本例子

bed=exon_probe.hg38.gene.bed

for bam in  /home/project/*.bam

do

file=$(basename $bam )

sample=${file%%.*}

echo $sample

export total_reads=$(samtools idxstats  $bam|awk -F '\t' '{s+=$3}END{print s}')

echo The number of reads is $total_reads

bedtools multicov -bams  $bam -bed $bed |perl -alne '{$len=$F[2]-$F[1];if($len <1 ){print "$.\t$F[4]\t0" }else{$rpkm=(1000000000*$F[4]/($len* $ENV{total_reads}));print "$.\t$F[4]\t$rpkm"}}' >$sample.rpkm.txt

done

這個腳本看起來不複雜,但是裡面應用到了接下來要講解的所有知識點。

使用多個命令

如果多個命令一起使用,可以放在一行並用分號分隔。

wsx@wsx-ubuntu:~$ date; who

2017年 07月 26日 星期三 09:53:43 CST

wsx      tty7         2017-07-26 09:48 (:0)

創建腳本文件

在創建腳本文件時,必須在文件的第一行指定要使用的shell,格式為:

#!/bin/bash

腳本文件的第一行中 #後的驚嘆號會告訴shell使用哪個shell來運行腳本(如果是其他編碼語言腳本,像python,第一行類似)。

其他地方的 #用作注釋行。

添加名為 test1的腳本文件,內容為:

#!/bin/bash

# This script displays the date and who's logged on

date

who

運行一個腳本怎麼會那麼難?

現在運行腳本,結果會是:

wsx@wsx-ubuntu:~/script_learn$ test1

未找到 'test1' 命令,您要輸入的是否是:

命令 'testr' 來自於包 'python3-testrepository' (main)

命令 'testr' 來自於包 'python-testrepository' (universe)

命令 'test' 來自於包 'coreutils' (main)

test1:未找到命令

我們現在需要做的是讓bash shell能夠找到我們的腳本文件。shell會通過 PATH環境變量來查找命令,我們可以看看:

wsx@wsx-ubuntu:~/script_learn$ echo $PATH

/home/wsx/Anaconda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

很顯然,我們的文件沒有在這些目錄範圍內。要讓shell找到test1腳本,我們可以採取以下兩種做法之一:

第二種方法比較簡單,我們在這裡試試:

wsx@wsx-ubuntu:~/script_learn$ ./test1

bash: ./test1: 權限不夠

wsx@wsx-ubuntu:~/script_learn$ ll test1 # 發現權限不夠,查看文件的權限

-rw-rw-r-- 1 wsx wsx 73 7月  26 10:03 test1

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test1 # 修改權限,添加可執行屬性

wsx@wsx-ubuntu:~/script_learn$ ./test1 # 成功運行腳本

2017年 07月 26日 星期三 10:09:23 CST

wsx      tty7         2017-07-26 09:48 (:0)

顯示消息

在 echo命令後面加上一個字符串,就能顯示出這個文本字符串。這種方式可以添加自己的文本消息來告訴腳本用戶腳本正在做什麼。

wsx@wsx-ubuntu:~/script_learn$ echo This is a test

This is a test

如果文本本身帶有字符串,我們需要用單引號或雙引號來劃定文本字符串

wsx@wsx-ubuntu:~/script_learn$ echo "Let's see if this'll work"

Let's see if this'll work

我們修改下之前的test1文件,增加消息顯示:

#!/bin/bash

# This script displays the date and who's logged on

echo The time and date are:

date

echo "Let's see who's logged into the system"

who

運行:

wsx@wsx-ubuntu:~/script_learn$ ./test1

The time and date are:

2017年 07月 26日 星期三 10:17:59 CST

Let's see who's logged into the system

wsx      tty7         2017-07-26 09:48 (:0)

如果想把文本字符串和命令輸出顯示在同一行中,可以用 echo語句的 -n參數。需要在字符串的兩側加上引號,並且保證字符串尾部有一個空格(不然字符串和命令輸出就粘連到一起了)。

#!/bin/bash

# This script displays the date and who's logged on

echo -n "The time and date are: "

date

echo  "Let's see who's logged into the system: "

who

# 運行結果輸出

wsx@wsx-ubuntu:~/script_learn$ ./test1

The time and date are: 2017年 07月 26日 星期三 10:24:04 CST

Let's see who's logged into the system:

wsx      tty7         2017-07-26 09:48 (:0)

使用變量

變量允許我們臨時性地將信息存儲在shell腳本中,以便和腳本中的其他命令一起使用。

環境變量

shell維護著一組環境變量,用來記錄特定的系統信息。比如系統的名稱、登錄到系統上的用戶名、用戶的系統ID(也稱為UID)、用戶默認主目錄以及shell查找程序的搜索路徑。

使用 set命令顯示一份完整的當前環境變量列表。 env與 printenv命令都可以顯示全局變量。(這些命令輸出結果比較多,不展示了。之前關於環境變量的筆記有比較詳細的描述。)

在環境變量名稱之前加上美元符可以使用這些環境變量。

wsx@wsx-ubuntu:~/script_learn$ cat test2

#! /bin/bash

# display user information from the system

echo "User info for userid: $USER"

echo UID: $UID

echo HOME: $HOME

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test2

wsx@wsx-ubuntu:~/script_learn$ ./test2

User info for userid: wsx

UID: 1000

HOME: /home/wsx

可以想像的到,如果我們想要使用實際的美元符而不是引用變量,肯定會出問題。這時候我們需要在美元符前面加上 \進行轉義,以顯示美元符本身。

用戶變量

使用等號將值賦給用戶變量。注意,在變量、等號和值之間不能出現空格!這個是初學者常見的一個問題,本人也非常不太適應這個。因為在其他語言中不區分等號兩邊的空格,相信接觸過其他腳本的朋友們肯定有習慣打空格使代碼美觀的,這在bash shell中是萬萬行不通滴。

一個使用的例子:

wsx@wsx-ubuntu:~/script_learn$ cat test3

#!/bin/bash

# testing variables

days=10

guest="Katie"

echo "$guest checked in $days days ago"

days=5

guest="Jessica"

echo "$guest checked in $days days ago"

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test3

wsx@wsx-ubuntu:~/script_learn$ ./test3

Katie checked in 10 days ago

Jessica checked in 5 days ago

變量每次被引用時,都會輸出當前賦給它的值。重要的是要記住,引用一個變量值時需要使用美元符,而引用變量來對其進行賦值時則不需要使用美元符。

命令替換

shell腳本最有用的特性之一就是可以從命令輸出中提取信息,並將其賦給變量。

有兩種方法可以將命令輸出賦給變量:

要麼用一對反引號把整個命令行命令圍起來:

testing=`date`

要麼使用$()格式

testing=$(date)

下面是一個例子,在腳本中通過命令替換獲得當前日期並用它來生成唯一文件名:

wsx@wsx-ubuntu:~/script_learn$ cat test4

#!/bin/bash

# copy the /usr/bin directory listing to a log file

today=$(date +%y%m%d)

ls /usr/bin -al > log.$today

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test4

wsx@wsx-ubuntu:~/script_learn$ ./test4

重定向輸入和輸出

通過幾個操作符進行重定向,我們可以將命令的結果輸出到另外的位置(文件)。當然,重定向可以用於輸入。

輸出重定向

最基本的操作符是 >。比如我們想要輸出命令結果到一個指定文件:

wsx@wsx-ubuntu:~/script_learn$ date > test6

wsx@wsx-ubuntu:~/script_learn$ ls -l test6

-rw-rw-r-- 1 wsx wsx 43 7月  26 16:42 test6

wsx@wsx-ubuntu:~/script_learn$ cat test6

2017年 07月 26日 星期三 16:42:34 CST

如果想要將命令的輸出追加到已有文件中,需要用雙大於號(>>)來追加數據。

輸入重定向

輸入重定向和輸出重定向正好相反。輸入重定向將文件的內容重定向到命令,而非將命令的輸出重定向到文件。

使用的符號是小於號(<)。

一種簡單的記憶方法是:在命令行上,命令總是在左側,而重定向符號「指向」數據流動的方向。小於號說明數據正在從輸入文件流向命令。

比如用wc命令檢查文本的行數、詞數和字節數。

wsx@wsx-ubuntu:~/script_learn$ wc < test6

1  6 43

另一種輸入重定向的方法是內聯輸入重定向。它無需使用文件進行重定向,只需要在命令行中指定用於輸入重定向的數據即可。它使用的符號是遠小於號(<<),除了這個符號,我們還需要指定一個文本標記用來劃分輸入數據的開始和結尾。任何字符串都可以作為文本標記,但在數據的開始和結尾文本標記必須一致。

wsx@wsx-ubuntu:~/script_learn$ wc << EOF

> test string1

> test string2

> test string3

> EOF

3  6 39

它的形式為:

command << marker

data

marker

管道

很多生信命令行工具需要提供多個輸入和輸出參數,這用在管道命令裡可能會導致非常低效的情形(管道只接受一個標準輸入和輸出)。幸好,我們可以使用命令管道來解決此類問題。

命名管道,也稱為FIFO。它是一個特殊的排序文件,命名管道有點像文件,它可以永久保留在你的文件系統上(估計本質就是文件吧~)。

比如我想查看某個文件(test1)的前兩行並進行排序,操作如下:

wsx@wsx-ubuntu:~/script_learn$ cat test1

#!/bin/bash

# This script displays the date and who's logged on

echo -n "The time and date are: "

date

echo  "Let's see who's logged into the system: "

who

wsx@wsx-ubuntu:~/script_learn$ cat test1 | head -2 | sort

#!/bin/bash

# This script displays the date and who's logged on

管道的強大之處在於可以根據自己的需求靈活地組合和使用各種linux命令工具。這裡只是一個簡單的例子,要熟練掌握少不了平時多多研究和練習。

進程替換

有些命令需要接受多個管道的輸入作為自己的輸出,這個時候普通的管道已經無法完成任務了。需要用到進程替換,來避免多次創建中間文件,代碼如下:

start=$(date +%s.%N)

echo VarScan `date`

normal_pileup="samtools mpileup -q 1 -f $reference $normal_bam";

tumor_pileup="samtools mpileup -q 1 -f $reference $tumor_bam";

# Next, issue a system call that pipes input from these commands into VarScan :

java -Djava.io.tmpdir=$TMPDIR   -Xmx40g  -jar ~/biosoft/VarScan/VarScan.v2.3.9.jar \

somatic <($normal_pileup) <($tumor_pileup) ${sample}_varscan

java -jar ~/biosoft/VarScan/VarScan.v2.3.9.jar processSomatic ${sample}_varscan.snp

echo VarScan `date`

dur=$(echo "$(date +%s.%N) - $start" | bc)

printf "Execution time for VarScan : %.6f seconds" $dur

echo

執行數學運算

對shell腳本來說,執行數學運算非常麻煩。有兩種實現方式。

expr命令

expr命令允許在命令行上處理數學表達式,但是特別笨拙。(Bourne shell中)

wsx@wsx-ubuntu:~/script_learn$ exrpr 1 + 5

未找到 'exrpr' 命令,您要輸入的是否是:

命令 'expr' 來自於包 'coreutils' (main)

exrpr:未找到命令

看到沒有,那算了。它基本涉及的操作跟我們使用的其他語言是一致的。但是有些問題需要處理,像 *是通配符,在運算是是做乘號處理的,需要進行轉義。

使用方括號

bash shell提供了一種更簡單的方法來執行數學表達式。在bash中,在將一個數學運算結果賦給某個變量時,可以用美元符和方括號($[operator])將數學表達式圍起來。

wsx@wsx-ubuntu:~/script_learn$ var1=$[1+5]

wsx@wsx-ubuntu:~/script_learn$ echo $var1

6

wsx@wsx-ubuntu:~/script_learn$ var2=$[$var1+2]

wsx@wsx-ubuntu:~/script_learn$ echo $var2

8

這種方式不僅方便,而且因為在方括號內,不會讓shell誤解乘號或其他符號。

但bash shell計算有一個主要限制:它只支持整數運算!

浮點解決方案

最常見的方案是用內建的bash計算器。它實際上是一門程式語言,它允許在命令行中輸入浮點表達式,然後解釋並計算該表達式,最後返回結果。bash計算器能夠識別:

數字(整數和浮點數)

變量(簡單變量和數組)

注釋(/* */開始的行)

表達式

編程語句

函數

wsx@wsx-ubuntu:~/script_learn$ bc

bc 1.06.95

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'.

12 * 5.4

64.8

3.156 * (3 + 5)

25.248

quit

在腳本中使用bc

可以用命令替換運行bc命令,並將輸出賦給一個變量。基本格式如下:

variable=$(echo "options; expression" | bc)

options設置變量,expression參數定義了通過bc執行的數學表達式。

看一個簡單實例:

wsx@wsx-ubuntu:~/script_learn$ cat test9

#!/bin/bash

var1=$(echo "scale=4; 3.44/5" | bc)

echo The answer is $var1

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test9

wsx@wsx-ubuntu:~/script_learn$ ./test9

The answer is .6880

這個例子將 scale變量設置為四位小數,並在 expression部分指定了特定的運算。

這個方法適用於較短的運算,但有時我們會涉及更多的數字。如果需要進行大量運算,在一個命令行中列出多個表達式就會有點麻煩。

這裡有一個解決方法:使用內聯輸入重定向,將一個文件重定向到bc命令來處理。格式為:

variable=$(bc << EOF

options

statements

expressions

EOF)

EOF文本字符串標識了內聯重定向數據的起始。注意,仍然需要命令替換符號將bc命令的輸出賦給變量。

下面是一個例子:

wsx@wsx-ubuntu:~/script_learn$ cat test10

#!/bin/bash

var1=10.46

var2=43.67

var3=33.2

var4=71

var5=$(bc <<EOF

scale=4

a1 = ( $var1 * $var2)

b1 = ( $var3 * $var4)

a1 + b1

EOF

)

echo The final answer for this mess is $var5

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test10

wsx@wsx-ubuntu:~/script_learn$ ./test10

The final answer for this mess is 2813.9882

在普通的shell腳本中,數字默認當做字符串處理。這也是為什麼我們腳本處理計算麻煩和我們需要特定的工具和方法來進行處理。一定要注意區分。

退出腳本

前面運行的腳本都是命令執行完成,腳本自動結束。其實我們可以用更為優雅的方式告訴shell命令運行完成,因為每個命令都使用退出狀態碼(exit status),它是一個0-255的整數值,我們可以捕獲這個值並在腳本中使用。

Linux提供了一個專門的變量$?`來保存上個已執行命令的退出狀態碼。

wsx@wsx-ubuntu:~/script_learn$ date

2017年 07月 27日 星期四 10:44:18 CST

wsx@wsx-ubuntu:~/script_learn$ echo $?

0

按照慣例,一個成功結束的命令的退出狀態碼是0。如果有錯誤,則顯示一個正數值。

Linux錯誤退出狀態碼沒有什麼標準,但有一些參考:

狀態碼描述0命令成功結束1一般性未知錯誤2不適合的shell命令126命令不可執行127沒找到命令128無效的退出參數128+x與Linux信號x相關的嚴重錯誤130通過Ctrl+C終止的命令255正常範圍之外的退出狀態碼

wsx@wsx-ubuntu:~/script_learn$ asfg

未找到 'asfg' 命令,您要輸入的是否是:

命令 'asdfg' 來自於包 'aoeui' (universe)

asfg:未找到命令

wsx@wsx-ubuntu:~/script_learn$ echo $?

127

exit命令

默認,shell腳本會以腳本最後的一個命令的退出狀態碼退出。

但是我們可以改變這種默認行為,返回自己的退出狀態碼。exit命令允許在腳本結束時指定一個狀態退出碼。

wsx@wsx-ubuntu:~/script_learn$ cat test13

#!/bin/bash

# testing the exit status

var1=10

var2=30

var3=$[$var1 + $var2]

echo The answer is $var3

exit 5

## 上面就是腳本的內容,用cat可以查看文本文件,下面就添加可執行權限並且執行該腳本

wsx@wsx-ubuntu:~/script_learn$ chmod u+x test13

wsx@wsx-ubuntu:~/script_learn$ ./test13

The answer is 40

wsx@wsx-ubuntu:~/script_learn$ echo $?

5

注意最大255,如果大於它,得到的是求模的結果(餘數)。

腳本高級知識

還有一些腳本高級知識,不予講解,感興趣的同學可以自行購買相關書籍和專業視頻自學:

處理信號

以後臺模式運行腳本

禁止掛起

作業控制

修改腳本優先級

腳本執行自動化

這裡強烈推薦馬哥linux視頻,在生信技能樹的公眾號後臺回復 馬哥 可以拿到系列視頻~ 

相關焦點

  • Linux shell腳本編程入門系列一:認識shell腳本
    1、什麼是shell腳本將多個shell命令按語法組合在一起,並保存在文本文件中即得到我們所說的shell腳本(shell script)。shell腳本可以方便地與系統交互,完成系統管理以及批處理任務。shell處於作業系統與應用之間,起到橋梁的作用。
  • shell腳本速成
    什麼是shell腳本shell腳本就是包含一組可運行的特定shell命令(在本文中是bash shell)的文本文件,命令的執行順序與其出現在腳本中的順序一致。shell以命令行的形式提供了可用的作業系統命令庫的接口。
  • shell腳本極簡教程
    使用腳本程式語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象;缺點是它們的效率通常不如編譯型語言。不過權衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現,可能需要兩天,而且一般來說,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。
  • SHELL腳本必知必會
    函數返回值在使用函數的時候一定要注意,shell中函數的返回值只能是整數,估計是因為一般情況下一個函數的返回值通常表示這個函數的運行狀態,所以一般都是0或者是1就夠了,因此就設計成了這樣。不過需要注意的是,用上面的方法,我們只能夠做到取值,而不能做到賦值。
  • 編寫Linux Shell腳本的最佳實踐
    前言 由於工作需要,最近重新開始拾掇shell腳本。雖然絕大部分命令自己平時也經常使用,但是在寫成腳本的時候總覺得寫的很難看。而且當我在看其他人寫的腳本的時候,總覺得難以閱讀。
  • 【shell】shell 腳本編程基礎
    初識1.1 第一個 shell 腳本1.2 運行 shell 腳本的兩種方法2. 變量2.1 變量2.2 字符串2.3 數組2.4 注釋3. 傳遞參數4.初識1.1 第一個 shell 腳本test.sh :#!/bin/bashecho "Hello,World"#! 告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序。
  • linux shell 腳本入門
    Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
  • Linux——Shell腳本的應用1(基礎)
    一、shell腳本基礎1.編寫第一個shell腳本Linux系統中的shell腳本是一個特殊的應用程式,它介於作業系統內核與用戶之間,充當了一個命令解釋器的角色,負責接收用戶輸入的操作指令並進行解釋,將需要執行的操作傳遞給內核執行,並輸出執行結果。編寫一個好的shell腳本程序,可以批量處理、自動化地完成一系列的維護任務,大大減輕管理員的負擔。
  • Linux中Shell腳本基礎筆記
    shell腳本都是以"#!"作為開頭。這是腳本開始的標記,它是告訴linux系統執行該腳本文件需要使用相應的解釋器,緊挨著的/bin/bash指定了解釋器的具體路徑。shell主要用#作為注釋標記。後面可以加腳本的注釋,建議寫shell腳本要根據情況多寫注釋,便於以後腳本的維護。shell腳本的運行方式:1、可以在shell腳本第一行加上"#!/bin/bash"的話。可以按照以下方式執行:bash test.sh #要保證目錄中存在該腳本文件。2、給腳本加上可執行的權限,然後使用".
  • Linux中編寫Shell腳本
    Shell 腳本的類型Shell腳本語言是弱類型語言(無須定義變量的類型即可使用),在Unix/Linux中主要有兩大類shell: 一類是 Bourne shell ,另一類是 C shellBourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三種類型。
  • 《Linux shell腳本攻略》限免
    任何初學者都可以在網上輕鬆獲取Linux、Linux shel相關的基礎教程,而就如何運用shell來解決現實世界中的問題,相關的知識和技巧大多都散落在論壇或博客中,要麼不夠全面系統,要麼不易查找。如果你也有此煩惱,不如看看《Linux shell腳本攻略》這本書。
  • Shell 腳本面試問題大全
    /bin/bashCOUNTER=20until [ $COUNTER -lt 10 ]; doecho COUNTER $COUNTERlet COUNTER-=1done16) 每個腳本開始的 #!/bin/sh 或 #!/bin/bash 表示什麼意思 ?這一行說明要使用的 shell。#!
  • 什麼是Shell腳本?為什麼要學習Shell?
    Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具, Linux/UNIX系統的底層及基礎應用軟體的核心大都涉及Shell腳本的內容。每一個合格 的Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠閱 讀系統及各類軟體附帶的Shell腳本內容。
  • 如何在shell腳本中使用加密密碼
    我們用到的腳本或多或少會在裡面用到密碼,但將密碼放在shell腳本中並不是個好主意,如果腳本幾經周折落入到壞人之手,每個閱讀的人都可以看到密碼,
  • 精心匯總的 24 道 shell 腳本面試題
    如下是一些面試過程中,經常會遇到的 shell 腳本面試問題及解答:Q:1 Shell腳本是什麼、它是必需的嗎?答:一個Shell腳本是一個文本文件,包含一個或多個命令。作為系統管理員,我們經常需要使用多個命令來完成一項任務,我們可以添加這些所有命令在一個文本文件(Shell腳本)來完成這些日常工作任務。
  • linux系統shell腳本基本及變量
    shell是啥1、腳本語言,可以用來編寫腳本。shell script shell腳本(劇本),面向過程的語言。腳本-->一條條命令的羅列。查看變量本地變量:只能在當前shell中調用的變量環境變量:不僅能在當前shell中使用,而且還可以在子shell中使用的變量
  • 平常寫shell腳本遇到的問題匯總
    最近也是在linux下寫了很多的shell腳本,之前也自己總結過遇到的一些問題及解決方法,最近又遇到並且整理了一下,下面簡單說下最近遇到的問題以及解決方法。."[: too many arguments"錯誤問題:最近在寫 shell腳本的時候發現了這樣一個問題:PID=`cat ****`while [ !
  • 編寫可靠Linux shell腳本的八個建議
    這次,我就介紹一個 shell 腳本編寫神器:shellcheck說來慚愧,雖然寫了幾年 shell 腳本,有些語法我還是記不清楚。這時候就要依仗 shellcheck 指點一下了。shellcheck 除了可以提醒語法問題以外,還能檢查出 shell 腳本編寫常見的 bad code。
  • 為什麼Shell腳本執行不成功?原來是這樣
    其實,Shell腳本的書寫和執行都有很多注意事項的,因為我們平時使用的少,所以沒有注意到,今天小編就帶大家來一一熟悉下吧!1、「#!」使用有講究#!這一組符號如果出現在腳本的第一行,代表的是指定該shell腳本用哪種類型的shell來解釋和執行,即指定解釋器。如果#!這個符號出現的位置不是第一行,那麼代表這一行是注釋行,腳本不執行。如下圖所示,#!
  • 學習 Shell 腳本編程的免費資源 | Linux 中國
    雖然有不同類型的 shell,但是 bash(GNU Bourne-Again Shell)是在各 Linux 發行版中最流行的。當談到 shell 腳本編程的時候,也就意味著 —— 用戶希望使用腳本來執行多條命令來獲得一個輸出。也許你需要學習 shell 腳本編程作為你的課程或者工作的一部分。