2021-05-12 14:32:11
Shell常用命令大全之入門篇
本文為shell的一個系列教學,分為入門篇、命令篇、實戰篇
教學裡盡量減少複雜的文字描述,不求全,但求精,以範例為主,目標是讓讀者快速上手shell。
以下為本教學的第一部分《入門篇》,歡迎讀者拍磚及找BUG,後續會根據反饋進行修改及補充。
CSDN的Markdown生成的目錄顯示符號有一點小問題,大家以詳細內容中的標題為準。
- 入門篇
- 第一招 HelloWorld
- 第一式echo
- 第二招 判斷
- 第一式if
- 判斷原理
- 第二式test 和
- 檔案測試
- 字串比較
- 整數比較
- 第三式
- 第一式if
- 第三招回圈
- 第一式for
- 第二式whileuntil
- 第四招變數
- 第一式整數
- 整數的運算
- 第二式字串
- 替換
- 擷取子串
- 通配刪除
- 第三式陣列
- 普通陣列
- 關聯陣列
- 第四式將命令執行結果存入變數
- 與
- 換行符處理
- 第一式整數
- 第五招重定向
- 標準輸入流標準輸出流標準錯誤流
- 重定向方式一覽表
- 第一式重定向標準輸出流stdout
- 第二式重定向標準錯誤流stderr
- 第三式重定向標準輸入流stdin
- 第六招管道
- 第一式管道的基本功能
- 第二式管道與whileread組合
- 第三式管道與xargs組合
- 第七招通配
- shell通配的原理
- 萬用字元一覽表
- 第一式
- 第二式
- 第三式
- 第四式
- 第一招 HelloWorld
Shell程式設計淺析 http://www.linuxidc.com/Linux/2014-08/105379.htm
Linux Shell引數替換 http://www.linuxidc.com/Linux/2013-06/85356.htm
Shell for引數 http://www.linuxidc.com/Linux/2013-07/87335.htm
Linux/Unix Shell 引數傳遞到SQL指令碼 http://www.linuxidc.com/Linux/2013-03/80568.htm
Shell指令碼中引數傳遞方法介紹 http://www.linuxidc.com/Linux/2012-08/69155.htm
Shell指令碼傳遞命令列引數 http://www.linuxidc.com/Linux/2012-01/52192.htm
Linux Shell 萬用字元、跳脫字元、元字元、特殊字元 http://www.linuxidc.com/Linux/2014-10/108111.htm
入門篇
第一招 HelloWorld
第一式:echo
echo "Hello World"
echo -n "Hello World" # 不帶換行
echo -e 'e[0;33;1mHelloe[0m World' # 帶顏色的玩法
echo -e 'e[0;33;4mHelloe[0m World' # 帶顏色+下劃線
echo -e 'e[0;33;5mHelloe[0m World' # 帶顏色+閃爍
格式為 e[背景色;前景色;高亮格式m
,請閱讀詳細文件後使用正確的姿勢進行裝逼。
第二招 判斷
第一式:if
if true
then
echo "Hello World"
else
echo "Bug"
fi
if false
then
echo "Hello World"
elif true
then
echo "Bug"
else
echo "Bee"
fi
判斷原理
if
、elif
會執行它後面跟著的命令,然後看返回值是否為0
,如果為0
則執行then
下面的語句塊,否則執行else
下面的語句塊。
[linuxidc@Ubuntu:~]$ true
[linuxidc@ubuntu:~]$ echo $?
0
[linuxidc@ubuntu:~]$ false
[linuxidc@ubuntu:~]$ echo $?
1
註:
true
、false
事實上也為一個命令,true
的返回碼必為0
,false
的返回碼必為1
$?
為shell
內建變數,用於存放上一個命令的返回碼
第二式:test、[ ] 和 [[ ]]
test
、[ ]
、[[ ]]
實際上都是shell
中的命令,執行之後會返回1
或0
,而這幾個命令與if
相結合可以達到我們所需要的許多判斷功能,例如測試字串是否為空的三種寫法:
s=""
if [ -z ${s} ]
then
echo "empty"
fi
if [[ -z ${s} ]]
then
echo "empty"
fi
if test -z ${s}
then
echo "empty"
fi
事實上,if
後的[ ]
、[[ ]]
、test
命令都是可以單獨執行的,而根據if
的判斷原理,後續執行哪個分支也是由[ ]
、[[ ]]
、test
的返回值來決定的,以下是單獨執行它們的效果:
[linuxidc@ubuntu:~]$ s=""
[linuxidc@ubuntu:~]$ [ -z "${s}" ]
[linuxidc@ubuntu:~]$ echo $?
0
[linuxidc@ubuntu:~]$ s="abc"
[linuxidc@ubuntu:~]$ test -z "${s}"
[linuxidc@ubuntu:~]$ echo $?
1
[linuxidc@ubuntu:~]$ s="123"
[linuxidc@ubuntu:~]$ [[ 100 -lt ${s} ]]
[linuxidc@ubuntu:~]$ echo $?
0
在效能方面[ ]
和test
效能基本相同,[[ ]]
效能是最高的,為前兩者的5
倍左右(以-d
運算子測試),所以建議盡量使用[[ ]]
提高指令碼效能。
檔案測試
運算子 | 描述 | 範例 |
---|---|---|
-e filename | 如果 filename 存在,則為真 | [ -e /var/log/syslog ] |
-d filename | 如果 filename 為目錄,則為真 | [ -d /tmp/mydir ] |
-f filename | 如果 filename 為常規檔案,則為真 | [ -f /usr/bin/grep ] |
-L filename | 如果 filename 為符號連結,則為真 | [ -L /usr/bin/grep ] |
-r filename | 如果 filename 可讀,則為真 | [ -r /var/log/syslog ] |
-w filename | 如果 filename 可寫,則為真 | [ -w /var/mytmp.txt ] |
-x filename | 如果 filename 可執行,則為真 | [ -L /usr/bin/grep ] |
filename1 -nt filename2 | 如果 filename1 比 filename2 新,則為真 | [ /tmp/install/etc/services -nt /etc/services ] |
filename1 -ot filename2 | 如果 filename1 比 filename2 舊,則為真 | [ /boot/bzImage -ot arch/i386/boot/bzImage ] |
字串比較
運算子 | 描述 | 範例 |
---|---|---|
-z string | 如果 string 長度為零,則為真 | [ -z "${myvar}" ] |
-n string | 如果 string 長度非零,則為真 | [ -n "${myvar}" ] |
string1 = string2 | 如果 string1 與 string2 相同,則為真 | [ "${myvar}" = "abc" ] |
string1 != string2 | 如果 string1 與 string2 不同,則為真 | [ "${myvar}" != "abc" ] |
string1 < string | 如果 string1 小於 string2,則為真 | [ "${myvar}" < "abc" ] [[ "${myvar}" < "abc" ]] |
string1 > string | 如果 string1 大於 string2,則為真 | [ "${myvar}" > "abc" ] [[ "${myvar}" > "abc" ]] |
注意:
- 在字串兩邊加上”“防止出錯
<
和>
是字串比較,不要錯用成整數比較- 如果是在
[ ]
中使用<
和>
,需要將它們寫成<
和>
整數比較
運算子 | 描述 | 範例 |
---|---|---|
num1 -eq num2 | 等於 | [ 3 -eq $mynum ] |
num1 -ne num2 | 不等於 | [ 3 -ne $mynum ] |
num1 -lt num2 | 小於 | [ 3 -lt $mynum ] |
num1 -le num2 | 小於或等於 | [ 3 -le $mynum ] |
num1 -ge num2 | 大於或等於 | [ 3 -ge $mynum ] |
第三式:&&、||
&& 可以用來對兩個判斷語句求與 |
---|
if [ -n "abc" ] && [ -n "aa" ] |
if [[ -n "abc" ]] && [[ -n "aa" ]] |
if test -n "abc" && test -n "aa" |
if [[ -n "abc" && -n "aa" ]] |
註:只有
[[ ]]
才允許把&&
寫在裡面
|| 可以用來對兩個判斷語句求或 |
---|
if [ -n "abc" ] || [ -n "aa" ] |
if [[ -n "abc" ]] || [[ -n "aa" ]] |
if test -n "abc" || test -n "aa" |
if [[ -n "abc" || -n "aa" ]] |
小技巧
&&
、||
還可以用來拼接命令,達到按前一個命令成功與否來決定是否執行後一個命令的效果
cd /data && ls # 當`cd /data`返回0(即成功)時才執行後面的`ls`
cd /data || cd /root # 當`cd /data`返回非0(即失敗)時才執行後面的`cd /root`
第三招:迴圈
第一式:for
for i in {1..100}
do
echo ${i}
done
註:
{1..100}
屬於通配的一種寫法,展開會是1 2 3 ... 100
(1~100以空格隔開)這樣的字串。例如
for i in 1 2 3;
這樣的語句,for
會將1
、2
、3
依次賦值於i
進行迴圈,而對於通配的情況,for
則會將通配展開後將裡面的每一項依次賦值於i
進行迴圈。
for i in `seq 100`
do
echo ${i}
done
for i in `seq 1 2 100`
do
echo ${i}
done
註:
seq
本身為一個命令,用於輸出數位組成的序列,如seq 100
會生成並輸出1 2 3 ... 100
(1~100以換行符隔開)這樣的序列,而seq 1 2 100
則會生成並輸出1 3 5 ... 99
(以1開始,2為公差的等差數列中小於100的項,以換行符隔開)。- 反引號(`)之間的命令會被執行,其輸出結果會轉換成一個變數,故上面的
for in
會依次取出seq
的執行結果賦值於i
進行迴圈。
for ((i = 0; i < 100; i++))
do
echo ${i}
done
for ((i = 0; i < 100; i+= 2))
do
echo ${i}
done
註:
以上與C語言式的
for
迴圈語法基本相同,區別在於雙重括號:(( ))
第二式:while、until
i=0
while [[ ${i} -lt 100 ]]
do
echo ${i}
((i++))
done
i=0
until [[ ${i} -ge 100 ]]
do
echo ${i}
((i++))
done
註:
while
和until
的判斷原理與if
是類似的,它會執行並它後面跟著的命令,不同點在於:
while
是後面語句返回值為0
,則執行迴圈中的語句塊,否則跳出迴圈;until
則是後面語句返回值非0
,則執行迴圈中的語句塊,否則跳出迴圈。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-05/117023p2.htm
相關文章