Shell 腳本常用語法

#!/bin/bash
echo "Hello World !"

# 字符串拼接
name="你的名字"
name_last="小明"
echo $"字符串拼接"
echo $name+$name_last

#數組
arr=(value1 value2 valur3)
echo ${arr[0]}
length=${#arr[@]}
echo $"字符創長度="$length

#傳參
echo "Shell 傳遞參數實例!";
echo "執行的文件名:$0";
echo "第一個參數爲:$1";
echo "第二個參數爲:$2";
echo "第三個參數爲:$3";
echo "參數個數爲:$#";
echo "傳遞的參數作爲一個字符串顯示:$*";

# $* 與 $@ 結果區別
echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

# 算術運算符
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 等於 b"
fi
if [ $a != $b ]
then
   echo "a 不等於 b"
fi

# 關係運算符
a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等於 b"
else
   echo "$a -eq $b: a 不等於 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等於 b"
else
   echo "$a -ne $b : a 等於 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大於 b"
else
   echo "$a -gt $b: a 不大於 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小於 b"
else
   echo "$a -lt $b: a 不小於 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大於或等於 b"
else
   echo "$a -ge $b: a 小於 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小於或等於 b"
else
   echo "$a -le $b: a 大於 b"
fi

# 布爾運算符
a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等於 b"
else
   echo "$a == $b: a 等於 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小於 100 且 $b 大於 15 : 返回 true"
else
   echo "$a 小於 100 且 $b 大於 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小於 100 或 $b 大於 100 : 返回 true"
else
   echo "$a 小於 100 或 $b 大於 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小於 5 或 $b 大於 100 : 返回 true"
else
   echo "$a 小於 5 或 $b 大於 100 : 返回 false"
fi

# 邏輯運算符
a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

# 字符串運算符
a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等於 b"
else
   echo "$a = $b: a 不等於 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等於 b"
else
   echo "$a != $b: a 等於 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串長度爲 0"
else
   echo "-z $a : 字符串長度不爲 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串長度不爲 0"
else
   echo "-n $a : 字符串長度爲 0"
fi
if [ $a ]
then
   echo "$a : 字符串不爲空"
else
   echo "$a : 字符串爲空"
fi


# 文件測試運算符
file="/Users/zhouzailong/Desktop/test.sh "
if [ -r $file ]
then
   echo "文件可讀"
else
   echo "文件不可讀"
fi
if [ -w $file ]
then
   echo "文件可寫"
else
   echo "文件不可寫"
fi
if [ -x $file ]
then
   echo "文件可執行"
else
   echo "文件不可執行"
fi
if [ -f $file ]
then
   echo "文件爲普通文件"
else
   echo "文件爲特殊文件"
fi
if [ -d $file ]
then
   echo "文件是個目錄"
else
   echo "文件不是個目錄"
fi
if [ -s $file ]
then
   echo "文件不爲空"
else
   echo "文件爲空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

# 顯示命令執行結果
echo `date`

# echo "It is a test" > myfile

# Shell printf 命令
# format-string爲雙引號
printf "%d %s\n" 1 "abc"

# 單引號與雙引號效果一樣 
printf '%d %s\n' 1 "abc" 

# 沒有引號也可以輸出
printf %s abcdef

# 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# 如果沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n" 

# 讀取鍵盤信息
# echo '按下 <CTRL-D> 退出'
# echo -n '輸入你最喜歡的網站名: '
# while read URL
# do
#     echo "是的!$URL 是一個好網站"
# done

#shll 函數
demoFun(){
    echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"

# 帶有return語句的函數
# funWithReturn(){
#     echo "這個函數會對輸入的兩個數字進行相加運算..."
#     echo "輸入第一個數字: "
#     read aNum
#     echo "輸入第二個數字: "
#     read anotherNum
#     echo "兩個數字分別爲 $aNum 和 $anotherNum !"
#     return $(($aNum+$anotherNum))
# }
# funWithReturn
# echo "輸入的兩個數字之和爲 $? !"

# 函數參數
funWithParam(){
    echo "第一個參數爲 $1 !"
    echo "第二個參數爲 $2 !"
    echo "第十個參數爲 $10 !"
    echo "第十個參數爲 ${10} !"
    echo "第十一個參數爲 ${11} !"
    echo "參數總數有 $# 個!"
    echo "作爲一個字符串輸出所有參數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

# $# 	傳遞到腳本或函數的參數個數
# $* 	以一個單字符串顯示所有向腳本傳遞的參數
# $$ 	腳本運行的當前進程ID號
# $! 	後臺運行的最後一個進程的ID號
# $@ 	與$*相同,但是使用時加引號,並在引號中返回每個參數。
# $- 	顯示Shell使用的當前選項,與set命令功能相同。
# $? 	顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

# Shell 輸入/輸出重定向

# 輸出重定向在用戶文件中(users):
# who > users
# cat 命令查看文件內容
cat users
echo "更改後"
#文件添加內容 如果不希望文件內容被覆蓋,可以使用 >> 追加到文件末尾
echo "www.baidu.com222" > users
cat users
# printf "新的"

# 統計 users 文件的行數
# 行數+入讀取內容
wc -l users
# 輸入讀取內容
wc -l < users
# 同時替換輸入和輸出,執行command1,從文件infile讀取內容,然後將輸出寫入到outfile中。


echo "雙文件"
who > outfile
who > infile
echo "添加一席" > infile
echo "輸出文件的原內容" > outfile

cat infile
echo "-------"
cat outfile

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章