Linux-基礎入門-學習筆記(4):shell編程常用語法演示

Linux-基礎入門-學習筆記(4):shell編程常用語法演示

一、shell介紹

在之前的博客中已經對shell進行了簡單的介紹,並且搭建了簡易的shell框架,詳細請參考博客:搭建簡單的shell框架

編寫shell腳本時使用的語言就是shell語言,又叫腳本語言。shell腳本其實是一類語言而不是一個語言。

常用的shell語言:
sh(dash)、bash、csh、ksh、perl、python等。
linux下最常用的腳本就是sh、bash

shell腳本運行機制:解析運行
C語言(C++)這種編寫過程是:編寫出源代碼(源代碼是不能直接運行的)然後編譯鏈接形成可執行二進制程序,然後才能運行;而腳本程序不同,腳本程序編寫好後源代碼即可直接運行(沒有編譯鏈接過程)
shell程序是解釋運行的,所謂解釋運行就是說當我們執行一個shell程序時,shell解析器會逐行的解釋shell程序代碼,然後一行一行的去運行。(順序結構)
CPU實際只認識二進制代碼,根本不認識源代碼。腳本程序源代碼其實也不是二進制代碼,CPU也不認識,也不能直接執行。只不過腳本程序的編譯鏈接過程不是以腳本程序源代碼爲單位進行的,而是在腳本運行過程中逐行的解釋執行時纔去完成腳本程序源代碼轉成二進制的過程(不一定是編譯鏈接,因爲這行腳本程序可能早就編譯連接好了,這裏我們只是調用它)的。

二、shell常見用法演示

1. shell程序運行方法

(1)./xx.sh
(2)source xx.sh
(3)bash xx.sh

在這裏插入圖片描述

2. shell程序輸出字符串

#!/bin/sh
#shuchu helloworld
echo "hello world."

#!/bin/sh表示指定shell程序執行時被/bin目錄下的sh(dash)解釋器解釋執行。
# 開頭的行是註釋行。如果有多行需要註釋,每行前面都要加#。(#就相當於是C語言中的//)
echo後面跟的字符串是將來要打印出的。

3. shell配合linux命令使用

#!/bin/sh
#mkdir+touch
mkdir dir
cd dir
touch b.txt
cd ..

PWD=`pwd`
echo $PWD

在這裏插入圖片描述
(1)直接執行
(2)反引號括起來執行。有時候我們在shell中調用linux命令是爲了得到這個命令的返回值(結果值),這時候就適合用一對反引號(鍵盤上ESC按鍵下面的那個按鍵,和~在一個按鍵上)來調用執行命令。
實驗證明:linux下的操作指令可以在shell腳本文件中使用

4. shell中的變量定義和引用

#!/bin/sh
# variable define & use
#test1:standard format
test1="test1"
#test2:space
test2 ="test2"
echo $test1
echo $test2

var="hello"
echo "${var}you"

在這裏插入圖片描述
實驗證明:在shell中賦值的=兩邊是不能有空格的
shell中引用一個變量必須使用$ 符號,$符號就是變量解引用符號。

#!/bin/sh
# variable define & use
test1="test1"
#test2:repalce
test1="test2"
echo $test1

在這裏插入圖片描述
實驗證明:變量定義後可以再次賦值,新的賦值會覆蓋老的賦值。shell中並不刻意區分變量的定義和賦值,反正每個變量就是一個符號,這個符號的值就是最後一個給他賦值時的值。

5.shell中無引號、單引號和雙引號的區別

#!/bin/sh
#fuhao test
test1=test1
test2='test2'
test3="te\"st3"
test4='te\"st4'
echo $test1
echo $test2
echo $test3
echo $test4

在這裏插入圖片描述
無引號:
shell中使用字符串可以不加雙引號,直接使用。而且有空格時也可以,但是缺陷是不能輸出"或者其他轉義字符。
在單引號中:
完全字面替換,寫什麼就輸出什麼(不可包含單引號本身)。
在雙引號中:
$加變量名可以取變量的值
反引號仍表示命令替換
$表示$ 的字面值 輸出$符號
`表示`的字面值
"表示"的字面值
\表示\的字面值
除以上情況之外,在其它字符前面的\無特殊含義,只表示字面值。

6. shell中選擇分支結構

#!/bin/sh
#if the a.txt exist,say yes,if not exist,say no and create
if  [ -f a.txt ]; then
        echo "yes"
else
        echo "no"
        touch a.txt
fi

在這裏插入圖片描述
在判決表達式中,內容左右各有一個空格
判斷文件是否存在:(-f)
判斷目錄是否存在: (-d)
判斷字符串是否相等(“str1” = “str2”),注意用一個等號而不是兩個。
判斷數字是否相等(-eq)、大於(-gt)、小於(-lt)、大於等於(-ge)、小於等於(-le)。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)。
判斷字符串是否爲空(-z)注意-z判斷時如果變量本身沒定義也是不成立(也就是說-z認爲沒定義不等於爲空)。

#!/bin/sh
if [ "str1"="str1" ];then
        echo "the strings are the same"
else
        echo "the strings are the different"
fi

if [ 1 -lt 2 ];then
        echo "1 is less than 2"
else
        echo "1 is large than 2"
fi

string=""
if [ $string -z ];then
        echo "the string is empty"
else
        echo "the string is not empty"
fi

在這裏插入圖片描述

7. shell中的循環

#!/bin/sh
# while
i=2
j=6
while [ $i -lt $j ]
do
        echo $i
        i=$(($i + 1))
done
# for
for i in 1 2 3 4 5
do
        echo $i
done

在這裏插入圖片描述

8. shell中的追加符號

#!/bin/sh
# echo指令創建文件和追加輸入文件
echo "#include <stdio.h> 
int main(void)
{ 
	return 0;
}" > a.c

# echo指令向已經存在的文件中追加輸入內容
echo "追加的內容" >> a.c

在這裏插入圖片描述
在shell中可以直接使用echo指令新建一個文件,並且將一些內容傳入這個文件中。創建文件並輸入內容的關鍵就是>。
還可以使用echo指令配合追加符號>> 向一個已經存在的文件末尾追加輸入內容。

9. shell中的case語句

#!/bin/sh
var=1
case $var in
1) echo "1" ;;
2) echo "2" ;;
esac

在這裏插入圖片描述
shell中的case語句天生沒有break,也不需要break,和C語言中的switch case不同。shell中的case默認就是匹配上哪個執行哪個,不會說執行完了還去執行後面的其他case(就好像shell中的case語言默認都帶了break)。
如果case中帶着break,此時的break是用來跳出while循環的,一定是case與while循環配合使用的。

10. shell中的傳參與shift指令

#!/bin/sh
# 演示使用$#  $0  $1等傳參與shift指令
echo $# $0 $1 $2 $3
shift;
echo $# $0 $1 $2 $3

在這裏插入圖片描述
./9.shift.sh aa bb cc可知:$# 表示有幾個參數(4), $0是執行這個shell程序的解析程序的名字( ./9.shift.sh),$1是第一個有效參數的值(aa),$2是第2個有效參數的值(bb),$3是第3個有效參數的值(cc)。
當經過shift之後: 整個參數像是被進行了左移,把我們給shell程序的傳參左移了一個移出去了,原來的$2變成了新的$1,原來的 $#少了1個。

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