shell入門

scwyfy發表於2024-03-30

本筆記參考自:tutorialspoint

變數

一般變數

一般的變數是指我們自己定義的,在程式當中需要使用的變數。定義時可以通過 = 對其進行初始化,訪問變數時使用 $

# definition of the variable, please note that there is no space surround "="
greeting="hello world"

# use the variable we defined above
echo $greeting

在shell程式設計當中,變數可以分成三類:

  1. 本地變數
  2. 環境變數
  3. shell變數

特殊(內建)變數

  1. $, 表示當前shell的程式ID;
  2. $0, 表示當前script的檔名;
  3. $n, 表示當前shell需要的引數;
  4. $?, 上一個命令的執行結果程式碼;
  5. $!, 上一個在後臺執行的程式ID;
  6. $*, $@

首先需要明確$*$@沒有任何區別,但是”$*””$@“有很大區別。
”$*”會把整個命令列輸入的引數包裹成一個引數,用空格分隔。
”$@“會把整個命令列的引數拆成一個一個獨立的引數,用空格分割。

參看以下這個例子:

# file name test.sh

echo '$*'
for TOKEN in "$*"
do
   echo $TOKEN
done

echo '$@'
for TOKEN in "$@"
do
   echo $TOKEN
done

在命令列下執行bash test.sh a b c。輸出如下:

$*
a b c
$@
a
b
c

陣列

在shell當中,陣列可以理解成動態陣列,並且使用時不一定需要宣告。陣列下標從零開始,訪問時使用${array_name[index]}格式進行。

name[0]="eric0"
name[1]="eric1"
name[2]="eric2"

echo ${name[0]}  #eric0
echo ${name[1]}  #eric1
echo ${name[2]}  #eric2
ecah ${#name[*]} #3 (array length)
ecah ${#name[@]} #3 (array length, same with above)

操作符

數學運算子

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

關係運算子

a=10
b=20

# -eq --> =
# -ne --> !=
# -gt --> >
# -lt --> <
# -ge --> >=
# -le --> <=

# space must appear around "[" and "]"

if [ $a -eq $b ]
then
   echo "$a -eq $b : a is equal to b"
else
   echo "$a -eq $b: a is not equal to b"
fi

布林運算子

a=10
b=20

# !
if [ $a != $b ]
then
   echo "$a != $b : a is not equal to b"
else
   echo "$a != $b: a is equal to b"
fi

# -a --> and
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a -lt 100 -a $b -gt 15 : returns true"
else
   echo "$a -lt 100 -a $b -gt 15 : returns false"
fi

# -o --> or
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a -lt 100 -o $b -gt 100 : returns true"
else
   echo "$a -lt 100 -o $b -gt 100 : returns false"
fi

字串運算子

735527-e62e9595322ae393.png
字串運算子

File Test運算子

735527-6123728e74e132d1.png
File Test運算子

函式

定一個函式和其他語言差不多,呼叫函式時只需要通過函式名,而不需要加上括號。需要注意的是,函式在呼叫之前必須先定義。

# define a function
greet() {
  echo "Hello world from a function"
}

# call the function
greet

迴圈

下面的程式碼片段可以列出當前目錄下的所有子專案:

for file in ./*
do
  echo file
done

更多迴圈語句,參看這裡
迴圈控制語句,continuebreak 參看這裡

條件

下面的程式碼片段可以列出當前目錄下的所有子專案,並判斷該子專案是目錄還是檔案:

for file in ./*
do
  if test -f file
  then
    echo "$file is a file"
  else 
    echo "$file is a directory"
  fi
done

更多的條件語句,參看這裡

相關文章