shell學習筆記

2021-08-11 11:11:57 字數 3181 閱讀 6595

今天莫名的有一種失落感,很多事,自己都無能為力,任由這個世界將自己隨意擺布。隨便記錄一點linux的知識,今天就這樣吧

0、shell指令碼開頭的#!/bin/bash是告訴我們這個shell是在什麼環境下執行的,它不是注釋

在指令碼中沒有寫#!/bin/bash的情況下,shell仍然可以執行,這可能是系統的$shell環境變數指定了指令碼的執行環境

1、shell指令碼中的set -x是做什麼的:

set -x是shell指令碼中的跟蹤選項,對與除錯指令碼很有幫助,在指令碼中加入它之後,set命令之後執行的每一條命令以及載入在命令列

中的任何引數都會顯示出來,每一行都會加上加號(+),提示它是跟蹤輸出的標識,在子shell中執行的shell跟蹤命令會加2個加

號(++)

2、shell指令碼執行的方式

. test.sh      sh test.sh      bash test.sh       source test.sh

3、shell中的 .  suorce   export

當我們執行test.sh的時候,是當前終端所在的shell fork乙個子shell然後執行test.sh的,執行完了再返回終端所在的shell。

明白這點,就容易理解了,我們在test.sh設定了aa環境 變數,它只在fork出來的這個子shell中生效,子shell只能繼承父shell

的環境變數,而不能修改父shell的環境變數,所以test.sh結束後,父程序的環境就覆蓋回去。所以在test.sh之後完之後,

我們用set命令是看不了aa這個環境變數的值的。

那有什麼辦法可以讓指令碼的環境變數在指令碼執行之後仍然對當前終端存在呢?

用sorcue 或者.(dot) 。明確告訴shell不要fork執行指令碼,而是在當前的shell執行,這樣環境變數就可以儲存下來了。

4、shell指令碼中的字符集

export nls_lang=american_america.al32utf8

5、basename和dirname

basename string [ suffix ]  返回乙個字串引數的基本檔名稱

dirname  filename  從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分)

6、sqlplus向shell傳遞引數   

function logsn()

`echo $vf_log_sn

}(1)sqlplus中的set用法  \n表示換行

set echo off -- 是否顯示指令碼中正在執行的sql語句 on 顯示 off 不顯示

set head off -- 是否顯示列標題 on 顯示 off 不顯示

set pagesize 0;     //輸出每頁行數,預設為24,為了避免分頁,可設定為0。

set linesize 80;     //輸出一行字元個數,預設為80

set trimspool on -- 是否去除重定向(spool)輸出每行的拖尾空格,on 去除 off 不去除

set feedback off -- 是否顯示當前sql語句查詢或修改的行數 off 不顯示查詢或修改的行數 

set termout off;    //顯示指令碼中的命令的執行結果,預設為on

(2)echo中的-n  -e引數

-n不換行輸出   -e用來處理特殊字元比如\n,他會將\n看成換行符而不是簡單的字串"\n"

(3)sqlplus中的-s引數

sqlplus -s 表示設定無提示模式, 該模式隱藏命令的 sql*plus 標幟,提示和回顯的顯示。

7、shell中的if判斷語句  與if之間必須有空格,內條件與括號之間必須有空格,內條件中的判斷符號與條件之間必須有空格,否則不能正確判斷        

8、shell陣列

在shell中,用括號來表示陣列,陣列元素用「空格」符號分割開。定義陣列的一般形式為:

array_name=(value1 ... valuen)

例如:array_name=(value0 value1 value2 value3)

或者array_name=(

value0

value1

value2

value3

)還可以單獨定義陣列的各個分量:

array_name[0]=value0

array_name[1]=value1

array_name[2]=value2

可以不使用連續的下標,而且下標的範圍沒有限制。

讀取陣列

讀取陣列元素值的一般格式是:

$例如:valuen=$

舉個例子:

#!/bin/sh

name[0]="zara"

name[1]="qadir"

name[2]="mahnaz"

name[3]="ayan"

name[4]="daisy"

echo "first index: $"

echo "second index: $"

執行指令碼,輸出:

$./test.sh

first index: zara

second index: qadir

使用@ 或 * 可以獲取陣列中的所有元素,例如:$$

舉個例子:

#!/bin/sh

name[0]="zara"

name[1]="qadir"

name[2]="mahnaz"

name[3]="ayan"

name[4]="daisy"

echo "first method: $"

echo "second method: $"

執行指令碼,輸出:

$./test.sh

first method: zara qadir mahnaz ayan daisy

second method: zara qadir mahnaz ayan daisy

獲取陣列的長度

獲取陣列長度的方法與獲取字串長度的方法相同,例如:

純文字複製

# 取得陣列元素的個數

length=$

# 或者

length=$

# 取得陣列單個元素的長度

lengthn=$

9、 2>&1     把標準錯誤輸出重定向到標準輸出

&>file   把標準輸出和標準錯誤輸出重定向到檔案

shell 學習筆記

shell 是解釋型語言 移植性強課對應不同的直譯器 bin sh f 變數開頭以乙個字母或者下劃線,後接任意長度的字母 數字或者下劃線。命令 commod op 引數 輸入 輸出 重定向管道 echo printf 大口如小口出。特殊檔案 dev null bit bucket 刪除所有輸入的資料...

shell學習筆記

shell指令碼在linux下開發經常需要用到,shell的指令碼可以幫助使用者自動化地和作業系統進行互動,起到了提高效率的作用。學習一門語言,通常需要實戰演練編碼除錯,shell該如何除錯呢?使用bash x命令即可。vi demo.sh敲入 bin bash echo 1 echo date y...

shell學習筆記

1 shell檔案的第一行都必須是 bin sh 也可以有其他路徑,這裡我們只以這個為例 2 定義變數 a value 中間不能有空格 呼叫方法 echo a 3 shell常用的條件測試 備註 方括號兩側必須要有空格,f lt等兩側也必須要有空格 a f file 判斷 file是否是乙個檔案 b...