中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux基礎之如何編寫shell腳本

發布時間:2020-11-18 14:10:53 來源:億速云 閱讀:386 作者:小新 欄目:建站服務器

這篇文章主要介紹了Linux基礎之如何編寫shell腳本,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

概述

Shell的概念是源自Unix的命令解釋器。Shell不僅可解釋用戶輸入的命令,同時,可解釋執行基于命令的腳本語言。使用shell腳本能提高用戶操作和管理員進行系統管理的效率。shell腳本擅長處理純文本類型的數據,而Linux中幾乎所有的配置文件、日志都是純文本類型。

如何編寫shell腳本

腳本書寫規范

1.腳本統一存放目錄 
2.選擇解釋器, 開頭要寫#! XXX,內核根據#!后的解釋器來確定用哪個解釋器解釋腳本內容
3.編輯腳本使用vim, 配置~/.vimrc方便個人書寫習慣   
4.文件名規范,結尾以sh結束

shell的基本元素

1.#!/bin/bash 必須的,指出shell的類型
2.# 注釋。在shell中,注釋寫在#之后,#之后的內容不會執行
3.變量 
4.控制 循環分支

shell中的特殊符號

1.#! 注明執行腳本采用的shell
2.$ 變量符。
與反斜杠轉義符相反,使其后的普通字符作為變量名,如$a表示變量a的值。變量
字符長度超過1個時,用{}括起來
3.單引號。
被引起的字符全部做普通字符,即全部原樣echo 'my $SHELL'
4.雙引號
引號內的內容,除$、轉義符\、倒引號`這三個保留特殊功能,其他字符均做普通字符。
5.倒引號(數字1鍵旁邊的那個鍵)
引號內的字符串當做shell命令行解釋執行(同樣的功能也可以使用$()來使用),得到的結果
取代整個倒引號括起來的部分。
6.反斜線
反斜線是轉義字符,它能把特殊字符變成普通字符。在某個字符前面利用反斜杠(\)能夠阻止
shell把后面的字符解釋為特殊字符。
7.*  代表0個或者多個特殊字符
例子 yum.* 代表的可以使yum.也可以是yum.a、yum.ab、yum.abc 當然小數點后面可以有多個字母
8.? 代表的是任意一個字符
例子 yum.? 可以是yum.a yum.b yum.c,但是要注意小數點后面必須有任意一個字符
9.[] 
代表的是中括號中的任意一個
[abcdef] 可以是a b c d e f 中的任意一個字母當然也可以是數字
[-]代表的是一個范圍
[a-z] 表示的是字母a到z之間的所有字母
[^]^是反向選擇符號從字面意思可以知道也就是非的意思
[^abc]表示只要不a b c 這三個字符中的任意一個就選擇
10.$( )
可以將命令替換輸出賦值給變量
11.{}
通過括號擴展可以生成需要的字串,括號中可以包含連續的序列或使用逗號分隔的多個項目,連續的序列包括一個起點和一個終點
user@computer: ~$ echo {a,b,c}
 a b c
user@computer: ~$ echo user{1,5,8}
user1 user5 user8
user@computer: ~$ echo {0..10}
0 1 2 3 4 5 6 7 8 9 10
user@computer: ~$ mkdir {dir1,dir2,dir3}
user@computer: ~$ ls –ld dir{1,2,3}

變量

shell變量可以保存路徑名、文件名或者一個數字等。分為三類:

本地變量: (局部變量)只在創建它們的Shell中使用,可以在shell程序內任意使用和修改它
們。
環境變量: 可以在創建它們的Shell及其派生出來的任意子程序中使用。有些變量是用戶創建
的,其他的則是專用的(比如PATH、HOME)。是系統環境的一部分,不必去定義它們,可以在
shell程序中使用它們 。還能在shell中加以修改。
內部變量: 由系統提供的。與環境變量不同,用戶不能修改它們。
本地變量
本地變量 在用戶現在的shell生命期的腳本中使用
 變量名=值
1.等號兩邊不可以有空格
2.取值包含空格,必須用雙引號括起來
3.Shell變量可以用大小寫字母,區分大小寫

變量是弱類型的, 不用聲明類型

# 變量聲明及賦值格式
變量=值(等號兩邊不能有空格)

# 變量的引用
 $變量名   
 ${變量名}
 變量名為1個字符時建議使用方式一,多余一個字符時建議使用方式二
 舉例: $a ${abc}

# 清除變量
unset 變量名
user@computer: ~$ name=Jack
user@computer: ~$ echo ${name}
user@computer: ~$ unset name  # 注意,name前沒有$

# 設置只讀變量
設置變量時,不想再改變其值,可以將之設為只讀變量
 變量名=值
 readonly  變量名
環境變量

Bash預設了很多環境變量,實際使用中,可以直接調用這些變量。環境變量可以用于所有子程序,著包括編輯器、腳本和應用

內置環境變量

HOME: 代表使用者的家目錄。cd ~ 去到使用者的家目錄 或者利用 cd 就可以直接回到使用者
家目錄了。
SHELL: 目前這個環境使用的 SHELL 是哪個程序? 如果是 bash 的話,預設是 /bin/bash
PWD:用戶當前工作目錄的路徑。它指出用戶目前在Linux文件系統中處在什么位置。它是由
Linux自動設置的
HISTSIZE: 這個與“歷史命令”有關,曾經下達過的指令可以被系統記錄下來,而記錄的“數目”
則是由這個值來設定的。 
PATH: 就是執行文件搜尋的路徑,目錄與目錄中間以冒號(:)分隔, 由于文件的搜尋是依序由
PATH的變量內的目錄來查詢,所以,目錄的順序也很重要。
環境變量可以在命令行中設置,但用戶注銷時這些值將丟失
   環境變量均為大寫
   必須用export命令導出

# 設置環境變量 
variable-name=value
export variable-name(環境變量名大寫)

# 顯示環境變量
env 可以看到所有的環境變量
echo $環境變量名 (顯示一個變量)

# 清除環境變量
unset 環境變量名

修改path環境變量

修改PATH環境變量,使腳本不用加路徑,直接輸入文件名字即可執行。
# 命令行修改環境變量
以下在用戶user主目錄下操作:
mkdir shdir && cd shdir
vi hello
chmod 755 hello
cd ~
export PATH=$PATH:$HOME/shdir
在任何目錄下,輸入hello即可執行該文件。
本方式下環境變量如果修改錯了,exit退出后重新登陸即可恢復系統默認的值。

配置文件中修改環境變量

注意,修改環境變量前最好先備份一下舊的:
export tem=$PATH
echo $tem >>pathbake

需要知道環境變量與哪些配置文件有關:不同發行版會有不同,但命名還是有通性的:
find / -name “*profile”
find / -name “*bashrc”
全局配置文件/etc/profile
本地配置文件~/.bashrc
內部變量

內部變量是Linux所提供的一種特殊類型的變量,這類變量在程序中用來作出判斷。在shell程序內這類變量的值是不能修改的。

部分內部變量是:
$# 傳送給shell程序的位置參數的數量
$? 最后命令的完成碼或者在shell程序內部執行的shell程序(返回值)
$0 shell程序的名稱
$* 調用shell程序時所傳送的全部參數的單字符串,"參數1", "參數2"…形式保存的參數
$@ "參數1", "參數2"…形式保存的參數
$n 第n個參數
$$ 本程序的PID
$! 上一個命令的PID

輸入與輸出

# read 從鍵盤上讀取變量的值
read  [選項]  變量名列表
    常用選項
    -a ANAME   將輸入讀入ANAME的數組      
    -n NCHARS  讀入N個字符                
    -p PROMPT  顯示一個提示                       
    -r         取消轉移                           
    -s         安靜模式,輸入的字符將不會提示     
    -t TIMEOUT 超過指定時間,read自動停止 
  
# echo 顯示字符串或變量的值
echo  [選項]  字符串
    常用選項
    -n  不在最后自動換行               
    -e  啟用反斜線控制字符的轉換       
    -E  不處理轉義字符。此為缺省選項;
#! /bin/bash
# 輸入一句話,打印輸入的話
read -p 'please type some words, I will print them: ' words
echo $words

條件測試

# test
test 條件表達式
如果測試條件為真,test命令會返回0,否則返回一個非0的數值
test 語句與if/then和case語句一起,構成shell編程的控制轉移結構

# []
[ 條件表達式 ]	
方括號的內側兩邊各需一個空格

條件表達式的值為真返回零,為假時返回非零值
文件狀態判斷
條件語句真假
-d filename若文件filename為目錄文件,則返回真
-f filename文件是否存在且為普通文件,則返回真
-r filename若文件filename可讀,則返回真
-s filename若文件filename的長度大于0,則返回真
-w filename若文件filename可寫,則返回真
-x filename若文件filename可執行,則返回真
-e filename文件是否存在
#! /bin/bash
# 輸入文件的絕對路徑,判斷文件是否存在
read  -p 'input file path: ' file
if [ -e $file ]
    then
    echo '文件存在'
else
    echo '文件不存在'
fi
條件語句
if  [ 條件表達式 ] 
    then
    命令序列1
else
    命令序列2
fi
當"條件表達式"的測試值為真時,執行"命令序列1",否則,執行"命令序列2"。命令序列中的命令
可以是一個或者多個。


if [ 條件表達式 ]; then
    命令序列
fi
當"條件表達式"的測試值為真時,執行"命令序列",否則,執行條件語句后面的命令。條件表達
式與then之間的分號";"起命令分隔符的作用。

語法形式三

if test 條件表達式1
    then
    命令序列1
elif [ 條件表達式2 ]
    then
    命令序列2
else
    命令序列3
fi
這是包含二層嵌套的條件語句,當"條件表達式1"為真時,執行"命令序列1",否則,在"條件表
達式2"為真的情況下,執行"命令序列2",否則,執行"命令序列3","命令序列3"屬于第2個條
件語句的一部分。

#! /bin/bash
# 判斷輸入的路徑是文件還是目錄
read -p 'please input the file path: ' file
if [ -d $file ]
   then
   echo 'this is a directory'
elif [ -f $file ]
   then
   echo 'this is a file'
else
   echo 'wrong file type, or the file do not exist'
fi

操作符含義
n1 –eq n2判斷數字n1與n2是否相等,若相等,返回0,否則,返回1
n1 –ne n2判斷數字n1與n2是否不等,若不等,返回0,否則,返回1
n1 –lt n2判斷數字n1是否小于n2,若是,返回0,否則,返回1
n1 –gt n2判斷數字n1是否大于n2,若是,返回0,否則,返回1
n1 –le n2判斷數字n1是否小于或等于n2,若是,返回0,否則,返回1
n1 –ge n2判斷數字n1是否大于或等于n2,若是,返回0,否則,返回1
字符串操作符
操作符含義
string若字符串string非空,則返回真
-n string若字符串string長度大于0,則返回真
-z string若字符串string長度為0,則為返回真
string1 = string2若字符串string1和string2相等,則返回真
string1 != string2若字符串string1和 string2不等,則返回真
邏輯操作符
操作符含義
e1 –a e2邏輯表達式e1和e2同時為真時,返回0,否則,返回1
e1 –o e2邏輯表達式e1和e2有一個為真時,返回0,否則,返回1
! e1若邏輯表達式e1不為真時,返回0,,否則,返回1

循環語句

for 變量名 in 參數列表
    do
    命令列表
done
將"參數列表"中的元素依次賦給"變量名",在每次賦值后執行"命令列表","參數列表"表示"變
量名"的取值范圍

for ((初始化變量值;結束循環條件;運算))
    do
    命令序列
done

while [ 條件表達式 ] 
    do
    命令列表
done
循環執行"命令列表"中的命令,直至"條件表達式"的值為假。

Until [ 條件 ]
    do
    命令序列
Done
直到條件滿足時循環結束
#! /bin/bash
# 將指定目錄下(參數傳遞$1)的所有以.txt為后綴的文件更名為*.doc
directory=$1
if [ ! $directory ]
  then 
  echo "please input the argument directory"
  exit
fi
files=`ls ${directory}`
for file in $files;
  do
  if [ -f ${file} ]
    echo $file
    then 
    suffix=${file#*\.}
    echo $suffix
    if [[ $suffix == "txt" ]]
      then
      prefix=${file%\.*}
      mv $directory/$file $directory/$prefix.doc
    fi
  fi
done

函數

functionname() {
    命令列表
    return 
}
函數的調用方式為:
functionname arguments

感謝你能夠認真閱讀完這篇文章,希望小編分享Linux基礎之如何編寫shell腳本內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

射阳县| 韩城市| 会同县| 横山县| 合山市| 美姑县| 馆陶县| 黄山市| 隆化县| 荥阳市| 昭苏县| 定远县| 海晏县| 扶沟县| 黄龙县| 孝昌县| 柳河县| 长治市| 信丰县| 建瓯市| 泰安市| 微山县| 赣州市| 汪清县| 溧水县| 石河子市| 西和县| 黎平县| 犍为县| 宜昌市| 海门市| 前郭尔| 靖安县| 苏尼特左旗| 青海省| 南召县| 肃北| 涡阳县| 汽车| 贵定县| 焉耆|