Shell 基础介绍 [1]
生活随笔
收集整理的這篇文章主要介紹了
Shell 基础介绍 [1]
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文目錄
1.什么是Shell?
2.腳本語言類型
3.其他常用的腳本語句種類
4.Shell腳本的建立和執(zhí)行
5.Shell 變量類型
6.普通變量
7.Shell 特殊重要變量
8.Shell進(jìn)程狀態(tài)變量
9.Parameter Expansion
10.擴(kuò)展:其他變量的替換
11.變量的數(shù)值(整數(shù))計算
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
Shell腳本語言擅長處理純文本類型的數(shù)據(jù),而linux系統(tǒng)中幾乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs等)、絕大多數(shù)啟動文件純文件。就可以利用它在Linux系統(tǒng)中發(fā)揮巨大的作用。
PHP、Python優(yōu)勢在于開發(fā)運(yùn)維工具以及web界面的管理工具,web業(yè)務(wù)的開發(fā)等。處理一鍵軟件安裝、優(yōu)化,報警腳本。常規(guī)業(yè)務(wù)的應(yīng)用等php/python也是能夠做到的。但是開發(fā)效率和復(fù)雜比用shell就差很多了。
vi = 記事本 vim =編輯器emeditor、editplus notepad++ 我們可以制作一個vi=vim的別名 [root@db01 ~]# alias vi='vim' ? [root@db01 ~]# vim /etc/profile export alias 'vi=vim' [root@db01 ~]#./etc/profile
特別提示:注釋盡量不使用中文
查看系統(tǒng)變量 env命令,也可以使用set (顯示的沒有env變量多) [root@www ~]# env HOSTNAME=www TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=125.34.74.615169622 SSH_TTY=/dev/pts/0 USER=root LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: MAIL=/var/spool/mail/root PATH=/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin PWD=/root LANG=en_US.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root CVS_RSH=ssh SSH_CONNECTION=125.34.74.6151696120.25.167.4222 LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env/etc/profile /etc/bashrc /etc/profile.d 需要登陸后初始化或顯示加載內(nèi)容可以把腳本文件放在/etc/profile.d下,設(shè)置可執(zhí)行即可
3、生產(chǎn)環(huán)境 自定義JAVA環(huán)境鞭炮配置實例
環(huán)境變量知識小結(jié):
1、變量名通常要大寫 2、變量可以在自身的shell以及子shell中使用。 3、通過export來定義環(huán)境變量 4、輸出用$變量名,取消用unset變量名 5、書寫定時任務(wù)要注意環(huán)境變量,最好在執(zhí)行的shell腳本中重新定義。 6、如果系統(tǒng)永久生效可以放在用戶環(huán)境變量文件或全局環(huán)境變量文件里。
$*和$@的區(qū)別例子
1.$* 將命令行腳本所有參數(shù)視為單個字符串,等同于”$1$2$3″,”$*“ 要用雙引號
2.$@將命令行腳本每個參數(shù)視為單獨的字符串,等同于”$1″ “$2” “$3″這是將參數(shù)傳遞給其他程序的最佳方式,因為他會保留所有的內(nèi)嵌在每個參數(shù)里的任何空白.
[root@web02 /]#for i in "$*";do echo $i;done
##在有雙引號的情況下"$*"參數(shù)里引號內(nèi)容當(dāng)做一個參數(shù)輸出了!
I am oldboy
[root@web02 /]#for i in "$@";do echo $i;done
##在有雙引號的情況下,每個參數(shù)以獨立的內(nèi)容輸出。
I am?
oldboy 其他:linux下set和eval的使用小案例精彩解答(特殊位置變量用法) [root@db01?scripts]#?cat?q.sh??? echo?$1?$2?$3?$4?$5?$6?$7?$8?$9?${10}?${11}?$12?$13?$14?$15 [root@db01?scripts]#?sh?q.sh?{a..z} a?b?c?d?e?f?g?h?i?j?k?a2?a3?a4?a5 提示:腳本里面的$1就是我們執(zhí)行的第一個參數(shù),例如/etc/init.d/iptables stop ?其中stop相當(dāng)于$1
$0案例 [root@db01 scripts]# cat q.sh ? ? ? ? ? ? ? ? ?
echo $"Usage: $0 {start|stop}"
[root@db01 scripts]#/server/scripts/q.sh start
Usage:/server/scripts/q.sh {start|stop $1 腳本傳參的第一個參數(shù),以此類推 $0 腳本的名字以及路徑 $# 腳本傳參的參數(shù)數(shù)量
例子:$? ?
$? 返回值 0 表示成功 ?[root@db01?scripts]#?cat?q.sh?
#!/bin/sh
.?/etc/init.d/functions
if?[?$#?-ne?1?]
thenecho?$"Usage:?$0?{start|stop}"exit?1
fi
rsync?--daemon
if?[?$??-eq?0?]
thenaction?"oldboy"?/bin/true
fi
exit 1 腳本的返回值,此處的exit 1 可以隨便定義。如果定義為1 $?返回的值就是1 return 1 函數(shù)的返回值
?范例2:應(yīng)用案例:當(dāng)系統(tǒng)中只能有某個腳本同時只能運(yùn)行一個進(jìn)程的時候。 [root@oldboy?day2]#?cat?pid.sh? #!/bin/sh pidpath=/tmp/a.pid if?[?-f?"$pidpath"?]? ??then?kill?-USR2?`cat?$pidpath`?>/dev/null?2>&1rm?-f?$pidpath fi echo?$$?>$pidpath sleep?300 bash內(nèi)置命令(沒有路徑(二進(jìn)制文件)) alias break cd continue declare echo eval exec exit export help history jobs kill let local logout printf pwd read readonly return set shift times trap typeset ulimit umask unalias unset 常用操作如下表:man bash找本節(jié)資料“Parameter Expansion” ${#string} ? ? ? ? ? ? ? ? ? ? ? ? 返回$string的長度 ${string:position} ? ? ? ? ? ? ? ? 在$string中,從位置$position之后開始提取子串 ${string:position:length} ? ? ? ? ?在$string中,從位置$position之后開始提取長度為$length的子串 ${string#substring} ? ? ? ? ? ? ? ?從變量$string開頭開始刪除最短匹配$substring子串 ${string##substring } ? ? ? ? ? ? ?從變量$string開頭開始刪除最長匹配$substring子串 ${string%substring} ? ? ? ? ? ? ? ?從變量$string結(jié)尾開始刪除最短匹配$substring子串 ${string%%substring} ? ? ? ? ? ? ? 從變量$string結(jié)尾開始刪除最長匹配$substring子串 ${parameter/pattern/string} ? ? ? ?使用string,來代替第一個匹配的pattern ${parameter/#pattern/string} ? ? ? 從開頭匹配string變量中的pattern,使用string來替換匹配的pettern ${parameter/%patter/string} ? ? ? ?從結(jié)尾開始匹配string變量中的pattern,就用string來替換匹配pattern ${parameter//pattern/string} ? ? ? 使用string,來代替所有匹配的pattern 更多資料man bansh 查找“Parameter Expansion”
獲取變量字符串的長度 [root@db01?~]#?OLDBOY="I?am?oldboy" [root@db01?~]#?echo?$OLDBOY I?am?oldboy [root@db01?~]#?echo?$OLDBOY|wc?-L 11 [root@db01?~]#?echo?${#OLDBOY} 11 [root@db01?~]#?expr?length?"$OLDBOY"
11
截取OLDBOY變量字符串從第2個字符之后開始取,默認(rèn)取后面字符的全部,第二個字符不包含在內(nèi)。也可以理解為刪除前面多少個字符。
[root@web02 /]# OLDBOY="I am oldboy linux,welcome to our training."
[root@web02 /]# echo $OLDBOY
I am oldboy linux,welcome to our training.
[root@web02 /]# echo ${OLDBOY:2}
am oldboy linux,welcome to our training. 截取OLDBOY變量字符串從第二個字符之后開始取,取2個字符
[root@web02 /]# echo ${OLDBOY:2:2}
am
提示:類似于cut -c參數(shù);
[root@web02 /]# echo ${OLDBOY}|cut -c 1-4
I am
[root@web02 /]# echo ${OLDBOY}|cut -c 3-4
am 從變量$OLDBOY開頭刪除最短匹配”a*C”子串
[root@web02 /]# OLDBOY=abcABC123ABCabc
[root@web02 /]# echo ${OLDBOY#A*c}
abcABC123ABCabc
[root@web02 /]# echo ${OLDBOY#a*c}
ABC123ABCabc
[root@web02 /]# echo ${OLDBOY#a*C}
123ABCabc
[root@web02 /]# echo ${OLDBOY##a*c} [root@db01?~]#?OLDBOY="I?am?oldboy" [root@db01?~]#?echo?${OLDBOY/oldboy/oldgirl} I?am?oldgirl [root@db01?~]#?OLDBOY="I?am?oldboy?oldboy"?? [root@db01?~]#?echo?${OLDBOY/oldboy/oldgirl} I?am?oldgirl?oldboy 小結(jié):
#是開頭刪除匹配最短
##是開頭刪除匹配最長
%是結(jié)尾刪除匹配最短
%%是結(jié)尾刪除匹配最長
[root@MySQL?test]#?cat?del.sh path=/server/backup find?${path:=/tmp/}?-name?"*.tar.gz"?-type?f?|xargs?rm?-f =================== ?path=/server/backup find?${path:=/tmp/}?-name?"*.tar.gz"?-type?f?|xargs?rm?-f [root@MySQL?test]#?cat?del.sh path=/server/backup find?${path:=/tmp/}?-name?"*.tar.gz"?-type?f?|xargs?rm?-f [root@MySQL?test]#?sh?-x?del.sh +?path=/server/backup +?find?/server/backup?-name?'*.tar.gz'?-type?f +?xargs?rm?-f [root@MySQL?test]#?sed?-i?'1d'?del.sh [root@MySQL?test]#?cat?del.sh find?${path:=/tmp/}?-name?"*.tar.gz"?-type?f?|xargs?rm?-f [root@MySQL?test]#?sh?-x?del.sh +?find?/tmp?-name?'*.tar.gz'?-type?f +?xargs?rm?-f #rm?-fr?${path:=/tmp/}
變量a在前,表達(dá)式的值為a,然后a自增或自減,變量a在符號后,表達(dá)式值自增或自減,然后a值自增或自減 [root@db01?~]#?a=$((100*(100+1)/2))? [root@db01?~]#?echo?$a 5050
??????????????anchored?pattern?match?of?REGEXP?in?STRING
1.什么是Shell?
Shell是一個命令解釋器,它在操作系統(tǒng)的最外層,負(fù)載直接與用戶對話,把用戶的輸入解釋給操作系統(tǒng),并處理各種各樣的操作系統(tǒng)的輸出結(jié)果,輸出到屏幕并返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應(yīng)),或非交互式(執(zhí)行腳本程序)的方式。 圖解: 當(dāng)linux命令或語句不在命令行下執(zhí)行(嚴(yán)格說,命令行執(zhí)行的語句也是shell腳本),而是通過一個程序文件執(zhí)行時,該程序就被稱為shell腳本或shell程序,shell程序很類似DOS系統(tǒng)下的批處理程序。這些命令、變量和流程控制語句結(jié)合起來就形成了一個功能強(qiáng)大的shell腳本。簡單的小腳本
? #!/bin/bash# 清除日志腳本, 版本 2LOG_DIR=/var/logROOT_UID=0 ? ? # $UID為0的時候,用戶才具有root用戶的權(quán)限 # 要使用root用戶來運(yùn)行,因此,對當(dāng)前用戶進(jìn)行判斷,不合要求給出友好提示,并終止程序運(yùn)行。if["$UID"-ne "$ROOT_UID"] thenecho "Must be root to run this script."exit 1 ? fi # 如果切換到指定目錄不成功,給出提示,并終止程序運(yùn)行。 cd $LOG_DIR ||{echo "Cannot change to necessary directory.">&2exit 1} # 經(jīng)過上述兩個判斷后,此處的用戶權(quán)限和路徑就應(yīng)該是對的了,只有清空成功,才打印成功提示。cat /dev/null > messages &&{ echo "Logs cleaned up."exit 0 ?# 退出之前返回0表示成功. 返回1表示失敗。 } echo "Logs cleaned up fail."exit 1 1.必須是root才能執(zhí)行腳本,否則給出友好提示并終止程序運(yùn)行 2.成功切換目錄(cd/var/log),否則給出友好提示并終止運(yùn)行 3.清理日志(cat /dev/null >messages)清理成功,給出正確提示 4.給出相應(yīng)提示(echo 輸出)Shell腳本語言擅長處理純文本類型的數(shù)據(jù),而linux系統(tǒng)中幾乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs等)、絕大多數(shù)啟動文件純文件。就可以利用它在Linux系統(tǒng)中發(fā)揮巨大的作用。
2.腳本語言類型
2.1 Shell腳本語言的種類
在UNIX/LINUX中主要由兩大類shell 1.Bourne shell(包括sh、ksh、bash) Bourne shell (sh) Korn shell (ksh) Bourne Again shell (bash) POSIX shell (sh) 2. Cshell (包括csh、tcsh) C shell (csh) TENEX/TOPS C shell (tcsh) Shell腳本語言是弱類型語言,較為通用的shell有標(biāo)準(zhǔn)的Bourne shell (sh)和C shell (csh)。其中Bourne shell (sh)已經(jīng)被bash shell取代,但是我們還是習(xí)慣稱之為sh。 ?查看Centos6 系統(tǒng)SHELL情況: [root@web02 ~]# cat /etc/shells? /bin/sh??<==黃色標(biāo)記為重點 /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh Linux系統(tǒng)中的主流shell是Bash,它是Bourne Again Shell的縮寫,Bash是由Bourne Shell(sh)發(fā)展而來的,但Bash與sh稍有不同,它還包含了csh和ksh的特色,但大多數(shù)腳本可以不加修改地在sh上運(yùn)行3.其他常用的腳本語句種類
3.1 PHP
PHP是網(wǎng)頁程序,也是腳本語言。是一款更專注于web頁面開發(fā)(前端展示)的腳本語言,例如:Dedecms,discuz。PHP程序也可以處理系統(tǒng)日志,配置文件等,php也可以調(diào)用系統(tǒng)命令。3.2 Perl
Perl腳本語言。比shell腳本強(qiáng)大很多,語法靈活、復(fù)雜,實現(xiàn)方式很多,不易讀,團(tuán)隊協(xié)作困難,但仍不失為很好的腳本語言,存世大量的程序軟件。MHA高可用Perl寫的3.3 Python
Python,不但可以做腳本程序開發(fā),也可以實現(xiàn)web程序以及軟件的開發(fā)。近兩年越來越多的公司都會要求會Python。Shell腳本與php/perl/python語言的區(qū)別和優(yōu)勢?
shell腳本的優(yōu)勢在于處理操作系統(tǒng)底層的業(yè)務(wù)(linux系統(tǒng)內(nèi)部的應(yīng)用都是shell腳本完成)因為有大量的linux系統(tǒng)命令為它做支撐。2000多個命令都是shell腳本編程的有力支撐,特別是grep、awk、sed等。例如:一鍵軟件安裝、優(yōu)化、監(jiān)控報警腳本,常規(guī)的業(yè)務(wù)應(yīng)用,shell開發(fā)更簡單快速,符合運(yùn)維的簡單、易用、高效原則PHP、Python優(yōu)勢在于開發(fā)運(yùn)維工具以及web界面的管理工具,web業(yè)務(wù)的開發(fā)等。處理一鍵軟件安裝、優(yōu)化,報警腳本。常規(guī)業(yè)務(wù)的應(yīng)用等php/python也是能夠做到的。但是開發(fā)效率和復(fù)雜比用shell就差很多了。
常用操作系統(tǒng)的默認(rèn)shell
1.Linux是Bourne Again shell(bash) 2.Solaris和FreeBSD缺省的是Bourne shell(sh) 3.AIX下是Korn Shell(ksh) 4.HP-UX缺省的是POSIX shell(sh) 提示:比較常用和充電的是Bourne Again shell(bash)查看Centos默認(rèn)bash?
[root@db01 ~]# echo $SHELL /bin/bash [root@db01 ~]# echo shell shell [root@db01 ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash 修改創(chuàng)建用戶默認(rèn)配置文件路徑 [root@db01 ~]# cat /etc/default/useradd? # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yesShell腳本的建立和執(zhí)行
1.1 shell腳本的建立
在Linux系統(tǒng)中,shell腳本(bash shell程序)通常是在編輯器(vi/vim)中編寫,由Unix/Linux命令、bash shell命令、程序結(jié)構(gòu)控制語句和注釋等內(nèi)容組成。vi = 記事本 vim =編輯器emeditor、editplus notepad++ 我們可以制作一個vi=vim的別名 [root@db01 ~]# alias vi='vim' ? [root@db01 ~]# vim /etc/profile export alias 'vi=vim' [root@db01 ~]#./etc/profile
1.2 腳本開頭(第一行)
一個規(guī)范的shell腳本在腳本第一行會指出由那個程序(解釋器)來執(zhí)行腳本中的內(nèi)容,這一行內(nèi)容在linux bash編程中一般為: #!/bin/bash or #!/bin/sh <==255字符以內(nèi) 其中開頭的”#!”字符又稱為幻數(shù),在執(zhí)行bash腳本的時候,內(nèi)核會根據(jù)”#!”后的解釋器來確定該用那個程序解釋這個腳本中的內(nèi)容。注意:這一行必須在每個腳本頂端的第一行,如果不是第一行則為腳本注釋行。 [root@web02 tmp]# cat 1.sh #!/bin/bash echo "123" #!/bin/sh??<==代表注釋 echo "456" ?sh和bash的區(qū)別 早期的Bash與sh稍有不同,它還包含了csh和ksh的特色,但大多數(shù)腳本都可以不加修改地在sh上運(yùn)行 [root@web02 /]# ll /bin/sh? lrwxrwxrwx.1 root root 4May ?104:26/bin/sh -> bash [root@web02 /]# ll /bin/bash? -rwxr-xr-x 1 root root 941720Jul24 ?2015/bin/bash 企業(yè)面試題案例一:Centos Linux系統(tǒng)默認(rèn)的shell是() 解答:bash 查看方法1: [root@web02 ~]# echo $shell bash [root@web02 ~]# echo $SHELL /bin/bash 查看方法2: [root@web02 ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash 提示:結(jié)尾的/bin/bash就是shell解釋器1.3 腳本注釋
在shell腳本中,跟在(#)井號后面的內(nèi)容表示注釋,用來對腳本進(jìn)行注釋說明,注釋部分不會被當(dāng)做程序執(zhí)行,僅僅給用戶看,系統(tǒng)解析器是看不到,更不會執(zhí)行。特別提示:注釋盡量不使用中文
1.4 Shell腳本的執(zhí)行
當(dāng)shell腳本運(yùn)行時,它會先查找系統(tǒng)環(huán)境變量ENV,改變量指定了環(huán)境文件(通常是~./bashrc,~./bash_profile,/etc/bashrc,/etc/profile等)然后從該環(huán)境變量文件開始執(zhí)行腳本,當(dāng)讀取了ENV的文件后,shell才會開始執(zhí)行shell腳本中的內(nèi)容 特殊技巧:設(shè)置crond任務(wù)時,最好把系統(tǒng)環(huán)境變量在定時腳本中重新定義,否則,一些系統(tǒng)環(huán)境變量不會被夾在。 ?Shell 腳本的執(zhí)行通常可以采用以下幾種方式: 1.bash script-name或sh script-name(推薦使用) 2.path/script-name或./script-name(當(dāng)前路徑下執(zhí)行腳本) ###<==此項需要腳本有執(zhí)行權(quán)限 3.source script-name 或. script-name #<==注意”.”點號和后面字符之間有空格。 4.sh <script-name 或 cat script-name|sh(同樣適合bash) 全路徑執(zhí)行如果不加命令全路徑會沒有權(quán)限 /server/scripts/abc.sh 權(quán)限不夠 /bin/sh /server/scripts/abc.sh ?可以執(zhí)行 提示: 第三種方法通常是使用source或者”.”點號讀入或加載指定的shell腳本文件(如san.sh),然后,依次執(zhí)行指定shell腳本文件san.sh 中的所有語句。這些語句將作為當(dāng)前父shell腳本運(yùn)行。 source或者”.”點號命令的功能是在當(dāng)前shell中執(zhí)行source或者”.”點號加載并執(zhí)行相關(guān)腳本文件中的命令以及語句,而不是產(chǎn)生一個字shell來執(zhí)行命令文件中的命令。 腳本里面的內(nèi)容是無法和外面的變量溝通,但是外面的變量在腳本里面是可以引用的。 如果想在腳本里面的變量引用到命令行需要使用source or .Shell 變量類型
變量可以分為兩類:環(huán)境變量(全局變量)和普通變量(局部變量)。 環(huán)境變量也可稱為全局變量,可以在創(chuàng)建他們的Shell及其派生出來的任意子進(jìn)程shell中使用,環(huán)境變量又可分為自定義環(huán)境變量和Bash內(nèi)置的環(huán)境變量 普通變量也可稱為局部變量,只能在創(chuàng)建他們的Shell函數(shù)或Shell腳本中使用。普通變量一般是由開發(fā)者用戶開發(fā)腳本程序時創(chuàng)建的。環(huán)境變量
環(huán)境變量一般用于定義Shell的運(yùn)行環(huán)境,保證Shell命令的正確執(zhí)行,Shell通過環(huán)境變量來確定登錄用戶、命令路徑、終端類型、登錄目錄等,所有的環(huán)境變量都是系統(tǒng)全局變量,可用于所有子進(jìn)程,這包括編輯器,Shell腳本和各類應(yīng)用(crond任務(wù)必須比較特殊) 環(huán)境變量可以在命令行中設(shè)置創(chuàng)建,但用戶退出命令行時這些變量值就會丟失,因此,如果希望永久保存環(huán)境變量,可在用戶家目錄下的.bash_profile或.bashrc文件中或全局配置/etc/bashrc/或/etc/profile 文件或者/etc/profile.d中定義。將環(huán)境變量放入上述的文件中,每次用戶登錄時這些變量值都將被初始化一次 有一些環(huán)境變,比如HOME、PATH、UID、USER等,在用戶登陸之前就已經(jīng)被/bin/login 程序設(shè)置好了。通常環(huán)境變量定義保存在用戶家目錄下的.bash_profile文件或者全局的配置文件/etc/profile中。查看系統(tǒng)變量 env命令,也可以使用set (顯示的沒有env變量多) [root@www ~]# env HOSTNAME=www TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=125.34.74.615169622 SSH_TTY=/dev/pts/0 USER=root LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: MAIL=/var/spool/mail/root PATH=/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin PWD=/root LANG=en_US.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root CVS_RSH=ssh SSH_CONNECTION=125.34.74.6151696120.25.167.4222 LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env
自定義環(huán)境變量
? ??? ? 設(shè)置環(huán)境變量
如果想設(shè)置環(huán)境變量,就要給在變量賦值之后或設(shè)置變量時使用export命令。帶-x選項的declare內(nèi)置命令也可完成同樣的功能。 格式: 1.export變量名=value 2.變量名=value;export變量名 3.declare-x 變量名=value 提示:以上為三種設(shè)置環(huán)境變量的方法 例: export NAME=oldboy declare -x NAME=oldboy NAME=oldboy;export NAME讓環(huán)境變量永久生效的常用設(shè)置文件及區(qū)別
1、用戶的變量變量配置: [root@www ~]# ls /root/.bashrc? /root/.bashrc [root@www ~]# ls /root/.bash_profile? /root/.bash_profile 提示:用戶的環(huán)境變量設(shè)置常見的為用戶家目錄下的.bashrc和.bash_profile 2、全局環(huán)境變量的配置 全局環(huán)境的配置文件常見的配置文件為1.1 普通變量
1.1.1 定義本地變量
本地變量在用戶當(dāng)前的Shell生存期的腳本中使用。例如,本地變量OLDBOY取值為bingbing,這個值在用戶當(dāng)前Shell生存期中有意義。如果在Shell中啟動另一個進(jìn)程或退出,本地變量值將無效 1. 普通變量定義**** 變量名=value? ? #<==賦值時不加引號 變量名=’value’ ?#<==賦值時加單引號 變量名=”value” ?#<==賦值時加雙引號 2.Shell中定義變量名及給變量內(nèi)容賦值的要求 變量名一般是由字母、數(shù)字、下劃線組成,可以字母或下劃線開頭 abc,abc123,abc_123 變量的內(nèi)容可以使用單引號或雙引號引起來,也可不加引號,但是這三者是不同的。 3. 普通變量定義及輸出的不同例子 [root@web02 ~]# a=1 [root@web02 ~]# b='2' [root@web02 ~]# c="3" [root@web02 ~]# echo "$a" 1 [root@web02 ~]# echo "$b" 2 [root@web02 ~]# echo "${c}" 3 提示:$變量名表示輸出變量,可以用$c和${c}兩種用法 小結(jié):連續(xù)普通字符串內(nèi)容賦值給變量,不管用什么引號或者不用引號,它的內(nèi)容是什么,打印變量就輸出什么 4.例子2 [root@db01?scripts]#?a=192.168.1.2 [root@db01?scripts]#?b='192.168.1.2' [root@db01?scripts]#?c="192.168.1.2" [root@db01?scripts]#?echo?"a=$a" a=192.168.1.2 [root@db01?scripts]#?echo?"b=$b" b=192.168.1.2 [root@db01?scripts]#?echo?"c=${c}" c=192.168.1.2 ============================================ [root@db01?scripts]#?a=192.168.1.2-$a [root@db01?scripts]#?b='192.168.1.2-$a' [root@db01?scripts]#?c="192.168.1.2-$a" [root@db01?scripts]#?echo?"a=$a" a=192.168.1.2-192.168.1.2 [root@db01?scripts]#?echo?"b=$b" b=192.168.1.2-$a [root@db01?scripts]#?echo?"c=${c}" c=192.168.1.2-192.168.1.2-192.168.1.2 小結(jié):數(shù)字內(nèi)容變量定義可不加引號,其他沒有特別要求的字符串等定義最好都加上雙引號,確實真的需要原因輸出的的就加單引號。1.2 把一個命令的結(jié)果作為變量的定義方法
獲取命令結(jié)果的變量內(nèi)容寫法常見的有兩種: 變量名=`ls`?? ??? ? #<==命令用反引號引起來 變量名=$(ls)? ??? ?#<==命令用$()括起來自定義普通字符串變量
(1)內(nèi)容是純數(shù)字,簡單連續(xù)字符(內(nèi)容中不帶任何空格)此時定義方式可以不加任何引號 a.OldboyAge=33 b.NETWORD=yes (2)沒特殊情況時,字符串一律用雙引號定義,特別是多個字符串中間由空格時 a.NFS_MODULE="no load" b.MyName="Good game" (3)當(dāng)變量里內(nèi)容需要原樣輸出時,要用單引號”,這樣的需求極少 a.HOST_NAME=’OCALHOST’ 提示: 1、變量名只能為字母、數(shù)字、下劃線,只能以字母或下劃線開頭 2、規(guī)范的命令名寫法要見名如意。 1)OldboyAge=1 ?#每個單詞的首字母大寫 2)oldboy_age=1#單詞之間用“_” 3)oldboyAgeSex=1#駝峰語法:首個單詞的首字母小寫,其余單詞首字母大寫 4)OLDBOY=1#單詞全大寫1.3 變量定義的完整小結(jié):
(1)普通變量內(nèi)容的定義: 1.連續(xù)的數(shù)字或字符串,可以不加引號,例如a=123 2.變量內(nèi)容很多,還希望解析變量,就加雙引號,例如a=”/etc/rc.local $USER”,會對內(nèi)容中的USER解析輸出 3.希望原樣輸出就用單引號,例如:a=’$USER’ (2)希望編譯內(nèi)容是命令得解析結(jié)果的定義: 1.反引號括起來,例如:a=`ls` 2.或者$()括起來,例如:a=$(ls) (3)變量的輸出方法: 使用$變量名輸出變量內(nèi)容,常用echo $變量名1.4 變量定義的小結(jié)技巧:
1、注意命令變量定義前后的字符“ 例如”CMD=`ls`” 2、在變量名前加$,可以取得該變量的值,使用echo或printf命令可以顯示變量的值,$A和${A}的寫法不同,但功能是一樣的。 3、用echo等命令輸出變量的時候,也有單引號、雙引號、反引號的形式。 4、$dbname_tname,若變量后面有其他字符連接的時候,就必須給變量加上大括號{} 例如:$dbname_tname就要改寫成${dbname}_tname 5、養(yǎng)成所有字符串變量用雙引號括起來使用的習(xí)慣,將會減少很多編程時遇到的問題。 有關(guān)shell變量定義及變量輸出單引號、雙引號不加引號的簡要說明如下| 名稱 | 解釋 |
| 單引號 | 所見即所得,輸出時會將單引號內(nèi)的所有內(nèi)容都原樣輸出。 |
| 雙引號 | 把雙引號內(nèi)的所有內(nèi)容輸出出來:如果內(nèi)容中有命令(要反引)變量特殊字符等,會先把變量、命令解析出來,然后在輸出最終內(nèi)容來。 |
| 無引號 | 把內(nèi)容輸出出來,會將含有空格的字符串視為一個整體輸出, |
| 反引號 | 一般用于引用命令,執(zhí)行的時候命令會被執(zhí)行,相當(dāng)于$() |
1.5 特殊例子:awk調(diào)用shell變量引號例子
[root@db01?scripts]#?ETT=123 [root@db01?scripts]#?awk?'BEGIN?{print?"$ETT"}' $ETT [root@db01?scripts]#?awk?'BEGIN?{print?'$ETT'}' 123 [root@db01?scripts]#?awk?'BEGIN?{print?$ETT}' 一道實用linux運(yùn)維問題的9種shell解答方法(http://oldboy.blog.51cto.com/2561410/760192)Shell 特殊重要變量
1.1 Shell特殊位置變量| $0 獲取當(dāng)前執(zhí)行的shell腳本文件名,如果執(zhí)行腳本帶路徑那么久包括腳本路徑。 |
| $n 獲取當(dāng)前執(zhí)行的shell腳本的第n個參數(shù)值。如果n大于9,需要用大括號括起來${10} |
| $* 獲取當(dāng)前shell腳本的所有傳參的參數(shù),將所有的字符視為單個字符,相當(dāng)于”$1$2$3$4″ |
| $# 獲取當(dāng)前執(zhí)行的shell腳本后面接的參數(shù)的總個數(shù) |
| $@ 這個程序的所有參數(shù) “$1” “$2” “#3″,這是將參數(shù)傳遞給其他程序的最佳方式,因為他會保留所有內(nèi)嵌在每個參數(shù)里的任何空白,”$@”和”$*”都要加雙引號 |
| 提示:$*和$@了解即可 |
http://oldboy.blog.51cto.com/2561410/1175971
范例1:$n的實踐例子 [root@web02 /]# cat p.sh? #!/bin/bash echo $1 [root@web02 /]# sh p.sh good #傳一個字符串參數(shù) good [root@web02 /]# sh p.sh good good #傳2個字符串參數(shù),第二個不會接受,$1只顯示第一個 good [root@web02 /]# sh p.sh "good good" #加引號括起來表示為一個字符串參數(shù) good good 測試 26的英文字符Shell進(jìn)程狀態(tài)變量
$$ 獲取當(dāng)前shell腳本的進(jìn)程號(PID) $! 執(zhí)行上一個指令的PID $? 獲取上一個指令的返回值(0為成功,非0為失敗) $_ 在此之前執(zhí)行的命令或腳本的最后一個參數(shù) 提示:查找知道方法:man bash,然后搜索Special Parameters.?范例2:應(yīng)用案例:當(dāng)系統(tǒng)中只能有某個腳本同時只能運(yùn)行一個進(jìn)程的時候。 [root@oldboy?day2]#?cat?pid.sh? #!/bin/sh pidpath=/tmp/a.pid if?[?-f?"$pidpath"?]? ??then?kill?-USR2?`cat?$pidpath`?>/dev/null?2>&1rm?-f?$pidpath fi echo?$$?>$pidpath sleep?300 bash內(nèi)置命令(沒有路徑(二進(jìn)制文件)) alias break cd continue declare echo eval exec exit export help history jobs kill let local logout printf pwd read readonly return set shift times trap typeset ulimit umask unalias unset 常用操作如下表:man bash找本節(jié)資料“Parameter Expansion” ${#string} ? ? ? ? ? ? ? ? ? ? ? ? 返回$string的長度 ${string:position} ? ? ? ? ? ? ? ? 在$string中,從位置$position之后開始提取子串 ${string:position:length} ? ? ? ? ?在$string中,從位置$position之后開始提取長度為$length的子串 ${string#substring} ? ? ? ? ? ? ? ?從變量$string開頭開始刪除最短匹配$substring子串 ${string##substring } ? ? ? ? ? ? ?從變量$string開頭開始刪除最長匹配$substring子串 ${string%substring} ? ? ? ? ? ? ? ?從變量$string結(jié)尾開始刪除最短匹配$substring子串 ${string%%substring} ? ? ? ? ? ? ? 從變量$string結(jié)尾開始刪除最長匹配$substring子串 ${parameter/pattern/string} ? ? ? ?使用string,來代替第一個匹配的pattern ${parameter/#pattern/string} ? ? ? 從開頭匹配string變量中的pattern,使用string來替換匹配的pettern ${parameter/%patter/string} ? ? ? ?從結(jié)尾開始匹配string變量中的pattern,就用string來替換匹配pattern ${parameter//pattern/string} ? ? ? 使用string,來代替所有匹配的pattern 更多資料man bansh 查找“Parameter Expansion”
獲取變量字符串的長度 [root@db01?~]#?OLDBOY="I?am?oldboy" [root@db01?~]#?echo?$OLDBOY I?am?oldboy [root@db01?~]#?echo?$OLDBOY|wc?-L 11 [root@db01?~]#?echo?${#OLDBOY} 11 [root@db01?~]#?expr?length?"$OLDBOY"
生產(chǎn)案例:
httpd=${HTTPD-/usr/sbin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 STOP_TIMEOUT=${STOP_TIMEOUT-10} 企業(yè)場景例子:盡量不要使用rm擴(kuò)展:其他變量的替換
變量替換表:了解,man bash查到資料Parameter Expansion變量的數(shù)值(整數(shù))計算
? ? 變量的數(shù)值計算常見的有如下幾個命令: (())、let、expr、bc(小數(shù))、$[],其他都是整數(shù)。 如果要執(zhí)行簡單的整數(shù)運(yùn)算,只需將特定的算術(shù)表達(dá)式用”$((“和”))” 括起來即可。 shell的算術(shù)運(yùn)算符號常置于”$((“……”))”的語法中。這一語法如同雙引號的功能1)(())用法:(此方法很常用)
范例:shell的算術(shù)運(yùn)算實例如下: [root@db01?~]#?((a=1+2**3-4%3)) [root@db01?~]#?echo?$a 8 [root@db01?~]#?((a=1+2**3-4%3)) [root@db01?~]#?echo?$a 8 [root@db01?~]#?echo?$((1+2**3-4%3)) 8 記憶方法:++,–變量a在前,表達(dá)式的值為a,然后a自增或自減,變量a在符號后,表達(dá)式值自增或自減,然后a值自增或自減 [root@db01?~]#?a=$((100*(100+1)/2))? [root@db01?~]#?echo?$a 5050
范例6:這是一個實踐考試題,內(nèi)容如下:
把a(bǔ),b兩個變量通過命令行腳本傳參的方式實現(xiàn)上面混合運(yùn)算腳本的功能 第一種方法: #!/bin/bash a=6 b=2 echo?"a-b?=$((?$a?-?$b?))" echo?"a+b?=$((?$a?+?$b?))" echo?"a*b?=$((?$a?*?$b?))" echo?"a/b?=$((?$a?/?$b?))" echo?"a**b?=$((?$a?**?$b?))" echo?"a%b?=$((?$a?%?$b?))" 第二種方法: [root@web02 ~]# cat abc.sh #!/bin/bash a=$1 b=$2 echo "a-b =$(( $a - $b ))" echo "a+b =$(( $a + $b ))" echo "a*b =$(( $a * $b ))" echo "a/b =$(( $a / $b ))" echo "a**b =$(( $a ** $b ))" echo "a%b =$(( $a % $b ))"2)let命令的用法(整數(shù))
格式: let 賦值表達(dá)式 【注】let賦值表達(dá)式功能等同于:((賦值表達(dá)式)) 范例1:給自變量i加8 [root@db01?scripts]#?i=2???? [root@db01?scripts]#?let?i=i+8 [root@db01?scripts]#?echo?$i?? 10?3)expr (evaluate(求值)expressions(表達(dá)式))命令的用法:
expr命令一般用于整數(shù)值,但也可用于字符串,用來求表達(dá)式變量的值,同時expr也是一個手工命令計算器 1.計算 語法:expr Expression [root@web02 /]# expr 2+2 4 [root@web02 /]# expr 2-2 0 [root@web02 /]# expr 2*2 expr: syntax error ?語法錯誤 [root@web02 /]# expr 2 \* 2 4 [root@web02 /]# expr 3/2 1 [root@web02 /]# expr 3%2 1 另一種玩法 [root@db01?scripts]#?i=0 [root@db01?scripts]#?i=`expr?$i?+?1` [root@db01?scripts]#?echo?$i 1? expr $[$a+$b] 表達(dá)式形式,其中$a $b 可為整數(shù)值 [root@web02 /]# expr $[2+3] 5 [root@web02 /]# expr $[2*3] 6 [root@web02 /]# expr $[2**3]? ??? ? 2的2次方*3 8 [root@web02 /]# expr $[2/3] 0 [root@web02 /]# expr $[2%3] 2 四種運(yùn)算方法: 1.(()) 2.let 3.expr 4.[] 整數(shù) 判斷一個文件的擴(kuò)展名是不是pub ?(發(fā)送公鑰的命令就是使用此參數(shù)) ?#!/bin/sh if?expr?"$1"?:?".*\.pub"?&>/dev/null ??then?echo?"you?are?using?$1" elseecho?"pls?use?*.pub?file" fi? [root@web02 ~]# sh aaa.sh oldboy pls use *.pub file [root@web02 ~]# sh aaa.sh oldboy.pub you are using oldboy.pub STRING?:?REGEXP??????????????anchored?pattern?match?of?REGEXP?in?STRING
判斷一個輸入是不是數(shù)字
?#!/bin/sh while?true doread??-p?"Pls?input:"?aexpr?$a?+?0?>/dev/null?2>&1[?$??-eq?0?]?&&echo?int||echo?chars done 如果判斷是不是數(shù)字,就執(zhí)行錯誤shars [root@db01?scripts]#?cat?b.sh? #!/bin/sh expr?$1?+?1?>/dev/null?2>&1 [?$??-eq?0?]?&&echo?int||echo?chars [root@db01?scripts]#?sh?b.sh??1 int [root@db01?scripts]#?sh?b.sh??1a chars [root@db01?scripts]#?sh?b.sh??100 int [root@db01?scripts]#?sh?b.sh??100abc charsexpr match 整數(shù)判斷
[[?`expr?match?"$a"?"[0-9][0-9]*$"`?==?0?]]?&&?{echo?"the?first?is?not?a?num"exit?3 }計算變量長度
[root@db01 scripts]# a="oldboy" [root@db01 scripts]# expr length "$a" 6expr功能
1.整數(shù)計算 2.判斷擴(kuò)展名 3.判斷輸入是否為整數(shù) 4.計算變量的長度 [root@db01?scripts]#?bc bc?1.06.95 Copyright?1991-1994,?1997,?1998,?2000,?2004,?2006?Free?Software?Foundation,?Inc. This?is?free?software?with?ABSOLUTELY?NO?WARRANTY. For?details?type?`warranty'.? 1+1 2 1+3 4 6*8 48 另一種使用bc的方式 [root@db01?scripts]#?echo?1+2|bc 3 [root@db01?scripts]#?echo?8-2|bc 6 inux下的bc命令可以設(shè)置結(jié)果的位數(shù),通過?scale. [root@db01?scripts]#?echo?"scale=3;5.23?/?3.13"|bc 1.670 [root@db01?scripts]#?echo?"scale=2;5.23?/?3.13"|bc? 1.67 比如: $?echo?"scale=4;?1.2323293128?/?1.1"?|?bc?-l 1.1202 bc命令簡單的算法 [root@web02 ~]# i=2 [root@web02 ~]# i=`echo $i+1|bc` [root@web02 ~]# echo $i 3 可以做加法計算 [root@web02 ~]# echo 3.5+5 3.5+5 [root@web02 ~]# echo 3.5+5|bc 8.5 減法計算 [root@web02 ~]# echo 3.5-5|bc -1.5 乘法計算 [root@web02 ~]# echo 3.5*5|bc 17.5 保留位數(shù)(bc的用處不大) [root@web02 ~]# echo "scale=2; 3.5*5.1"|bc 17.85 [root@web02 ~]# echo "scale=2; 3*5"|bc 15 [root@web02 ~]# echo "scale=1; 3*5"|bc 15 提示:bc是特有的小數(shù)計算 awk也可以進(jìn)行小數(shù)計算 [root@web02 ~]# echo "5.5 5.6" |awk '{print ($2-$1)}' 0.1 [root@web02 ~]# echo "5.5 5.5" |awk '{print ($2+$1)}' 11 范例:通過一條命令計算輸出1+2+3+…+10的表達(dá)式,并計算出結(jié)果,使用bc計算 輸出內(nèi)容如:1+2+3+4+5+6+7+8+9+10=55 第一種方法: [root@web02 ~]# seq -s "+"" "10 1+2+3+4+5+6+7+8+9+10 [root@web02 ~]# echo `seq -s "+"" "10`=`seq -s "+"" "10|bc` 1+2+3+4+5+6+7+8+9+10=55 第二種方法: [root@web02 ~]# echo {1..10}|tr " ""+" 1+2+3+4+5+6+7+8+9+10 [root@web02 ~]# echo `echo {1..10}|tr " ""+"`=`echo {1..10}|tr " ""+"|bc` 1+2+3+4+5+6+7+8+9+10=55 更多方法:因計算不是重點,所以我們不重點研究。 特點:bc的獨有特點是支持小數(shù)運(yùn)算,當(dāng)然也可以整數(shù)運(yùn)算。typeset命令的用法
使用整數(shù)變量進(jìn)行計算 例如: [root@web02 ~]# typeset -i A=1 B=3 [root@web02 ~]# A=A+B [root@web02 ~]# echo $A 4 小結(jié): shell的數(shù)值運(yùn)算方法: expr、(())、let、bc、$[]、awk typeset總結(jié)
以上是生活随笔為你收集整理的Shell 基础介绍 [1]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyhton 读取目录下所有文件夹下的文
- 下一篇: Yolo-将coco数据集中的json文