shell指令碼基礎知識

2022-06-11 15:00:11 字數 3375 閱讀 4619

雖然現在能在linux系統下生存,但是自覺效率太低,和高手有很大的差距。

這就是關於linux的知識太過匱乏,有很多事情知道該怎麼做,但是就是沒法在linux下實現,為了提公升工作效率,必須要接觸linux高階技巧

linux的東西比較深,沒法一下學完,所以只要能掌握生信必備的基礎就好了。

一些主要的流程都是用perl或python生成shell指令碼來執行的,所以直接看別人生成的shell指令碼,能看懂裡面每一行語句就好。

echo **********start at : `date` **********

所有unix命令,要取結果或輸出,都要用$( )或反引號` `。參見:shell裡的` ` $( ) $ expr $(( ))

所以反引號`命令`就等價於命令輸出的字串

echo **********end at : `date` ********** && \

&& 只有前面的每一條命令都順利執行完(沒有報錯),才可以執行後面一句。如果沒有&&,那每一條命令都是獨立的,都會執行完。

同理||,只有在左邊的命令返回假,右邊的命令才會執行,如果左邊的順利執行,則右邊的不執行

參見:shell 中 &&和||的方法

lizhixin@login-25-3[22:47:39

]:shizhuoxing$ l

-bash: l: command not found

lizhixin@login-25-3[23:01:38]:shizhuoxing$ l || echo

"hello

"-bash: l: command not found

hello

lizhixin@login-25-3[23:02:08]:shizhuoxing$ ls || echo

"hello

"arrow.

sh bin figure idrm lottery nifty_svm pacbio prosplign sparc.sh

lizhixin@login-25-3[23:02:21]:shizhuoxing$ l && echo

"hello

"-bash: l: command not found

lizhixin@login-25-3[23:02:38]:shizhuoxing$ ls && echo

"hello

"arrow.

sh bin figure idrm lottery nifty_svm pacbio prosplign sparc.sh

hello

lizhixin@login-25-3[23:02:45]:shizhuoxing$

echo still_waters_run_deep 1>&2 && \

參見:shell 1>&2 2>&1 &>filename重定向的含義和區別

0是標準輸入,1是標準輸出,2是標準錯誤

[root@redhat box]# ls a.txt b.txt 1>file.out 2>file.err

執行後,沒有任何返回值. 原因是, 返回值都重定向到相應的檔案中了,而不再前端顯示

[root@redhat box]# ls a.txt b.txt 1>file.out 2>&1

1>&2 正確返回值傳遞給2輸出通道 &2表示2輸出通道,如果此處錯寫成 1>2, 就表示把1輸出重定向到檔案2中.

& 是乙個描述符,如果1或2前不加&,會被當成乙個普通檔案。

看見很多指令碼的第一行都是source setup.sh,這是什麼意思呢?

參見:linux中source命令的用法

source命令也稱為「點命令」,也就是乙個點符號(.)。source命令通常用於重新執行剛修改的初始化檔案,使之立即生效,而不必登出並重新登入。

還有乙個另外乙個用途,在對編譯系統核心時常常需要輸入一長串的命令,可以用source簡化。

所以,source setup.sh就是自動的部署了程式執行所需的環境

sh指令碼可以加密成sh.x,參見:shell指令碼加密

它的作用是把shell指令碼轉換為乙個可執行的二進位制檔案,從而達到加密的效果

參見:shell指令碼中一些特殊符號

檔案比較運算子

-e filename 如果 filename存在,則為真 [ -e /var/log/syslog ]

-d filename 如果 filename為目錄,則為真 [ -d /tmp/mydir ]

-f filename 如果 filename為常規檔案,則為真 [ -f /usr/bin/grep ]

-l filename 如果 filename為符號鏈結,則為真 [ -l /usr/bin/grep ]

-r filename 如果 filename可讀,則為真 [ -r /var/log/syslog ]

-w filename 如果 filename可寫,則為真 [ -w /var/mytmp.txt ]

-x filename 如果 filename可執行,則為真 [ -l /usr/bin/grep ]

filename1-nt filename2 如果 filename1比 filename2新,則為真 [ /tmp/install/etc/services -nt /etc/services ]

filename1-ot filename2 如果 filename1比 filename2舊,則為真 [ /boot/bzimage -ot arch/i386/boot/bzimage ]

字串比較運算子 (請注意引號的使用,這是防止空格擾亂**的好方法)

-z string 如果 string長度為零,則為真 [ -z "$myvar" ]

-n string 如果 string長度非零,則為真 [ -n "$myvar" ]

string1= string2 如果 string1與 string2相同,則為真 [ "$myvar" = "one two three" ]

string1!= string2 如果 string1與 string2不同,則為真 [ "$myvar" != "one two three" ]

算術比較運算子

num1-eq num2 等於	[ 3 -eq $mynum ]

num1-ne num2 不等於 [ 3 -ne $mynum ]

num1-lt num2 小於 [ 3 -lt $mynum ]

num1-le num2 小於或等於 [ 3 -le $mynum ]

num1-gt num2 大於 [ 3 -gt $mynum ]

num1-ge num2 大於或等於 [ 3 -ge $mynum ]

Shell指令碼基礎知識

shell 變數 命名規則 首字元為字母 中間不能有空格,可用下劃線 不能使用標點和bash的關鍵字 賦值 顯示命名 不能加 語句賦值 唯讀變數 readonly variable name 刪除變數 unset varible name 不能刪除唯讀變數 shell字串 字串可以用單引號 雙引號 ...

shell指令碼基礎知識

自定義shell變數時,變數有什麼規格?可以使用字母,數字,下劃線,不能以數字開頭 變數名區分大小寫 賦值時等號兩邊不要有空格 不要使用關鍵字或特殊字元,給同乙個變數多次賦值時,最後一次生效。簡述預定義變數 0 的作用?儲存當前執行的程式pid號 上乙個執行命令的返回狀態 0 當前執行的指令碼名 位...

shell指令碼的基礎知識

shell 是指一種應用程式,這個應用程式提供了乙個介面,使用者通過這個介面訪問作業系統核心的服務,是指令碼中命令的直譯器。1.記錄命令執行的過程和執行邏輯,以便以後重複執行 2.指令碼可以批量處理主機 3.指令碼可以定時處理主機 bin bash 幻數 vim自動新增指令碼首部 1 手動在環境中開...