shell數組等基本用法


 

  • "shell"既是一種解釋型編程語言,也是一個這種編程語言的解釋器的名字
  • shell是解釋型語言,就是解釋器會一條一條的翻譯每一條語句並執行,對比之下,C語言是編譯型語言,編譯器把整個工程編譯成可執行文件才能執行
  • 在沒有續行符(\回車)的情況下,shell腳本的一條語句以"回車"為結束
  • 任何一個shell腳本程序都必須在開頭用#!標識使用的shell程序,如果用的是bash,那就是#!/bin/sh
  • shell腳本一行中的#之后的部分為注釋
  • 剛剛寫完的一個shell script程序通常是沒有執行權限的,需要手動$chmod +x filename.sh來添加可執行權限
  • shell語言本身並不包含linux內置的命令,那些命令本質上都是一個可以在shell環境中執行的程序,只是在shell環境中執行shell腳本可以調用這些程序而已。

特殊符號

$

表示取結果。和變量名一起使用表示取變量的值,和()一起使用表示取命令群組的執行結果

$tunset=123 $echo "$tunset" 123
$echo $(ls Downloads) lukas-h.github.io-theme.zip youdao-dict_1.1.0-0-deepin_amd64.deb

( )

  • 表示在"nested sub-shell"中划分一個命令群組(command group),如果我們希望里面的命令對之前和之后的設定不影響的話,就要用(),反之,如果需要在當前shell(non-named command group)中執行相關命令,就要用{}表示命令群組。
  • 在數學計算中就是數學中的()
  • 定義數組
$cat shell.sh;./shell.sh #!/bin/bash line="123 25 36532 454" ( line="wwww" echo "$line" ) echo "$line" wwww 123 25 36532 454
$arr=(0 1 2 var) #定義一個數組 $echo "${arr[0]}" #顯示數組下標為0的元素 0

{ }

  • 用作范圍限定
  • 標明在"non-named command shell"中執行的命令群組。shell函數就是使用{}的特性來定義的
  • 配合-+=#/%對變量進行操作
$echo $var 123 $echo $variable  $echo ${var}iable 123iable
$cat shell.sh;./shell.sh #!/bin/bash line="123 25 36532 454" { line="wwww" echo "$line" } echo "$line" wwww wwww
$file=/opt/ros/jade/include/image_view/ImageViewConfig.h #匹配+刪除 $echo ${file#*/} #從左側開始匹配符合模式最短部分,將其剔除,返回剩下的 opt/ros/jade/include/image_view/ImageViewConfig.h $echo ${file#*/*/} ros/jade/include/image_view/ImageViewConfig.h $echo ${file##*/} #從左側開始匹配符合模式的最長部分,將其剔除,返回剩下的 ImageViewConfig.h $echo ${file%/*} #從右側開始匹配符合模式的最短部分,將其剔除,返回剩下的 /opt/ros/jade/include/image_view $echo ${file%%/i*} #從右側開始匹配符合模式的最長部分,將其剔除,返回剩下的 /opt/ros/jade
#按個數返回 $echo ${file:0:4} /opt $echo ${file:4:9} #將第4個字符當作第1個,計數9個, 返回 /ros/jade
#匹配+替換 $echo ${file/opt/root} #將file中的第一個opt替換為root /root/ros/jade/include/image_view/ImageViewConfig.h $echo ${file//i/++} #將file中的所有i都替換為++ /opt/ros/jade/++nclude/++mage_v++ew/ImageV++ewConf++g.h
#根據變量狀態操作, $echo ${file-fault} #只要設定了,就返回file,否則返回fault /opt/ros/jade/include/image_view/ImageViewConfig.h $echo ${file1-fault} fault $echo ${file:-fault} #只要設定了且非空,就返回file,否則返回fault /opt/ros/jade/include/image_view/ImageViewConfig.h  $echo ${file+fault} #只要設定了,就返回fault fault $echo ${file:+fault} #只要設定了且非空,就返回fault fault  $echo ${file=fault} #只要file沒設定,就將fault賦值給file並返回 /opt/ros/jade/include/image_view/ImageViewConfig.h $echo ${file1}  $echo ${file1=fault} fault $echo ${file1} fault  $echo ${file:=fault} #只要file沒設定或非空,就將fault賦值給file並返回 /opt/ros/jade/include/image_view/ImageViewConfig.h  $echo ${file?fault} #只要file沒設定,就將fault輸出至STDERR /opt/ros/jade/include/image_view/ImageViewConfig.h $echo ${file:?fault} #只要file沒設定或為空,就將fault輸出至STDERR
#統計字符數  $echo ${file} /opt/ros/jade/include/image_view/ImageViewConfig.h $echo ${#file} 50

(( ))

用作計算,shell支持十進制/十六進制/二進制的+ - * / % & += -= *= /= %= ++ -- 等算術運算,以及| ^ ! > >= < <= !=等邏輯運算。同樣的效果也可以使用expr ...來實現,但是expr是Linux的內置軟件,並不是shell語言的關鍵字

$echo $((1 + 2)) 3 $echo $((0xf + 1)) 16 $cal=132 $echo $(($cal+1)) 133 

[ ]

  • 用作取數組元素,使用${arr[n]}訪問數組編號為n的元素
$arr=(0 1 2 var) $echo "${arr[0]}" 0 $echo "${arr[3]}" var

` `

兩個反單引號表示命令替換,和$()是等價的。個人覺得看着比$()清晰,但是如果多層嵌套的話可能需要轉義,此時就沒有$()看着易懂。在下面的嵌套結構中,我們本意是先執行cmd3,將執行結果傳給cmd2,再將結果傳給cmd1

cmd1 `cmd2 `cmd3``

但是其實被解析成了下面這個

cmd1 `cmd2`cmd3 ``

為了解決這個問題,我們需要使用轉義字符,寫成下面這個樣子才能正確的傳達我們的意思

cmd `cmd2 \`cmd3\``

但如果我們使用$(),就可以讓代碼更清晰

$echo `echo`echo 12`` #被分解成了 echo `echo` echo 12`` echo 12
$echo `echo \`echo 12\`` #這個才對 12
$echo $(echo $(echo 12)) #這個才對 12

|

管道表示將前一個命令的返回結果用作后一個命令的參數,管道的前后必須都是命令,管道是管理Linux十分有用的工具
$grep "test" file1.txt | wc -l

> >>

> 以新建的方式重定向,如果文件不存在就創建文件並將內容寫入,如果文件存在就把文件清空再寫入內容
>>以追加的方式重定向,如果文件不存在就創建文件並將內容寫入,如果文件存在就在原文件后面寫入內容

<

我們通常的操作就是文件,其實已經使用的輸入重定向

2>

  • 標准輸入,標准輸出,標准錯誤其實是三個完全不同的文件,雖然我們看起來標准輸出和標准錯誤都輸入到顯示屏中顯示,但是不能用輸出重定向將錯誤重定向到其他文件
  • 標准輸入,標准輸出,標准錯誤的文件描述符分別是0,1,2,這也是錯誤重定向2>的由來

&&

&&前的命令執行成功了就繼續執行后面的命令

||

||前的命令執行失敗了就去執行后面的命令

;

不論;前的命令執行成功與否都去執行后面的命令

關鍵字

readonly

相當於C中的const,readonly將變量設為只讀模式,任何針對他們的賦值都是錯誤的

$readonly var=123 $var=345 bash: var: readonly variable

unset

刪除變量

unset var_name 刪除變量var_name unset -v first middle last 刪除其他變量 unset -f fcn 刪除函數
$tunset=123 $echo $tunset 123 $unset tunset $echo $tunset  $

shift

用來截去來自列表的位置參數,從左側開始,一旦執行shift,$1的初始值就會永遠消失,取而代之的是$2的舊值,依次類推,$#的值也會依次減1
shift也可以帶一個參數,表示一次截取的個數

$cat shell.sh #!/bin/bash echo "${1}" shift echo "${1}" $./*.sh 123 456 123 456

set

設置新的位置參數

$set qq ww ee $echo "${1}" qq $echo "${0}" bash $echo "${2}" ww $echo "$#" 3

export

添加變量到變量導出列表,即如果在shell中執行子shell,該變量將作為環境變量從而在子shell中變得可以使用。

$cat shell.sh #!/bin/bash echo "$NEWENV" $NEWENV=123 $./shell.sh $export NEWENV $./shell.sh 123

exit

提前結束標本

 

1、使用&符號在后台執行命令(用戶退出則命令終止)

./XX.sh &

2、使用nohup在后台執行命令(用戶退出命令不終止)

nohup ./XX.sh &

 

 

 

3、使用screen重新連接會話

 

4使用watch連續地執行一個命令(類似js中的定時器)

 

watch df -h

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM