002-shell變量定義、使用、字符串替換,分隔,搜索、數組、注釋


一、變量定義

  定義變量時,變量名不加美元符號($)

name="lhx"

  注意,變量名和等號之間不能有空格。同時,變量名的命名須遵循如下規則:

    •   命名只能使用英文字母,數字和下划線,首個字符不能以數字開頭。
    •   不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。

  除了顯式地直接賦值,還可以用語句給變量賦值,如

for file in `ls /etc`
或
for file in $(ls /etc)

  以上語句將 /etc 下目錄的文件名循環出來。

二、使用變量

2.1、使用時加美元符號

使用一個定義過的變量,只要在變量名前面加美元符號即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

2.2、變量使用加上花括號

變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

解釋器就會把$skillScript當成一個變量(其值為空)

推薦給所有變量加上花括號。

2.3、已定義的變量,可以被重新定義,即重新賦值

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

這樣寫是合法的,但注意,第二次賦值的時候不能寫$your_name="alibaba",使用變量的時候才加美元符($)。

2.4、只讀變量

使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。

#!/bin/bash
myUrl="http://www.w3cschool.cc"
readonly myUrl

2.5、刪除變量

使用 unset 命令可以刪除變量。語法:

unset variable_name

變量被刪除后不能再次使用。unset 命令不能刪除只讀變量。

2.6、變量類型

運行shell時,會同時存在三種變量:

  • 1) 局部變量 局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量。
  • 2) 環境變量 所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。
  • 3) shell變量 shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行

三、Shell 字符串操作

字符串是shell編程中最常用最有用的數據類型(除了數字和字符串),字符串可以用單引號,也可以用雙引號,也可以不用引號。

3.1、單引號

str='this is a string'

單引號字符串的限制:

  • 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
  • 單引號字串中不能出現單引號(對單引號使用轉義符后也不行)。

3.2、雙引號

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

雙引號的優點:

  • 雙引號里可以有變量
  • 雙引號里可以出現轉義字符

3.2、拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

3.3、獲取字符串長度

string="abcd"
echo ${#string} #輸出 4

3.4、提取子字符串

以下實例從字符串第 2 個字符開始截取 4 個字符:

string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo

字符串切割的幾種方法

方法一: 利用shell 中 變量 的字符串替換   

方法二: 設置分隔符,通過 IFS 變量

方法三: 利用tr 指令實現字符替換  (!只能針對單個分隔符)

方法一說明

  ${parameter//pattern/string} :用string來替換parameter變量中所有匹配的pattern

string="hello,shell,split,test"  
array=(${string//,/ })  
 
for var in ${array[@]}
do
   echo $var
done

  當然也可以讀單個 ${array[0]}、 ${array[1]}、……

方法二說明

  自定義IFS變量, 改變分隔符, 對字符串進行切分

  Shell 腳本中有個變量叫 IFS(Internal Field Seprator) ,內部域分隔符。完整定義是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

     Shell 的環境變量分為 set, env 兩種,其中 set 變量可以通過 export 工具導入到 env 變量中。其中,set 是顯示設置shell變量,僅在本 shell 中有效;env 是顯示設置用戶環境變量 ,僅在當前會話中有效。換句話說,set 變量里包含了 env 變量,但 set 變量不一定都是 env 變量。這兩種變量不同之處在於變量的作用域不同。顯然,env 變量的作用域要大些,它可以在 subshell 中使用。

     而 IFS 是一種 set 變量,當 shell 處理"命令替換"和"參數替換"時,shell 根據 IFS 的值,默認是 space, tab, newline 來拆解讀入的變量,然后對特殊字符進行處理,最后重新組合賦值給該變量。

示例一、查看變量 IFS 的值。

$ echo $IFS

$ echo "$IFS" | od -b 
0000000   040 011 012 000 012                                            
0000005

  直接輸出IFS是看不到的,把它轉化為二進制就可以看到了,"040"是空格,"011"是Tab,"012"是換行符"\n" 。最后一個 012 是因為 echo 默認是會換行的。

string="hello,shell,split,test"  
 
#對IFS變量 進行替換處理
OLD_IFS="$IFS"
IFS=","
array=($string)
IFS="$OLD_IFS"
 
for var in ${array[@]}
do
   echo $var
done 

方法三說明

  由於只是對單個字符進行的替換,則可以用  echo args |   tr "oldSpilt" "newSpilt"  的方式實現。

  tr命令可以對來自標准輸入的字符進行替換、壓縮和刪除。它可以將一組字符變成另一組字符,經常用來編寫優美的單行命令,作用很強大。

  語法
    tr(選項)(參數)
  選項
    -c或——complerment:取代所有不屬於第一字符集的字符;
    -d或——delete:刪除所有屬於第一字符集的字符;
    -s或--squeeze-repeats:把連續重復的字符以單獨一個字符表示;
    -t或--truncate-set1:先刪除第一字符集較第二字符集多出的字符。
  參數
    字符集1:指定要轉換或刪除的原字符集。當執行轉換操作時,必須使用參數“字符集2”指定轉換的目標字符集。但執行刪除操作時,不需要參數“字符集2”;
    字符集2:指定要轉換成的目標字符集。

string="hello,shell,split,test"  
array=(`echo $string | tr ',' ' '` )  
 
for var in ${array[@]}
do
   echo $var
done

3.5、查找子字符串

查找字符 "i 或 s" 的位置:

string="runoob is a great company"
echo `expr index "$string" is`  # 輸出 8

注意: 以上腳本中 "`" 是反引號,而不是單引號 "'"

四、Shell 數組

bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。

類似與C語言,數組元素的下標由0開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大於或等於0。

4.1、定義數組

在Shell中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的一般形式為:

數組名=(值1 2 ... n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

還可以單獨定義數組的各個分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

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

4.2、讀取數組

讀取數組元素值的一般格式是:

${數組名[下標]}

例如:

valuen=${array_name[n]}

使用@或*符號可以獲取數組中的所有元素,例如:

echo ${array_name[@]}
echo ${array_name[*]}

4.3、獲取數組的長度

獲取數組長度的方法與獲取字符串長度的方法相同,例如:

# 取得數組元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}

4.4、遍歷

一共有兩種方式:

for i in ${variable[@]}; do
# do something....
done
# 或
for i in $(seq 0 ${#variable[@]}); do
e=${variable[$i]}
# do something....
done

以上兩種方法 把 @ 換成 * 也行。

4.5、合並數組

array1=(23 56)
array2=(99 "aaa")
array_new=(${array1[@]} ${array2[*]})
echo ${array_new[@]}  #也可以寫作 ${array_new[*]}

五、Shell 注釋

以"#"開頭的行就是注釋,會被解釋器忽略。

sh里沒有多行注釋,只能每一行加一個#號。只能像這樣:

#--------------------------------------------
##### 用戶配置區 開始 #####
#
#
# 這里可以添加腳本描述信息
# 
#
##### 用戶配置區 結束  #####

 


免責聲明!

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



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