版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章 Shell程序設(shè)計(jì)9.1Shell語言概述9.2Shell特殊字符9.3Shell變量9.4Shell表達(dá)式9.5Shell控制結(jié)構(gòu)9.6
Shell程序綜合舉例
9.1 Shell語言概述
Shell是命令語言的解釋器,它定義了Shell命令的語法和語義規(guī)范。只有遵守這種規(guī)范的命令行才能被Shell理解和執(zhí)行。Shell命令所使用的語言稱為Shell語言,它具備了編程語言的基本要素,如定義參數(shù)與變量、使用控制結(jié)構(gòu)等,因而可以實(shí)現(xiàn)各種復(fù)雜的處理邏輯。
9.1.1 Shell語言的特點(diǎn)
與其他編程語言相比,Shell語言具有如下特點(diǎn):
(1)Shell是一種解釋性語言。
(2)Shell是基于字符串的語言。
(3)Shell是命令級(jí)語言。
需要說明的是,不同版本的Shell程序不完全兼容,差別可能是細(xì)微的,也可能是明顯的。本章介紹的是bash的編程,它的應(yīng)用較廣泛,兼容性也很好。
9.1.2 Shell程序
Shell程序是由一系列Shell命令構(gòu)成的文本文件,也稱為Shell腳本(script)。簡單的Shell程序可以只是一個(gè)命令序列,高級(jí)Shell程序中還可以包含復(fù)雜的命令組合和控制結(jié)構(gòu)。
例9.1第1個(gè)Shell程序。
9.1.3 Shell程序的建立與執(zhí)行
Shell腳本是文本文件,因此可以用任何文本編輯器來編輯腳本。Shell腳本文件的名稱沒有限定的后綴名,通常不帶后綴名或帶“.sh”后綴名。
Shell腳本的執(zhí)行方式主要有3種:
(1) 將腳本作為可執(zhí)行文件直接執(zhí)行:
這種方式是將腳本作為Shell的外部命令來執(zhí)行的。
(2)派生一個(gè)Shell執(zhí)行腳本文件:
此命令將啟動(dòng)一個(gè)bash子進(jìn)程,專用于執(zhí)行參數(shù)指定的腳本。
(3)讓當(dāng)前Shell執(zhí)行腳本文件:
source命令(也可以寫作“.”命令)是Shell的內(nèi)部命令,功能是讀取參數(shù)指定的文件,執(zhí)行其內(nèi)容。此命令就是讓當(dāng)前Shell執(zhí)行腳本,而不是派生子Shell去執(zhí)行。
通常情況下,以上3種方式都可以使用,但需注意到可能存在的差異。如果腳本中有對(duì)Shell環(huán)境的修改操作,比如執(zhí)行cd命令改變當(dāng)前目錄,則前2種執(zhí)行方式不會(huì)對(duì)當(dāng)前Shell產(chǎn)生影響,而第3種方式會(huì)直接作用于當(dāng)前Shell。
9.2 Shell特殊字符
Shell定義了一些特殊的字符,稱為元字符(meta-characters),它們對(duì)Shell有特殊的含義。Shell在讀入命令行后,要先對(duì)命令行進(jìn)行掃描,找出元字符并進(jìn)行相應(yīng)的替換或處理。恰當(dāng)?shù)剡\(yùn)用元字符能使命令的功效充分發(fā)揮。
9.2.1 通配符
通配符用于描述命令行中的文件名參數(shù)。當(dāng)Shell遇到帶有通配符的文件名模式時(shí),它將當(dāng)前目錄中的所有文件與該模式進(jìn)行匹配,并用匹配的文件名替換命令行中的文件名模式。表9-1列出了常用的通配符。
例9.2通配符的匹配作用。
9.2.2 輸入/輸出重定向與管道符
輸入/輸出重定向和管道符的作用是改變命令的輸入/輸出環(huán)境。當(dāng)Shell在命令行中遇到輸入/輸出重定向或管道符時(shí),它將對(duì)命令的標(biāo)準(zhǔn)輸入/輸出文件作相應(yīng)的更改,然后再執(zhí)行命令。表9-2列出了常用的輸入/輸出重定向與管道符。
1. 標(biāo)準(zhǔn)輸入/輸出重定向
“<”是標(biāo)準(zhǔn)輸入重定向符,它將標(biāo)準(zhǔn)輸入stdin重定向到一個(gè)文件?!?gt;”是標(biāo)準(zhǔn)輸出重定向符,它將標(biāo)準(zhǔn)輸出重定向到一個(gè)文件。為了區(qū)分是哪種輸出重定向,可以在符號(hào)前加一個(gè)文件描述符fd。stdout的fd是1,stderr的fd是2,所以“1>”表示標(biāo)準(zhǔn)輸出重定向,“2>”表示標(biāo)準(zhǔn)錯(cuò)誤輸出重定向。未指定fd時(shí),默認(rèn)地表示是“1>”。
例9.3將標(biāo)準(zhǔn)輸入改為infile文件,標(biāo)準(zhǔn)輸出改為outfile文件,標(biāo)準(zhǔn)錯(cuò)誤輸出改為errfile文件。
2. 合并重定向與歸并重定向
“&>”是標(biāo)準(zhǔn)輸出合并重定向符,它將標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤輸出合在一起重定向到一個(gè)文件?!?gt;&”是標(biāo)準(zhǔn)輸出歸并重定向符,它將一種標(biāo)準(zhǔn)輸出歸并到另一種標(biāo)準(zhǔn)輸出流中。符號(hào)的前后各用一個(gè)fd來表示歸并的方式?!?>&2”或“>&2”表示將stdout歸并到stderr流中;“2>&1”表示將stderr歸并到stdout流中。
3. 附加重定向
“>>”是標(biāo)準(zhǔn)輸出附加重定向符,它將標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出用追加的方式重定向到一個(gè)文件?!?>>”或“>>”表示stdout附加重定向;“2>>”表示stderr附加重定向。
例9.7在.bash_profile文件的尾部添加一行。
4. here文檔
“<<”是一種特殊的標(biāo)準(zhǔn)輸入重定向機(jī)制,稱為“here文檔”(heredocument)。here文檔的表示格式是“<<結(jié)束標(biāo)記字符串”,它的作用是指示Shell將本命令行后面的輸入行作為命令的標(biāo)準(zhǔn)輸入傳給命令,直到遇到結(jié)束標(biāo)記字符串為止。
例9.8here文檔的使用。
5. 管道
“|”是管道符,它將前一命令的標(biāo)準(zhǔn)輸出作為后一命令的標(biāo)準(zhǔn)輸入?!皘
tee”是T型管道符,它將前一命令的標(biāo)準(zhǔn)輸出存入一個(gè)文件中,并傳遞給后一命令作為標(biāo)準(zhǔn)輸入。
9.2.3 命令執(zhí)行控制符
命令執(zhí)行控制符用于控制命令的執(zhí)行方式,指示Shell該如何執(zhí)行命令。表9-3列出了常用的命令執(zhí)行控制符。
1. 順序執(zhí)行
“;”是順序執(zhí)行符,它將兩個(gè)或多個(gè)命令組合在一個(gè)命令行中,指示Shell順序執(zhí)行這些命令。
例9.11轉(zhuǎn)到上一級(jí)目錄,顯示目錄的路徑名和目錄的文件列表。
2. 條件執(zhí)行
“&&”是邏輯與執(zhí)行符,它將兩個(gè)或多個(gè)命令組合在一個(gè)命令行中,指示Shell依次執(zhí)行這些命令直到某個(gè)命令失敗為止?!皘|”是邏輯或執(zhí)行符,它將兩個(gè)或多個(gè)命令組合在一個(gè)命令行中,指示Shell依次執(zhí)行這些命令直到某個(gè)命令成功為止。
3. 后臺(tái)執(zhí)行
“&”是后臺(tái)執(zhí)行符,它指示Shell將該命令放在后臺(tái)執(zhí)行。后臺(tái)執(zhí)行的命令不占用終端與用戶交互,因此Shell在執(zhí)行后臺(tái)命令后可以立即返回提示符。
例9.14在后臺(tái)運(yùn)行yes命令,丟棄輸出。
9.2.4 命令組合符
命令組合符的作用是指示Shell將多個(gè)命令組合在一起執(zhí)行。組合的目的是對(duì)這些命令統(tǒng)一進(jìn)行某種操作,如管道、后臺(tái)運(yùn)行、輸入/輸出重定向等。
9.2.5 命令替換符
當(dāng)一個(gè)字符串被括在反撇號(hào)中,如`字符串`,則該字符串將先被Shell作為命令解釋執(zhí)行,然后用命令執(zhí)行后的輸出結(jié)果替換`字符串`。
例9.19命令替換符的用法。
9.2.6 其他元字符
表9-4列出了其他幾個(gè)常用的元字符。
例9.20使用注釋符對(duì)命令進(jìn)行說明。
9.2.7 元字符的引用
當(dāng)需要引用元字符的原始含義,而不是它的特殊含義時(shí),就必須用引用符對(duì)它進(jìn)行轉(zhuǎn)義,消除其特殊含義。當(dāng)Shell遇到引用符時(shí),它將該引用符作用范圍內(nèi)的字符看作是普通字符。常用的引用符有3種,即轉(zhuǎn)義符、單引號(hào)和雙引號(hào)。表9-5列出了它們的含義。
例9.21在命令行中引用元字符。
9.3 Shell變量9.3.1 變量的定義與使用1. 定義變量定義變量時(shí)要注意變量的命名規(guī)則。變量的名字必須以字母或下畫線開頭,可以包括字母、數(shù)字和下畫線。例如:user1、birth_day、_time都是合法的變量名,而2user、birth-day則不是。在Shell中,對(duì)變量的定義與賦值是同時(shí)完成的。通??刹捎脙煞N方式,即用賦值命令直接賦值,或用read命令從終端讀入賦值。格式如下:
2. 引用變量
引用變量即是求出變量的值(字符串),替換在發(fā)生引用的位置。引用變量的方法是在變量名前加引用字符“$”,格式是:
例9.24在命令中引用變量。
例9.25引用變量的方法。
3. 設(shè)置只讀變量
為了防止變量的值被修改,可以用readonly命令定義只讀變量,格式是:
readonly變量名[=字符串]
例9.26設(shè)置只讀變量。
4. 清除變量
用unset命令清除變量。清除后的變量變?yōu)槲炊x變量,引用其值將得到空字符串。注意,只讀變量是不能被清除的。unset命令的格式是:
unset變量名[變量名…]
例9.27清除變量。
9.3.2 變量的作用域
變量的作用域是指變量可以被引用的范圍。根據(jù)變量的作用域來劃分,Shell變量可以分為兩類,即本地變量和導(dǎo)出變量。
1. 本地變量
在一個(gè)Shell中定義的變量默認(rèn)只在此Shell中才有意義,也就是說它們的作用是局部的,這種變量稱為本地變量。
例9.28本地變量的作用域。
2. 導(dǎo)出變量
當(dāng)Shell執(zhí)行一個(gè)命令或腳本時(shí),它通常會(huì)派生出一個(gè)子進(jìn)程來執(zhí)行命令。如果希望Shell的變量在其子進(jìn)程中也可用,可以通過導(dǎo)出操作將變量傳遞給子進(jìn)程。導(dǎo)出的變量稱為導(dǎo)出變量,它與本地變量的區(qū)別在于:導(dǎo)出變量可以被任何子進(jìn)程引用,而本地變量僅在定義它的進(jìn)程環(huán)境下才能使用。導(dǎo)出變量的命令是export,格式是:
export變量名[=字符串]
例9.29導(dǎo)出變量與本地變量的使用。
9.3.3 變量的分類
1. 用戶變量
用戶變量是用戶為實(shí)現(xiàn)某種應(yīng)用目的而定義的變量。
2. 環(huán)境變量
環(huán)境變量是由系統(tǒng)預(yù)定義的一組變量,用于為Shell提供有關(guān)運(yùn)行環(huán)境的信息。
3. 特殊變量
特殊變量是由Shell自定義的一組變量,用于記錄有關(guān)Shell當(dāng)前運(yùn)行狀態(tài)的一些信息,如運(yùn)行參數(shù)、進(jìn)程號(hào)等。
9.3.4 環(huán)境變量
1. 環(huán)境與環(huán)境變量
Shell執(zhí)行時(shí)需要了解一些有關(guān)系統(tǒng)和用戶的基本信息以及一些默認(rèn)設(shè)置信息。這些信息以變量的形式提供,稱為環(huán)境變量。環(huán)境變量的全體就稱為Shell的執(zhí)行環(huán)境。
系統(tǒng)環(huán)境變量是系統(tǒng)預(yù)定義的,用戶也可以根據(jù)需要添加自己的環(huán)境變量。系統(tǒng)環(huán)境變量的名稱是系統(tǒng)預(yù)留的,全部為大寫。表9-6列出了常用的系統(tǒng)環(huán)境變量。
2. 環(huán)境變量的定義與使用
環(huán)境變量定義在Shell的配置文件中,Shell啟動(dòng)時(shí)會(huì)執(zhí)行這些配置文件,建立起運(yùn)行環(huán)境。啟動(dòng)完成后,這些環(huán)境變量都已經(jīng)被賦值,在隨后的命令中可以直接使用。
例9.30在Shell中引用和修改環(huán)境變量。
3. Shell命令的執(zhí)行環(huán)境
Shell的所有導(dǎo)出的變量都可以被Shell的子進(jìn)程繼承使用,這些導(dǎo)出變量的全體構(gòu)成了該Shell的命令執(zhí)行環(huán)境。用env命令或export-p命令即可顯示執(zhí)行環(huán)境中的所有變量。
命令程序訪問執(zhí)行環(huán)境的方法是:腳本程序可以直接引用或修改其執(zhí)行環(huán)境中的變量;C程序可以用setenv()和getenv()函數(shù)訪問其執(zhí)行環(huán)境中的變量。
例9.31在腳本中訪問執(zhí)行環(huán)境。
9.3.5 特殊變量
Shell中有一組預(yù)定義的特殊的變量,其功能是記錄Shell當(dāng)前的運(yùn)行狀態(tài)的一些信息,如運(yùn)行參數(shù)、進(jìn)程標(biāo)識(shí)和命令退出狀態(tài)等。特殊變量的變量名和值由Shell自動(dòng)設(shè)置。這些變量都是只讀變量,因此在程序中可以引用這些變量,但不能直接對(duì)它們賦值。表9-7列出了幾個(gè)常用的特殊變量。
1. 參數(shù)變量
向Shell腳本傳遞數(shù)據(jù)的途徑有兩種:一種是通過導(dǎo)出變量進(jìn)行傳遞,另一種就是用命令行參數(shù)來傳遞。
參數(shù)變量主要有以下幾個(gè):
(1)$#:記錄命令行參數(shù)的個(gè)數(shù)。
(2)$*:記錄命令行的整個(gè)參數(shù)。
(3)$@:記錄命令行的各個(gè)參數(shù)。
(4)$i:稱為位置變量,是按位置記錄命令參數(shù)的一組變量,分別為$0,$1,$2,…,$9,${10},…。
例如,某命令的名稱為myprog,執(zhí)行時(shí)的命令行是myprog-s"Howareyou!"joejean。當(dāng)該命令被執(zhí)行時(shí),Shell隱含地為它建立起一系列參數(shù)變量,各參數(shù)變量的內(nèi)容如下:
例9.32在程序中引用參數(shù)變量。
2. 設(shè)置參數(shù)變量
參數(shù)變量是只讀的,因此用戶不能直接對(duì)參數(shù)變量重新賦值,但卻可以通過Shell提供的命令來設(shè)置這些變量。
1)用set命令設(shè)置位置變量
用set命令可以對(duì)位置變量及其他參數(shù)變量強(qiáng)制賦值,格式是:
set字符串1字符串2…
例9.33設(shè)置位置變量。
2)用shift命令移動(dòng)位置變量
shift命令的功能是將位置變量與命令行參數(shù)的對(duì)應(yīng)關(guān)系右移指定的位數(shù),格式是:
shift[位移量]
未指定位移量參數(shù)時(shí)右移1位。
注意:shift只移動(dòng)$1及其后面的位置變量的值,$0變量的值保持不變。移位的同時(shí),$#變量的值將減去相應(yīng)的數(shù),$@、$*等也相應(yīng)地被重新賦值。
例9.34用shift命令移動(dòng)位置變量的值。
3. 其他特殊變量
其他常用的特殊變量是記錄命令退出狀態(tài)和進(jìn)程PID的變量。
1)退出狀態(tài)變量
在Linux系統(tǒng)中,每個(gè)命令在執(zhí)行結(jié)束退出時(shí)都要返回給系統(tǒng)一個(gè)狀態(tài)碼。在C程序中是調(diào)用exit(status)函數(shù)退出,在Shell腳本中則是用exit
status命令退出。其中的status就是返回給系統(tǒng)的狀態(tài)碼。通常的約定是,程序成功結(jié)束時(shí)返回0狀態(tài)值;程序出錯(cuò)時(shí)返回非0的狀態(tài)值(比如1、2、-1等)。
例9.35從$?變量獲得命令的退出狀態(tài)。
2)命令的進(jìn)程號(hào)
$$變量記錄了本命令進(jìn)程的進(jìn)程號(hào)PID。當(dāng)一個(gè)命令以子進(jìn)程的方式開始運(yùn)行時(shí),Shell將它的進(jìn)程號(hào)PID存入$$變量中。
例9.36從$$變量獲得命令的進(jìn)程號(hào)。
9.4 Shell表達(dá)式
Shell語言支持表達(dá)式計(jì)算。Shell表達(dá)式主要有兩種形式:一種是用于數(shù)值計(jì)算的算術(shù)表達(dá)式,其結(jié)果是數(shù)值;另一種是用于進(jìn)行條件測試或判斷的邏輯表達(dá)式,其結(jié)果是真假值。
9.4.1 數(shù)字運(yùn)算表達(dá)式
與高級(jí)語言中的變量不同,Shell變量只有字符類型,所以只能存放整數(shù)數(shù)字字符串,如“127”等。Shell本身也沒有數(shù)字運(yùn)算的能力,必須借助某些命令來進(jìn)行算術(shù)運(yùn)算。expr就是用來進(jìn)行數(shù)字表達(dá)式計(jì)算的命令。
例9.37expr命令用法示例。
9.4.2 邏輯測試表達(dá)式
除了數(shù)字表達(dá)式的計(jì)算,Shell還支持邏輯表達(dá)式的測試。邏輯表達(dá)式由運(yùn)算符和運(yùn)算對(duì)象組成。執(zhí)行邏輯表達(dá)式測試的命令是test。
表9-8列出了test命令的常用邏輯表達(dá)式。
1. 字符串測試表達(dá)式
例9.38字符串測試。
例9.39含有空格的字符串及空字符串的測試。
2. 數(shù)字測試表達(dá)式
例9.40數(shù)字比較測試。
3. 文件測試表達(dá)式
例9.41文件測試。
例9.42目錄測試。
4. 邏輯測試表達(dá)式
例9.43帶有邏輯運(yùn)算符的表達(dá)式測試。
9.5 Shell控制結(jié)構(gòu)
Shell提供了幾個(gè)專門的內(nèi)部命令來構(gòu)造控制結(jié)構(gòu),用它們可以構(gòu)造出任意的分支與循環(huán)。這些命令可以分為以下幾類: 分支結(jié)構(gòu):if、case; 循環(huán)結(jié)構(gòu):while、until、for; 循環(huán)控制:break、continue; 結(jié)束:return、exit。
9.5.1 條件與條件命令
控制結(jié)構(gòu)需要根據(jù)某個(gè)條件作出控制轉(zhuǎn)向的決策。在Shell語言中,條件是某命令的退出狀態(tài)。當(dāng)命令執(zhí)行成功時(shí),它返回一個(gè)0狀態(tài)(即$?為0),此時(shí)條件為真;若命令失敗,返回一個(gè)非0狀態(tài)(即$?不為0),則此時(shí)條件為假。
用于進(jìn)行條件判斷的命令就稱為條件命令。
9.5.2 分支控制命令
分支控制命令用于控制程序在不同的條件取值下執(zhí)行不同的流程。用于分支控制的命令有if和case,if命令用于兩路分支控制,case命令用于多路分支控制。
1. if命令
2. case命令
用case命令進(jìn)行多路條件測試,結(jié)構(gòu)更清晰。case命令的格式是:
例9.46根據(jù)參數(shù)個(gè)數(shù)進(jìn)行相應(yīng)處理。
例9.47按時(shí)間顯示問候語。
9.5.3 循環(huán)控制命令
循環(huán)控制命令用于重復(fù)執(zhí)行某個(gè)處理過程。Shell提供了3種循環(huán)結(jié)構(gòu)的循環(huán)控制命令,即for、while和until。這些命令既可以用在腳本中,也可以在Shell下直接執(zhí)行。
1. for命令
例9.48循環(huán)處理一組文件。
例9.49循環(huán)處理參數(shù)列表。
2. while命令
while命令的作用是進(jìn)行有條件的循環(huán)控制,當(dāng)條件為真時(shí)執(zhí)行循環(huán)體命令列表,直到條件為假時(shí)結(jié)束。while命令常用于循環(huán)次數(shù)或循環(huán)處理的對(duì)象不夠明確的循環(huán)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年物流企業(yè)預(yù)算執(zhí)行與績效評(píng)估題庫
- 2026年情感主播心理知識(shí)測試題
- 2026年電子競技產(chǎn)業(yè)專業(yè)研究試題及答案
- 2026年電子商務(wù)專業(yè)筆試模擬卷及答案
- 2026年人力資源管理中級(jí)職稱筆試模擬題
- 2026年網(wǎng)絡(luò)教育課程考試練習(xí)題集
- 2026年環(huán)境科學(xué)中的數(shù)據(jù)監(jiān)測與分析認(rèn)證題庫
- 2026年哲學(xué)思想與倫理學(xué)原理考試題
- 2026年藝術(shù)史論中國古代藝術(shù)史實(shí)及理論分析題集
- 2026年環(huán)境科學(xué)與保護(hù)知識(shí)理解測評(píng)題
- CSCO腫瘤相關(guān)靜脈血栓栓塞癥預(yù)防與治療指南(2024)課件
- PICC導(dǎo)管標(biāo)準(zhǔn)維護(hù)流程教案(2025-2026學(xué)年)
- 能源轉(zhuǎn)型展望2025(執(zhí)行摘要)
- 護(hù)士長采血防淤青課件
- 手術(shù)后腹腔出血的護(hù)理
- 煤礦井下安全生產(chǎn)檢查合同協(xié)議2025
- 小學(xué)四年級(jí)英語語法一般現(xiàn)在時(shí)專項(xiàng)練習(xí)
- 2025年及未來5年中國林產(chǎn)化學(xué)產(chǎn)品制造行業(yè)市場深度研究及投資戰(zhàn)略咨詢報(bào)告
- 香港專才移民合同協(xié)議
- 陜煤集團(tuán)運(yùn)銷合同范本
- 招商總監(jiān)薪酬合同范本
評(píng)論
0/150
提交評(píng)論