Shell基本語法---基礎

#!/usr/bin/env bash

#----------------------
# 這裏是註釋
#----------------------

<<EOF
這裏是多行註釋
EOF

echo "hello, world"

# printf 後面的格式化字符串能夠是加雙引號,能夠加單引號,能夠不加引號
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

name="abc"   # 定義變量,等號兩邊不能有空格
unset name   # 註銷變量

# 局部變量 - 局部變量是僅在某個腳本內部有效的變量。它們不能被其餘的程序和腳本訪問。
# 環境變量 - 環境變量是對當前shell會話內全部的程序或腳本均可見的變量。建立它們跟建立局部變量相似,但使用的是 export 關鍵字,shell 腳本也能夠定義環境變量。

# 數據類型:整型 字符串 數組

# 單引號不識別變量,雙引號識別變量
str1="abc"
str2="123"
echo "$str1""$str2"

# 獲取字符串長度
echo "${#str1}"

# 獲取子串長度,下標從0開始,最後一個參數截取字符串個數
str3="123456"
echo ${str3:1:3}
echo ${str3:1:1}

# 查找子字符串的位置
str4="123456aabcdef"
echo `expr index ${str4} aa`

# bsah只支持一維數組,下標必須大於等於0
arr1=("aa", "bb", "cc")
arr2=([2]=2 [0]=0 [1]=1)

echo ${arr1[0]} 
echo ${arr1[1]}
echo ${arr1[*]}   # 輸出所有數組元素
echo ${arr1[@]}   # 輸出所有數組元素
echo ${#arr1[*]}  # 訪問數組長度

arr3=("11", ${arr1[*]}, "22")   # 向數組中添加元素,其實是建立一個新數組
echo ${arr3[*]}

unset arr2[2]  # 刪除數組中的元素
echo ${arr2[*]}


# 算術運算
<<EOF
運算符    說明    舉例
 +        加法    expr $x + $y 結果爲 30。
 -        減法    expr $x - $y 結果爲 -10。
 *        乘法    expr $x * $y 結果爲 200。
 /        除法    expr $y / $x 結果爲 2。
 %        取餘    expr $y % $x 結果爲 0。
 =        賦值    x=$y 將把變量 y 的值賦給 x。
 ==       相等    用於比較兩個數字,相同則返回 true。    [ $x == $y ] 返回 false。
 !=       不相等  用於比較兩個數字,不相同則返回 true。[ $x != $y ] 返回 true。
EOF

a=10
b=20
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a / 3`

# 關係運算:關係運算符只支持數字,不支持字符串,除非字符串的值是數字
<<EOF
運算符    說明                                              舉例
-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。
EOF

if [[ ${a} -eq ${b} ]]; then
   echo "${a} -eq ${b} : a 等於 b"
else
   echo "${a} -eq ${b}: a 不等於 b"
fi

# 布爾運算
<<EOF
運算符    說明                                              舉例
!        非運算,表達式爲 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。
EOF

if [[ ${a} -eq ${b} && false ]]; then
   echo "${a} -eq ${b} : a 等於 b"
else
   echo "${a} -eq ${b}: a 不等於 b"
fi

# 字符串運算符
<<EOF
運算符    說明                                        舉例
=        檢測兩個字符串是否相等,相等返回 true。        [ $a = $b ] 返回 false。
!=        檢測兩個字符串是否相等,不相等返回 true。    [ $a != $b ] 返回 true。
-z        檢測字符串長度是否爲 0,爲 0 返回 true。    [ -z $a ] 返回 false。
-n        檢測字符串長度是否爲 0,不爲 0 返回 true。    [ -n $a ] 返回 true。
str        檢測字符串是否爲空,不爲空返回 true。        [ $a ] 返回 true。
EOF

s="abcd"

if [[ -z $s ]]; then
   echo "字符串是空"
else
   echo "字符串不是空"
fi

# 文件測試運算符
<<EOF
操做符    說明                                                                 舉例
-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。
EOF

file="/etc/hosts"
if [[ -r ${file} ]]; then
   echo "${file} 文件可讀"
else
   echo "${file} 文件不可讀"
fi

echo "*********************************************************"

# 控制語句
x=1
y=2
if [[ $x > $y ]]; then
    echo "x > y"
elif [[ $x < $y ]]; then
    echo "x < y"
else
    echo "x = y"
fi

operator="+"
case $operator in 
    "+")
        echo `expr $x + $y`
        ;;
    "-")
        echo `expr $x - $y`
        ;;
    "*")
        echo `expr $x * $y`
        ;;
    "/")
        echo `expr $x / $y`
        ;;
    *)
        echo "default"
        ;;
esac

z=1.2
case $z in
    1.2)
        echo "two"
        ;;&
    "1.2")
        echo "one"
        ;; 
    *)
        echo "default"
        ;;
esac

# )匹配case,;;表示break,*)表示匹配任意條件,也就是最後的default
# ;;& 後面的條件繼續匹配,匹配的case會進入執行
# ;& 後面挨着的一個case無條件執行,直到break跳出

# 循環語句

for x in 2 3 4 5 6 
do
    echo $x
done

data=(8 9 10)
for x in ${data[*]}
do
    echo $x
done

for (( i = 0; i < 10; i++ )); do
  echo $i
done

for path in /home/chusiyong/* 
do
    echo $path
done

x=0
while [[ ${x} -lt 10 ]]
do
  echo $((x * x))
  x=$((x + 1))
done

x=0
until [[ ${x} -ge 5 ]]; do
  echo ${x}
  x=`expr ${x} + 1`
done


# 函數
<<EOF
[ function ] funname [()] {
    action;
    [return int;]
}

函數定義時,function關鍵字無關緊要。
函數返回值,return返回函數返回值,返回值類型只能爲整數(0-255)。若是不加return語句,shell默認將以最後一條命令的運行結果,做爲函數返回值。
函數返回值在調用該函數後經過 $?來得到。
全部函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時才能夠使用。調用函數僅使用其函數名便可

函數內部獲取參數
變量            描述
$0                腳本名稱
$1 … $9            第 1 個到第 9 個參數列表
${10} … ${N}    第 10 個到 N 個參數列表
$* or $@        除了$0外的全部位置參數
$#                不包括$0在內的位置參數的個數
$FUNCNAME        函數名稱(僅在函數內部有值)

函數調用
funname arg1 arg2 ...
EOF

func ()
{
    echo "$1"
    echo "$2"
    echo "$#"
}

func "one" "two"


# shell擴展

# 大括號擴展
echo {0..10}
echo {0..10..2}

# 命令置換
now=`date +%T`
echo $now

# 單引號和雙引號之間有很重要的區別。在雙引號中,變量引用或者命令置換是會被展開的。在單引號中是不會。
INPUT="A string  with   strange    whitespace."
echo $INPUT   
echo "$INPUT" 

# 重定向
<<EOF
代碼    描述符    描述
0        stdin    標準輸入
1        stdout    標準輸出
2        stderr    標準錯誤輸出
EOF

# command > /dev/null 2>&1 標準輸出和標準錯誤都輸出到/dev/null
# command > /dev/null 2>1  標準錯誤輸出到文件名是"1"的文件
相關文章
相關標籤/搜索