shell魔力在於它可以將Linux中的工具直接寫到腳本里,在terminal中使用的命令可以直接寫到程序中,後面你會意識到這是一個多麼了不起的事情!所以學好shell,其實並不只是指shell語言本身,比如if、for等這些控制結構,還包括Linux發行版中一下內置工具,比如cat、sed、awk、xargs、管道等非常常用等工具的使用,下面我們先從shell語言本身說起。
shell有很多種,bash幾乎已經是標準了,所以以下我們談論的都以bash爲準。
shell不適合做什麼
- 資源密集型,如排序
- 計算密集型,如浮點型運算,效率不高
- 有複雜的邏輯,shell邏輯控制能力不強
一、shell語言本身
1.1 類型與變量
1.2 條件控制
if
if 要注意其結尾要使用fi,elseif簡寫爲elif,例如
if condition
then
commands
elif condition
then
commands
else
commands
fi
1.3 循環
for
for有兩種形式,for_i 與 for_in ,
# for_i
for((i=0;i<10;i++));
do
echo $i
done
# for_in
for VAR in $LIST
do
echo $VAR
done
遍歷一個數組
EXAMPLE_ARR=("123" "234" "012")
for str in "${EXAMPLE_ARR[@]}"
do
echo "$str"
done
遍歷數組時需要index
EXAMPLE_ARR=("123" "234" "012")
for i in "${!EXAMPLE_ARR[@]}"
do
echo "$i"
done
這語法和其他語言可是大相徑庭。
上面我們說到“可以將Linux中的工具直接寫到腳本里”,這裏我們就是用for直接遍歷一個目錄:
for file in "ls ~/"
do
echo "$file"
done
sleep
程序暫停執行,等待某項任務: sleep 20,默認單位爲秒。
1.4 函數
函數傳定義和其他語言(如golang、nodejs)相比,沒有什麼本質不同,但是傳參和調用方式卻不太一樣,參數不寫在函數定義中,函數體中直接使用$n來引用參數,返回值可以使用return、echo或者xargs,函數執行後,可以通過$?來引用結果:
[function] func_name()
{
# code
}
#!/bin/bash
function learnGolang()
{
echo "learn golang in $1"
return 12
}
learnGolang "fourty five minutes"
echo "the result of func is $?"
1.5 空格的使用
shell中空格不能隨便使用,比如聲明一個變量,等號兩邊不能有空格:
# valid
var1="test1"
echo $var1
# not valid
var2 = "test2"
echo $var2
二、shell中可以使用其他工具來完成各種類型的任務
新建文件並寫入內容,寫入內容中甚至可以包含變量
cat > test.txt <<EOF
something need to write is : ${var1}
EOF
修改文件內容
我們手動修改使用vim,在程序中更方便的是sed。
拷貝文件:cp、mv、scp