2020年7月14日 星期二

Linux - Shell Scripts (1)

sh v.s source

    如果直接用 sh 執行 script,基本上就是開一個子程序去執行 script。所以父程序要獲得子程序的結果,通常都是靠著 export 解決 scope 的不同。若是使用 source 去執行 script,則是直接用本身程序去執行,所以本身與腳本享有共同 scope。更多請參考 : 鳥哥私房菜

基本的 variable & operator

    基本上 shell 的語法網路上有很多相關資料,這邊我想紀錄的是那些對於菜鳥不怎麼直觀的 variable & operator。而且其實我認為 shell 的精華就是在這些 variable & operator。
  • variable
        #!/bin/sh
            # 執行 : sh variable.sh a b c 
            echo $0         # script 本身
            echo $1 $2 $3   # 執行 script 時, 後面跟著的 arguments
            echo $#         # arguments 之總數
            echo $*         # 全部 arguments, 這個例子就是 a b c 
            echo $@         # 全部 arguments, 這個例子就是 a b c ($* $@ 應該有所不同, 不過我試不出來...)
            echo $?         # 上一個程式最後回傳值 (exit 0)
            echo $$         # 此 shell 的 pid
            echo $!         # 此 shell 最後執行的 background process 的 pid
        exit 0
  • operator
        #!/bin/sh
        # 執行 : sh operator.sh 20 10 
            
            # 此格式為固定的, ``, operator 前後要有空格
            # expr 不會檢查 $1 跟 $2, 所以沒有的話會出錯
            # 即使加了 "" 也會被判定 null, 等於 non-integer 也是錯 
            val=`expr $1 + $2`    # 相加
            val=`expr $1 - $2`    # 相減
            val=`expr $1 \* $2`   # 相乘 (*須加反斜線)
            val=`expr $1 / $2`    # 相除
            val=`expr $1 % $2`    # 取餘數
    
            # ==, !=, >, <, >=, <=
            if [ $1 = $2 ]; then
                val="equal"
            fi
    
            if [ $1 != $2 ]; then
                val="non-equal"
            fi
    
            if [ $1 -eq $2 ]; then
                val="equal"
            fi
    
            if [ $1 -ne $2 ]; then
                val="non-equal"
            fi
    
            if [ $1 -gt $2 ]; then
                val="greater than"
            fi
    
            if [ $1 -lt $2 ]; then
                val="less than"
            fi
    
            if [ $1 -ge $2 ]; then
                val="greater or equal"
            fi
    
            if [ $1 -le $2 ]; then
                val="less or equal"
            fi
        exit 0
  • 更多 operator
        #!/bin/sh
            # 執行 : sh operator2.sh 字串1 字串2 ...
            # 參數判斷時, 最好加上 "", 否則有高機率失效, 並出現 unary operator expected 等錯誤.
            if [ -z "$1" ]; then
                echo "there's no argument"
            fi
    
            if [ ! -z "$1" ]; then
                echo "there's at least one argument (!-z)"
            fi
    
            if [ -n "$1" ]; then
                echo "there's at least one argument (-n)"
            fi
    
            if [ "$1" ]; then
                echo "#1 argument is exist"
            fi
    
            # boolean operator -a = and, -o = or
            if [ "$1" -a "$2" ]; then
                echo "#1 and #2 arguments are both exist"
            fi
    
            if [ "$1" -o "$2" ]; then
                echo "there's at least one argument"
            fi
        exit 0
參考資料 :
下一篇 :

0 意見:

張貼留言

Popular Posts