Shell學習筆記

1. 變量

聲明變量java

  • a-zA-Z 開頭,不包含特殊字符
  • 等號兩邊沒有空格
  • 不與保留字符重名
PATH="/user/yihui"

使用shell

  • 變量前加 $ 符號,表示引用變量, 能夠用 {} 進行變量名的圈定
  • 支持變量的從新賦值
  • readonly修飾變量爲不可更改
  • unset 刪除變量(且沒法再次聲明和使用,只讀變量沒法刪除)
PATH="/user/yihui"
echo "the path is ${PATH}/tmp"


PATH="/test"
echo "after modify, the new path is ${PATH}/tmp"


readonly PATH
PATH="/new"
// 輸出爲: 
the path is /user/yihui/tmp
after modify, the new path is /test/tmp
./in.sh: line 12: PATH: readonly variable

特殊變量數組

Shell特殊變量:Shell $0, $#, $*, $@, $?, $$和命令行參數函數

  1. $$ 表示當前Shell進程的ID,即pid
  2. $0 當前的腳本名
  3. $# 傳遞給腳本或函數的參數個數。
  4. $n 傳遞給腳本或函數的參數。n是一個數字,表示第幾個參數,例如,第一個參數是$1,第二個參數是$2
  5. $? 上個命令的退出狀態,或函數的返回值
  6. $* 傳遞給腳本或函數的全部參數
  7. $@ 傳遞給腳本或函數的全部參數, 與$*區別在於被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數
echo "current pid:$$"

echo "arg num: $#"

echo "shell name: $0"

echo "second arg: $2"

echo "last return $?"

for var in $*:
do
    echo "$var"
done

echo "\$*=" $*
echo "\$*=$*"



for var in $@:
do
    echo "$var"
done
echo "\$*=" $@
echo "\$@=$@"
current pid:36886
arg num: 4
shell name: ./in.sh
second arg: hello
last return 0
test
hello
wolrd
123:
$*= test hello wolrd 123
$*=test hello wolrd 123
test
hello
wolrd
123:
$*= test hello wolrd 123
$@=test hello wolrd 123

2. 替換

命令替換測試

限制性shell命令,並將結果保存在變量之中ui

用反引號,將shell命令包含起來便可命令行

Data=`date`
echo "data is $Data"

UNUM=`who | wc -l`
echo "current user num: $UNUM"
data is 2017年 5月21日 星期日 14時54分19秒 CST
current user num:        2

變量替換code

上面使用 ${varName} 來表示變量,放在雙引號中時,會自動被值替換,下面給出一些擴展進程

  • 單引號('')以內的變量不會被替換
  • ${var:-word} 若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值
  • ${var:=word} 若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word
  • ${var:?message} 若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。 若此替換出如今Shell腳本中,那麼腳本將中止運行
  • ${var:+word} 若是變量 var 被定義,那麼返回 word,但不改變 var 的值

3. 運算&判斷

數學運算字符串

使用 expr xxx

  • expr $a + $b 表示兩數相加

數學判斷

  • -eq 是否相等 至關於 ==
  • -ne 是否不等 至關於 !=
  • -gt 大於
  • -ge 大於等於
  • -lt 小於
  • -le 小於等於

布爾運算

  • ! 取非
  • -o 或運算,有一個知足便可
  • -a 與運算,兩個都知足纔對

注意

條件表達式要放在方括號之間,而且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]

#!/bin/sh

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"

if [ $a == $b ]
then
   echo "a is equal to b"
fi

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

輸出

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b

字符串運算

  • = 表示字符串是否相等
  • != 表示字符串是否不等
  • -Z 檢測長度是否爲0, 是則爲true
  • -n 檢測長度是否不爲0,非0則爲true
  • str 檢測字符串是否爲空 , 非空則爲true
  • 字符串長度 ${#varName}
  • 字符串切割 ${arName:1:4}
a="hello"
b="world"

if [ $a = $b ];then
    echo "a equal b"
elif [ $a != $b ];then
    echo "a not equal b"
fi


if [ $a ];then
    echo "$a is not blank"
fi

if [ -n $a ];then
    echo "$a's length bigger then 0"
fi

echo "$a's length ${#a}"
echo "$a index of 1, 4 is ${a:1:4}"
a not equal b
hello is not blank
hello's length bigger then 0
hello's length 5
hello index of 1, 4 is ello

4. 數組

聲明

ary=(value1 value2 value3)

讀取

第0個元素: ${ary[0]}

全部元素: $ary[*] $ary[@]

長度 : ${#ary[*]}

ary=('hello' 'world' 'java' 'shell')
echo $ary

echo ${ary[1]}

echo "all cell is : ${ary[*]}"

echo "length ${#ary[*]}"
hello
world
all cell is : hello world java shell
length 4

5. 條件語句

if語句

語法:

if [ condition ]; then
  xxx
elif [ condition ]; then
  xxx
else 
  xxx
fi

switch語句

語法:

case value in:
v1)
  xxx
  xxx
  ;;
v2)
  xxx
  xxx
  ;;
*) 
  xxx
  ;;;
esac

測試

ary=('hello' 'world' 'java' 'shell')

if [ ${ary[0]} = 'helo' ];then
    echo "first cell is helo"
elif [ ${ary[0]} = 'hello' ];then
    echo "first cell is hello"
else
    echo "default"
fi


read option

case $option in
${ary[0]}):
    echo "print hello"
    ;;
${ary[1]}):
    echo "print world"
    ;;
${ary[2]}):
    echo "print java"
    ;;
${ary[3]}):
    echo "print shell"
    ;;
*):
    echo "print other"
    ;;
esac

輸出

first cell is hello
java  <-- 這個是本身輸入的
print java

6. 循環

for循環

語法

for 變量 in 列表:
do
  xxx
done

for ((i=0;i<$#;i++)):
do
  xxx
done
ary=('hello' 'world' 'java' 'shell')

for i in ${ary[*]}
do
    echo $i
done

for ((i=0;i<10;i++))
do
    printf "%d %s" $i ' '
done

輸出

hello
world
java
shell
0  1  2  3  4  5  6  7  8  9

while循環

語法

while condition
do
  xxx
done
COUNTER=0
while [ $COUNTER -lt 5 ]
do
    COUNTER='expr $COUNTER+1'
    echo $COUNTER
done

until循環

循環執行,直到條件爲true時中止,語法同while

ary=('hello' 'world' 'java' 'shell')

i=0
until [ ${ary[$i]} = 'world' ]
do
    i=`expr $i + 1`
    echo $i
done
1

break, continue

循環的控制

7. 引入文件

前面加一個點號, 引入文件,則能夠直接訪問文件中的變量

. fileName
相關文章
相關標籤/搜索