shell學習1
如何執行shell指令碼
- 通過bash命令
- 作為可執行程式
#!/bash/bash
echo "hello world"
若想用可執行程式執行,需要先修改檔案的許可權,再執行指令碼
chmod +x ./hello.sh # 使指令碼具有執行許可權
./hello.sh # 執行指令碼
如何標記語句的結束
在shell中標記語句的結束有兩種方式: 分號,換行
a=10
if [ $a = 10 ]; then
echo "the value of a is 10"
fi
或者寫成:
a=10 if [ $a =10 ] then echo "the value of a is 10" fi
基本資料型別
shell 語言是一門弱型別的語言,沒有資料型別上的概念. 無論輸入的是字串還是數字,在shell中都是按照字串型別來儲存. 至於具體是什麼型別, shell根據上下文去確定.
#!/bin/bash
num="Hello"
echo `expr $num + 1` //expr: not a decimal number: 'Hello'
num=1
echo `expr $num + 1` //2
這是因為雖然 Shell 語言是弱語言型別,但其解釋執行的時候會進行語法檢查。意識到 Shell 在資料型別上的特殊性很重要,這樣你就不會犯一些基礎錯誤了。例如下面的例子:
result="false" if $result then echo "true." else echo "false." # 輸出false fi
雖然上面的 result 變數是一個字串,但是實際上在執行時,Shell 是將其當成一個布林型的值進行比較的。當你將 result 改成 true 之後,結果便會輸出 true。
變數的使用
shell語言是一門若語言型別, 所以變數可以無須定義便可直接使用.
-
直接使用$符號引用
str=“hello shell” echo $str
-
使用${} 符號引用
str=“hello shell” echo ${str}
一般來說,如果不會引起變數的閱讀困難,那麼可以使用第一種變數引用方式。但如果在較為複雜的環境,會引起閱讀和理解困難,那還是使用第二種引用方式。例如:
#!/bin/sh
echo "what is your name?"
read USERNAME
echo "hello $USERNAME"
echo "create an email [email protected] for you"
echo "create an email ${USERNAME}@163.com for you"
最好統一的規範的加上大括號.
列印字串
echo
在一般使用echo命令列印字串. echo後的形式: 裸奔,單引號,雙引號
-
裸奔: shell後面什麼都不加,直接寫上要輸出的字串
echo i must prctice shell language
這種方式會直接輸出 echo 命令後的所有字元,例如上面會輸出:i must prctice shell language。但這種方式有個缺陷,就是無法輸出分號;。因為當讀到分號的時候,程式會認為這一行程式碼結束了。
echo I must practice ; learn shell language .
# I must practice
# -bash: learn: command not found
# 程式只輸出了 ;以前的內容,並把後面的learn當成了一個命令。
-
單引號的引用方式
str=‘hello shell language’ echo $str
但這種方式的缺陷是無法在字串中引用變數。
NAME="shell"
str='Hello ! My Name is $NAME';
echo $str
# Hello ! My Name is $NAME
-
雙引號的引用方式
NAME=“shell” str=“Hello! My Name is $NAME”; echo $str
Hello! My Name is shell
在雙引號的引用方式下,我們可以成功打印出 NAME 變數的值。但是這種方式也有其缺陷,就是無法直接打印出特殊字元,需要把特殊進行轉義。
printf
使用 printf 命令可以對齊列印字串,對於閱讀比較友好。
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 年齡 存款K
printf "%-10s %-8s %-4.2f\n" 郭靖 30 52.20
printf "%-10s %-8s %-4.2f\n" 楊過 25 26.32
printf "%-10s %-8s %-4.2f\n" 郭芙 27 15.20
%-10s,百分號是個識別符號,-表示左對齊,數字10表示保留10位的長度,s表示其實一個字串。
例如: 對應的%-8s表示左對齊,保留8位,是字串 ; 對應的%-4.2f表示左對齊,保留4位,小數點保留兩位,是個浮點型數字.
如何進行數學運算
Shell 的數學運算和我們高階語言中的語法完全不一樣。Shell 中把所有東西都當成是一個字串,所以這裡它並不知道我們要它進行數學運算。實際上在 Shell 中你要進行這樣的數學運算,你應該這麼寫:
#!/bin/bash
a=`expr 10 + 5`
echo $a
#!/bin/bash
let a=10+5
echo $a
(( a = 10 + 5 ))
echo $a
如何進行數值比較
#!/bin/bash
a=15
b=10
if (( a >= b))
then
echo "a >= b"
else
echo "a < b"
fi
#!/bin/bash
a=15
if (( a > 10 && a < 20 ))
then
echo "10 < a < 20"
else
echo "a <= 10 or a >= 20"
fi
如何進行字串比較
在shell中進行字串比較有換門的留六個操作符
- =:檢測兩個字串是否相等,相等返回 true。
- !=:檢兩個字串是否相等,不相等返回 true。
- -z:檢測字串長度是否為0,為 0 返回 true。
- -n:檢測字串長度是否為0,不為 0 返回 true。
- str:檢測字串是否為空,不為空返回 true。
要記得操作符左右兩邊都要加空格,否則會報語法錯誤。
#!/bin/bash
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
# 字串長度是否為0
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
# abc = efg: a 不等於 b
# abc != efg : a 不等於 b
# -z abc : 字串長度不為 0
# -n abc : 字串長度不為 0
# abc : 字串不為空
迴圈結構
for 迴圈結構
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
# The value is: 1
# The value is: 2
# The value is: 3
# The value is: 4
# The value is: 5
for str in 'This is a string'
do
echo $str
done
# This is a string
while 迴圈
while condition
do
command
done
#!/bin/sh
a=1
while [ $a -lt 5 ]
do
echo $a
let "a++"
done
# 1
# 2
# 3
# 4
case 語句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
*)
command1
....
commandN
;;
esac
case 語句取值後面必須為單詞 in,每一模式必須以右括號結束。取值可以為變數或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;。取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。case 語句使用 esac 作為結束標誌。
#!/bin/bash
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read aNum
case $aNum in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數字'
;;
esac
跳出迴圈
break 和 continue
#!/bin/bash
while true
do
echo -n "輸入 1 到 5 之間的數字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"
break
;;
esac
done
# 輸入 1 到 5 之間的數字:3
# 你輸入的數字為 3!
# 輸入 1 到 5 之間的數字:7
# 你輸入的數字不是 1 到 5 之間的! 遊戲結束
# continue
# continue命令與break命令類似,只有一點差別,它不會跳出所有迴圈,僅僅跳出當前迴圈。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的!"
continue
echo "遊戲結束"
;;
es
done
# 當輸入大於5的數字時,該例中的迴圈不會結束,語句 echo 「遊戲結束」永遠不會被執行。