Shell命令-基礎
Shell命令
1 變量
定義變量時,變量名不加美元符號$,注意,變量名和等號之間不能有空格
a="myname"
用語句給變量賦值時,
for file in `ls /etc` # 執行這個命令,使用的不是單引號,而是反單引號`,存到臨時變量中
或
for file in $(ls /etc) # 將這個命令的執行結果,作為臨時變量,用$引用
使用變量
your_name="qinjx"
echo $your_name
echo ${your_name}
變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界.
在變量和字符緊挨在一起時,必須使用{},才能使解釋器區分出來。
推薦給所有變量加上花括號,這是個好的編程習慣。
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
已定義的變量,可以被重新定義.
2 Shell 字符串
字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。
單引號字符串的限制:
- 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符后也不行),但可成對出現,作為字符串拼接使用。
雙引號:
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
雙引號的優點:
- 雙引號里可以有變量
- 雙引號里可以出現轉義字符
字符串的多種應用
-
獲取字符串的長度
string="abcd" echo ${#string} # 輸出 4 -
提取子字符串,適合于已知子串的起始和終止索引時,以一種閉區間的形式都包含,索引從0開始計數。
string="runoob is a great site" echo ${string:1:4} # 輸出 unoo -
查找子字符串i或o的位置(哪個先出現就先計算哪個)
string="runoob is a great site" echo `expr index "$string" io` # 輸出 4, ``中是命令,返回結果,被echo到控制臺
3 數組
bash支持一維數組,不支持多維數組
-
定義數組
數組名=(值1 值2 ... 值n) a=("a" "b" "c") -
訪問數組,使用下標.使用 @ 符號可以獲取數組中的所有元素。數組的下標可以是不連續的整數或者字符串
${數組名[下標]} # 此時的{}是必須的 valuen=${array_name[n]} echo ${array_name[@]}#!/bin/bash a=("a" "b" "c") echo $a # a echo ${a} # a echo ${a[@]} # a b c echo ${#a} # 1 echo ${#a[@]} # 3 echo ${#a[*]} # 3 echo ${a[1]} # b -
獲取數組長度
echo ${#a[@]} # 輸出數組a的長度 echo ${#a[1]} # 輸出a[1]的長度 -
獲取數組的所有鍵. 通過鍵遍歷數組
#!/bin/bash a=("a" "b" "c") for i in ${!a[@]}; do # 通過加!的方式,獲取數組的所有鍵,循環遍歷 echo "${i} =》 ${a[i]}" done # 以下為輸出 0 =》 a 1 =》 b 2 =》 c
4 運算符
shell中運算符分為多種:
-
算術運算符
注意:
1、表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2
2、完整的表達式要被 `` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊
3、可以使用加減乘除、取余、賦值、相等、不等運算(共8種) 的運算
4、相等 和 不等運算,要在[]之中,并且不能與[] 相連,返回true or false,常用在if條件中
5、進行乘法運算時,必須使用 \* ,如果使用*,會報錯
6、在 MAC 中 shell 的 expr 語法是:$((表達式)),此處表達式中的 "*" 不需要轉義符號 "" 。
-
關系運算符
注意:
1、關系運算符只支持數字,不支持字符串,除非字符串的值是數字。
2、和相等、不等運算符一樣,這些關系運算符也是需要在[]中使用,并且不能和[] 相連。
3、不要使用 >,>=,之類的符號
-
布爾運算符(與或非)
注意:
1、和相等、不等運算符一樣,這些關系運算符也是需要在[]中使用,并且不能和[] 相連
2、適用于多個條件的組合的情況
3、可以用邏輯運算符代替
-
字符串運算符
1、=和==在判斷字符串是否相同上,是相同的
2、最好使用 [ $a ] 來判斷變量a是否為null或者空字符串(""),不要使用 -z ,可能不準確
-
文件測試運算符
用于檢測Unix文件的各種屬性,屬性檢測描述如下表
常用的有 :
- -d : 文件夾/目錄 dir
- -f : 普通文件 file(既不是文件夾/目錄,也不是設備文件)
- -r : read 檢測文件是否可讀,如果是,則返回 true
- -w : write 檢測文件是否可寫,如果是,則返回 true
- -x : 檢測文件是否可執行,如果是,則返回 true
- -s : 檢測文件是否為空(文件大小是否大于0),不為空返回 true
- -e : exist 檢測文件(包括目錄)是否存在,如果是,則返回 true
4.1 算術運算符
注意:原生的bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如awk和expr最常用。
expr 是一款表達式計算工具,使用它能完成表達式求值的操作
#!/bin/bash
# 算數運算符 即符號兩邊都為數字,或者可以解析為數字
echo `expr 2 + 2` # 4
# 變量代表的數字也可以
a=3
b=4
echo `expr $a + $b` # 7
# 也可以執行
c='4'
d=5
echo `expr $c + $d` # 9
c='55'
d="54"
echo `expr $c + $d` # 109
c='5a5'
d="54a"
echo `expr $c + $d` # 報錯 expr: non-integer argument
#!/bin/bash
# 算數運算符 即符號兩邊都為數字,或者可以解析為數字
# echo `expr 2 * 2` # expr: syntax error: unexpected argument ‘run’
echo `expr 2 \* 4`
| 運算符 | 說明 | 舉例 |
|---|---|---|
| + | 加法 | expr $a + $b 結果為 30。 |
| - | 減法 | expr $a - $b 結果為 -10。 |
| * | 乘法 | expr $a \* $b 結果為 200。 |
| / | 除法 | expr $b / $a 結果為 2。 |
| % | 取余 | expr $b % $a 結果為 0。 |
| = | 賦值 | a=$b 把變量 b 的值賦給 a。 |
| == | 相等。用于比較兩個數字,相同則返回 true。 | [ $a == $b ] 返回 false。 |
| != | 不相等。用于比較兩個數字,不相同則返回 true。 | [ \$a != \$b ] 返回 true。 |
4.2 關系運算符
| 運算符 | 說明 | 舉例 |
|---|---|---|
| -eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 檢測左邊的數是否大于右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
| -lt | 檢測左邊的數是否小于右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
| -ge | 檢測左邊的數是否大于等于右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
| -le | 檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 | [ $a -le $b ] 返回 true。 |
4.3 布爾運算符
| 運算符 | 說明 | 舉例 |
|---|---|---|
| ! | 非運算,表達式為 true 則返回 false,否則返回 true。 | [ ! false ] 返回 true。 |
| -o | 或運算,有一個表達式為 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
| -a | 與運算,兩個表達式都為 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
a是and的簡寫,o是or的簡寫,!是非
邏輯運算符
| 運算符 | 說明 | 舉例 |
|---|---|---|
| && | 邏輯的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
| || | 邏輯的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
4.4 字符串運算符
#!/bin/bash
a="aaa"
b="bbb"
if [ $a != $b ]
then
echo 1 # 輸出1 證明 != 可以用于判斷字符串是否相同的情況, == 同理
fi
下表列出了常用的字符串運算符,假定變量 a 為 "abc",變量 b 為 "efg":
| 運算符 | 說明 | 舉例 |
|---|---|---|
| = | 檢測兩個字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
| != | 檢測兩個字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
| -z | 檢測字符串長度是否為0,為0返回 true。 | [ -z $a ] 返回 false。 |
| -n | 檢測字符串長度是否不為 0,不為 0 返回 true。 | [ -n "$a" ] 返回 true。 |
$ |
檢測字符串是否不為空,不為空返回 true。 | [ $a ] 返回 true。 |
#!/bin/bash
# 關于 -z 的測試
# test1
a=""
b="sdf"
if [ -z $a ]
then
echo "a is zero" # 輸出這個,證明空字符串的長度為0
else
echo "a is not zero"
fi
if [ -z $b ]
then
echo "b is zero"
else
echo "b is not zero" # 輸出這個,證明b的長度不為0
fi
# test2
# a 未賦值的情況
#!/bin/bash
a=
b="sdf"
if [ -z $a ]
then
echo "a is zero" # 輸出這個
else
echo "a is not zero"
fi
if [ -n $a ]
then
echo "a is not zero" # 輸出這個
else
echo "a is zero"
fi
# 輸出 證明最好不要這樣做,會產生不可控的風險。
a is zero
a is not zero
#!/bin/bash
# 關于字符串判斷是否為null的問題
a="22"
b="sdf"
if [ $a ]
then
echo "a is not null" # 輸出這個
else
echo "a is null"
fi
# 分別用未賦值、""、"111"測試
# a is null
# a is null
# a is not null
# 所以最好使用 $a 來判斷字符串是否為空
4.5 文件測試運算符
| 操作符 | 說明 | 舉例 |
|---|---|---|
| -b file | 檢測文件是否是塊設備文件,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
| -c file | 檢測文件是否是字符設備文件,如果是,則返回 true。 | [ -c $file ] 返回 false。 |
| -d file | 檢測文件是否是目錄,如果是,則返回 true。 | [ -d $file ] 返回 false。 |
| -f file | 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 | [ -f $file ] 返回 true。 |
| -g file | 檢測文件是否設置了 SGID 位,如果是,則返回 true。 | [ -g $file ] 返回 false。 |
| -k file | 檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。 | [ -k $file ] 返回 false。 |
| -p file | 檢測文件是否是有名管道,如果是,則返回 true。 | [ -p $file ] 返回 false。 |
| -u file | 檢測文件是否設置了 SUID 位,如果是,則返回 true。 | [ -u $file ] 返回 false。 |
| -r file | 檢測文件是否可讀,如果是,則返回 true。 | [ -r $file ] 返回 true。 |
| -w file | 檢測文件是否可寫,如果是,則返回 true。 | [ -w $file ] 返回 true。 |
| -x file | 檢測文件是否可執行,如果是,則返回 true。 | [ -x $file ] 返回 true。 |
| -s file | 檢測文件是否為空(文件大小是否大于0),不為空返回 true。 | [ -s $file ] 返回 true。 |
| -e file | 檢測文件(包括目錄)是否存在,如果是,則返回 true。 | [ -e $file ] 返回 true。 |
5 echo
echo指令用于字符串的輸出
echo "string"
echo "1\n2" # 默認是不開啟轉義的
echo -e "1 \n 2" # 通過 -e 選項開啟轉義,即充當轉義字符反斜線的翻譯器。
echo -e "OK! \c" # -e 開啟轉義 \c 不換行
echo "It is a test" > myfile # 把結果重定向到文件中,以覆蓋寫的方式;>> 為追加寫的方式
echo '$name\"' # $name\" 單引號,里面的字符原樣輸出,不會進行取變量或者轉義操作(因為單引號的作用)。
echo `date` # Fri 17 Feb 2023 12:16:00 PM UTC 顯示命令的執行結果
6 printf
printf更適合需要格式化輸出的場景。echo會自動添加換行符,printf不會。
語法
printf format-string [arguments...]
參數說明:
- format-string: 為格式控制字符串
- arguments: 為參數列表。
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
# 輸出
姓名 性別 體重kg
郭靖 男 66.12
楊過 男 48.65
郭芙 女 47.99
說明:
%s %c %d %f 都是格式替代符,%s 輸出一個字符串,%d 整型輸出,%c 輸出一個字符,%f 輸出實數,以小數形式輸出。
%-10s 指一個寬度為 10 個字符(- 表示左對齊,沒有則表示右對齊),任何字符都會被顯示在 10 個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
%-4.2f 指格式化為小數,其中 .2 指保留2位小數
#!/bin/bash
# format-string為雙引號
printf "%d %s\n" 1 "abc"
# 單引號與雙引號效果一樣
printf '%d %s\n' 1 "abc"
# 沒有引號也可以輸出
printf %s abcdef
# 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j # 會自動補null。相當于沒有 arguments,那么 %s 用NULL代替
# 如果沒有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
# 輸出
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and 0
轉義字符
| 序列 | 說明 |
|---|---|
| \a | 警告字符,通常為ASCII的BEL字符 |
| \b | 后退 |
| \c | 抑制(不顯示)輸出結果中任何結尾的換行字符(只在%b格式指示符控制下的參數字符串中有效),而且,任何留在參數里的字符、任何接下來的參數以及任何留在格式字符串中的字符,都被忽略 |
| \f | 換頁(formfeed) |
| \n | 換行 |
| \r | 回車(Carriage return) |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \ | 一個字面上的反斜杠字符 |
| \ddd | 表示1到3位數八進制值的字符。僅在格式字符串中有效 |
| \0ddd | 表示1到3位的八進制值字符 |
7 流程控制
和 Java、PHP 等語言不一樣,shell 的流程控制不可為空
在 sh/bash 里,如果 else 分支沒有語句執行,就不要寫這個 else
7.1 if-else
有兩種寫法
# 1 寫成多行的形式
if condition
then
command
fi
# 2 寫在一行中 適用于終端命令提示符
if condition; then command; fi
# 1 if else 格式
if condition
then
command1
else
command2
fi
# 2 if else-if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
關于condition的格式
# 1 判斷條件使用 []時,大于小于使用 -gt -lt
#!/bin/bash
a=10
b=11
if [ $a -gt $b ]
then
echo dayu
else
echo xiaoyu
fi
# 2 如果使用((...))時,大于小于使用 > <
#!/bin/bash
a=10
b=11
if (($a>$b)) # 可以加$,也可以不加,為了統一標準,最好還是加上
then
echo dayu
else
echo xiaoyu
fi
7.2 for循環
一般是用于遍歷數組,有兩種寫法(需要根據場景不同,選擇合適的遍歷方式):
#!/bin/bash
a=("A" "b" "d") # 定義一個數組
# 1 使用鍵遍歷。輸出 鍵 和 對應的值
for i in ${!a[@]}; do
echo "$i -> ${a[i]}"
done
# 2 只輸出 值
for i in ${a[@]}; do
echo "$i"
done
注意:
這兩種方式很容易搞混,加 ! 的才是可以取到鍵的。
并且數組后一定要跟上[@],[@]表示取得所有元素。
7.3 while
while循環用于執行一系列的命令,也可用于從輸入文件中讀取數據。
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
例子中,使用了Bash let命令,它用于執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量
# 用于讀取文件
#!/bin/bash
while read line
do
echo "$line"
done << config.txt
# 無限循環
while true
do
command
done
# 或者
for (( ; ; ))
continue 和 break 的作用和大多數編程語言中含義相同,即 continue 跳過本次循環,break 跳出所有循環。
8函數
[ function ] funname [()]
{
action;
[return int;]
}
說明:
- 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
- 2、參數返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果,作為返回值。 return后跟數值n(0-255)
| 參數處理 | 說明 |
|---|---|
| $# | 傳遞到腳本或函數的參數個數 |
| $* | 以一個單字符串顯示所有向腳本傳遞的參數 |
| $$ | 腳本運行的當前進程ID號 |
| $! | 后臺運行的最后一個進程的ID號 |
| $@ | 與$*相同,但是使用時加引號,并在引號中返回每個參數。 |
| $- | 顯示Shell使用的當前選項,與set命令功能相同。 |
| $? | 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
注意:
1、所有函數在使用前必須定義。這意味著必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,才可以使用。調用函數僅使用其函數名即可。
2、$? 獲取函數的返回值,僅對上一條指令負責。如果中間插入了別的指令,則不能正確獲得函數返回值。
3、大于等于10個參數時,通過${10}獲取,不能$10
9 shell文件包含
和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個獨立的文件。
Shell 文件包含的語法格式如下:
兩種方式:
. filename # 注意點號(.)和文件名中間有一空格
或
source filename
#使用 . 號來引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代碼
# source ./test1.sh
echo 132
本文來自博客園,作者:永恒&,轉載請注明原文鏈接:http://www.rzrgm.cn/Sun-yuan/p/17128362.html

浙公網安備 33010602011771號