shell程式設計小點筆記

2021-08-26 04:08:46 字數 3850 閱讀 1064

linux shell指令碼的一些基礎點

1.標準輸入和輸出 0 1 2

0>;表示stdin標準輸入

1>:表示stdout標準輸出

2>:表示stderr錯誤輸出

看個例子:

./start.sh >/dev/null 2>&1

1: start.sh 命令指令碼

2:/dev/null 代表空裝置檔案

3:2> 表示stderr標準錯誤

4:& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1

5:1 表示stdout標準輸出,系統預設值是1,所以">/dev/null"等同於 "1>/dev/null"

因此,>/dev/null 2>&1也可以寫成「1> /dev/null 2> &1」

那麼本文標題的語句執行過程為:

1>/dev/null :首先表示標準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端,說白了就是不顯示任何資訊。

2>&1 :接著,標準錯誤輸出重定向 到 標準輸出,因為之前標準輸出已經重定向到了空裝置檔案,所以標準錯誤輸出也重定向到空裝置檔案。

乙個相對完整的啟動方式是

./command.sh >/dev/null 2>1& &(後台程序啟動)

2.變數賦值建議不使用空格,因為會被當做命令來處理

3.(())和 $(())之間區別

(()):會將括號內的表示式做運算處理

$(()):當做運算處理,並將結果返回

看個例子;

var1=1;

var2=2;

var3=$((var1 < var2))

var4=$((var1 > var2))

echo 'var3:' $var3

echo 'var4:' $var4

var5=((var1 < var2)) //這句會報錯,因為沒有返回值,不能對var5進行賦值

echo $var5

---------結果------------

var3:1 // 若是未true 則返回1 。flase 返回0

var4:0

4. &&和||

aa && bb  ==== >  if [ a ];then bb ;fi    如果aa成立 才執行bb

常用做法: cd /home/tmp &&rm -rf *

aa || bb  ==== >  if [ a ];then ;else bb ;fi 如果aa 成立的話,那麼去執行 bb

常用的做法是 cd /home/tmp || exit 1

5.if 後面跟的是乙個條件表示式

語法:if [ condition ];then do something ; fi

condition 中條件大於 1 即可

if [ -z "$1" ];then echo 'the file is existed' ; fi

if [ grep -p 'bin' fielname|wc -l ]; then do something ; fi

6.touch && echo && {}

touch aa 快速建立乙個a檔案

touch   快速建立檔名從1到10的檔案

touch [1..10]  不會建立任何的檔案

echo * 

1.若是資料夾有檔案或目錄,會輸出所有的檔案或目錄

2.若是資料夾為空的話,會輸出 *

echo ? //匹配單個字元的檔案或是目錄並輸出

echo 輸出1-10的數字

通過以上的例子可以看出 {}會是做迴圈遍歷,再看個。

for i in  ; do echo $i ; done

---------結果如下所示:---------12

345

7.幾個特殊符號

1.`` 執行符號中的指令碼並發揮結果

2.~  指定到 /home/loginid

3.基本的shell命令都是以 空格作為分隔符 例如 awk 等

4."" , '' 輸出字串

aa=1

echo "$aa" // 1

echo "\$aa" // $aa

echo '$aa' // $aa

若是中間包含 $aa 則解析該變數,得到1 ,若是不想解析 \$aa 這樣輸出的就是 $aa

8.引數變數

$#: 獲取引數個數

$?: 上乙個命令結果 成功是 0 失敗為1

$@: 輸出引數

$*: 輸出引數

"$@" 返回乙個陣列

# !/bin/bash

for i in "$@"

do echo $i

done

------------

./para.sh 11 ee ff

11ee

ff

"$*" 返回乙個字串

for i in "$*"

do echo $i

done

-------------

./para.sh 11 22

11 22

不加雙引號的 $@和$*基本沒什麼區別

$#的幾個特殊用處

var=1abcdefg

echo $ --- 8

echo $ --- 1abcd

echo $ --- 5678

$$: 當前的程序號 沒什麼用處

設定區域性變數 local  沒什麼特別的 ,變數不加 local ,那麼就是全域性的

9。命令執行的順序

1.alias 定義的命令

2.function定義命令

3.內部命令 系統自身帶的命令  一般也是預設$path

4.外部命令  $path中另外加的

10.命令列中幾個快捷鍵

ctrl + w  :刪除最後乙個輸入 以空格為分隔符

ctrl + v  :刪除一行命令列

ctrl + y  :撤銷上乙個命令

ctrl + a  :移動到命令列首

ctrl + e  :移動到命令行尾

11.nuhup 就是以後台程式啟動程式 ,也可以說是精靈程序

nohup command &

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 檔案中。如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $home/nohup.out 檔案中。如果沒有檔案能建立或開啟以用於追加,那麼 command 引數指定的命令不可呼叫。如果標準錯誤是乙個終端,那麼把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的檔案描述符。

更傾向於直接使用 & 來簡單

12. grep 的幾個使用小技巧

grep -v  "hah" filename : 查詢非hah的資料

grep -o  使用正規表示式

grep -p  使用perl的正規表示式

grep "line 5" filename -a1 :匹配到資料後再將下一行的資料顯示出來

grep "line 5" filename -b1 :匹配到資料後再將上一行的資料顯示出來

grep -n :匹配到資料後,除了顯示匹配的內容外,另外顯示行號

13. sed 和 awk 較為複雜,另作筆記吧

程式設計細節小點

1.碰到字串中比較排序的時候,對數值進行比較的時候,不一定用正規表示式進行匹配是否是數值,然後再比較大小,可以直接用ascii碼進行比較大小。if c 0 c 9 2.將ip掩碼轉換成 long型 格式 string split 255.255.255.0 split listipnums new ...

shell程式設計筆記

第一天學習shell程式設計,自己做的筆記 test1 bin sh judge dir exist if d data 20140515 then mkdir p data 20140515 else echo this dir is exist,please exit fi bin sh sco...

shell程式設計筆記

if 1 eq 1 a 2 2 then echo true elif 1 lt 2 o 3 gt 4 then echo else echo false fi gt lt ge le eq ne a o if f 1.sh echo 1.sh exists if e 1.sh then echo ...