日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Shell 基础介绍 [1]

發(fā)布時(shí)間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shell 基础介绍 [1] 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文目錄 1.什么是Shell? 2.腳本語(yǔ)言類型 3.其他常用的腳本語(yǔ)句種類 4.Shell腳本的建立和執(zhí)行 5.Shell 變量類型 6.普通變量 7.Shell 特殊重要變量 8.Shell進(jìn)程狀態(tài)變量 9.Parameter Expansion 10.擴(kuò)展:其他變量的替換 11.變量的數(shù)值(整數(shù))計(jì)算 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

1.什么是Shell?

Shell是一個(gè)命令解釋器,它在操作系統(tǒng)的最外層,負(fù)載直接與用戶對(duì)話,把用戶的輸入解釋給操作系統(tǒng),并處理各種各樣的操作系統(tǒng)的輸出結(jié)果,輸出到屏幕并返回給用戶。這種對(duì)話方式可以是交互的方式(從鍵盤(pán)輸入命令,可以立即得到shell的回應(yīng)),或非交互式(執(zhí)行腳本程序)的方式。 圖解: 當(dāng)linux命令或語(yǔ)句不在命令行下執(zhí)行(嚴(yán)格說(shuō),命令行執(zhí)行的語(yǔ)句也是shell腳本),而是通過(guò)一個(gè)程序文件執(zhí)行時(shí),該程序就被稱為shell腳本或shell程序,shell程序很類似DOS系統(tǒng)下的批處理程序。這些命令、變量和流程控制語(yǔ)句結(jié)合起來(lái)就形成了一個(gè)功能強(qiáng)大的shell腳本。

簡(jiǎn)單的小腳本

? #!/bin/bash# 清除日志腳本, 版本 2LOG_DIR=/var/logROOT_UID=0 ? ? # $UID為0的時(shí)候,用戶才具有root用戶的權(quán)限 # 要使用root用戶來(lái)運(yùn)行,因此,對(duì)當(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)過(guò)上述兩個(gè)判斷后,此處的用戶權(quán)限和路徑就應(yīng)該是對(duì)的了,只有清空成功,才打印成功提示。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腳本語(yǔ)言擅長(zhǎng)處理純文本類型的數(shù)據(jù),而linux系統(tǒng)中幾乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs等)、絕大多數(shù)啟動(dòng)文件純文件。就可以利用它在Linux系統(tǒng)中發(fā)揮巨大的作用。

2.腳本語(yǔ)言類型

2.1 Shell腳本語(yǔ)言的種類

在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腳本語(yǔ)言是弱類型語(yǔ)言,較為通用的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)記為重點(diǎn) /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh Linux系統(tǒng)中的主流shell是Bash,它是Bourne Again Shell的縮寫(xiě),Bash是由Bourne Shell(sh)發(fā)展而來(lái)的,但Bash與sh稍有不同,它還包含了csh和ksh的特色,但大多數(shù)腳本可以不加修改地在sh上運(yùn)行

3.其他常用的腳本語(yǔ)句種類

3.1 PHP

PHP是網(wǎng)頁(yè)程序,也是腳本語(yǔ)言。是一款更專注于web頁(yè)面開(kāi)發(fā)(前端展示)的腳本語(yǔ)言,例如:Dedecms,discuz。PHP程序也可以處理系統(tǒng)日志,配置文件等,php也可以調(diào)用系統(tǒng)命令。

3.2 Perl

Perl腳本語(yǔ)言。比shell腳本強(qiáng)大很多,語(yǔ)法靈活、復(fù)雜,實(shí)現(xiàn)方式很多,不易讀,團(tuán)隊(duì)協(xié)作困難,但仍不失為很好的腳本語(yǔ)言,存世大量的程序軟件。MHA高可用Perl寫(xiě)的

3.3 Python

Python,不但可以做腳本程序開(kāi)發(fā),也可以實(shí)現(xiàn)web程序以及軟件的開(kāi)發(fā)。近兩年越來(lái)越多的公司都會(huì)要求會(huì)Python。

Shell腳本與php/perl/python語(yǔ)言的區(qū)別和優(yōu)勢(shì)?

shell腳本的優(yōu)勢(shì)在于處理操作系統(tǒng)底層的業(yè)務(wù)(linux系統(tǒng)內(nèi)部的應(yīng)用都是shell腳本完成)因?yàn)橛写罅康膌inux系統(tǒng)命令為它做支撐。2000多個(gè)命令都是shell腳本編程的有力支撐,特別是grep、awk、sed等。例如:一鍵軟件安裝、優(yōu)化、監(jiān)控報(bào)警腳本,常規(guī)的業(yè)務(wù)應(yīng)用,shell開(kāi)發(fā)更簡(jiǎn)單快速,符合運(yùn)維的簡(jiǎn)單、易用、高效原則
PHP、Python優(yōu)勢(shì)在于開(kāi)發(fā)運(yùn)維工具以及web界面的管理工具,web業(yè)務(wù)的開(kāi)發(fā)等。處理一鍵軟件安裝、優(yōu)化,報(bào)警腳本。常規(guī)業(yè)務(wù)的應(yīng)用等php/python也是能夠做到的。但是開(kāi)發(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=yes

Shell腳本的建立和執(zhí)行

1.1 shell腳本的建立

在Linux系統(tǒng)中,shell腳本(bash shell程序)通常是在編輯器(vi/vim)中編寫(xiě),由Unix/Linux命令、bash shell命令、程序結(jié)構(gòu)控制語(yǔ)句和注釋等內(nèi)容組成。
vi = 記事本 vim =編輯器emeditor、editplus notepad++ 我們可以制作一個(gè)vi=vim的別名 [root@db01 ~]# alias vi='vim' ? [root@db01 ~]# vim /etc/profile export alias 'vi=vim' [root@db01 ~]#./etc/profile

1.2 腳本開(kāi)頭(第一行)

一個(gè)規(guī)范的shell腳本在腳本第一行會(huì)指出由那個(gè)程序(解釋器)來(lái)執(zhí)行腳本中的內(nèi)容,這一行內(nèi)容在linux bash編程中一般為: #!/bin/bash or #!/bin/sh <==255字符以內(nèi) 其中開(kāi)頭的”#!”字符又稱為幻數(shù),在執(zhí)行bash腳本的時(shí)候,內(nèi)核會(huì)根據(jù)”#!”后的解釋器來(lái)確定該用那個(gè)程序解釋這個(gè)腳本中的內(nèi)容。注意:這一行必須在每個(gè)腳本頂端的第一行,如果不是第一行則為腳本注釋行。 [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腳本中,跟在(#)井號(hào)后面的內(nèi)容表示注釋,用來(lái)對(duì)腳本進(jìn)行注釋說(shuō)明,注釋部分不會(huì)被當(dāng)做程序執(zhí)行,僅僅給用戶看,系統(tǒng)解析器是看不到,更不會(huì)執(zhí)行。
特別提示:注釋盡量不使用中文

1.4 Shell腳本的執(zhí)行

當(dāng)shell腳本運(yùn)行時(shí),它會(huì)先查找系統(tǒng)環(huán)境變量ENV,改變量指定了環(huán)境文件(通常是~./bashrc,~./bash_profile,/etc/bashrc,/etc/profile等)然后從該環(huán)境變量文件開(kāi)始執(zhí)行腳本,當(dāng)讀取了ENV的文件后,shell才會(huì)開(kāi)始執(zhí)行shell腳本中的內(nèi)容 特殊技巧:設(shè)置crond任務(wù)時(shí),最好把系統(tǒng)環(huán)境變量在定時(shí)腳本中重新定義,否則,一些系統(tǒng)環(huán)境變量不會(huì)被夾在。 ?Shell 腳本的執(zhí)行通常可以采用以下幾種方式: 1.bash script-name或sh script-name(推薦使用) 2.path/script-name或./script-name(當(dāng)前路徑下執(zhí)行腳本) ###<==此項(xiàng)需要腳本有執(zhí)行權(quán)限 3.source script-name 或. script-name #<==注意”.”點(diǎn)號(hào)和后面字符之間有空格。 4.sh <script-name 或 cat script-name|sh(同樣適合bash) 全路徑執(zhí)行如果不加命令全路徑會(huì)沒(méi)有權(quán)限 /server/scripts/abc.sh 權(quán)限不夠 /bin/sh /server/scripts/abc.sh ?可以執(zhí)行 提示: 第三種方法通常是使用source或者”.”點(diǎn)號(hào)讀入或加載指定的shell腳本文件(如san.sh),然后,依次執(zhí)行指定shell腳本文件san.sh 中的所有語(yǔ)句。這些語(yǔ)句將作為當(dāng)前父shell腳本運(yùn)行。 source或者”.”點(diǎn)號(hào)命令的功能是在當(dāng)前shell中執(zhí)行source或者”.”點(diǎn)號(hào)加載并執(zhí)行相關(guān)腳本文件中的命令以及語(yǔ)句,而不是產(chǎn)生一個(gè)字shell來(lái)執(zhí)行命令文件中的命令。 腳本里面的內(nèi)容是無(wú)法和外面的變量溝通,但是外面的變量在腳本里面是可以引用的。 如果想在腳本里面的變量引用到命令行需要使用source or .

Shell 變量類型

變量可以分為兩類:環(huán)境變量(全局變量)和普通變量(局部變量)。 環(huán)境變量也可稱為全局變量,可以在創(chuàng)建他們的Shell及其派生出來(lái)的任意子進(jìn)程shell中使用,環(huán)境變量又可分為自定義環(huán)境變量和Bash內(nèi)置的環(huán)境變量 普通變量也可稱為局部變量,只能在創(chuàng)建他們的Shell函數(shù)或Shell腳本中使用。普通變量一般是由開(kāi)發(fā)者用戶開(kāi)發(fā)腳本程序時(shí)創(chuàng)建的。

環(huán)境變量

環(huán)境變量一般用于定義Shell的運(yùn)行環(huán)境,保證Shell命令的正確執(zhí)行,Shell通過(guò)環(huán)境變量來(lái)確定登錄用戶、命令路徑、終端類型、登錄目錄等,所有的環(huán)境變量都是系統(tǒng)全局變量,可用于所有子進(jìn)程,這包括編輯器,Shell腳本和各類應(yīng)用(crond任務(wù)必須比較特殊) 環(huán)境變量可以在命令行中設(shè)置創(chuàng)建,但用戶退出命令行時(shí)這些變量值就會(huì)丟失,因此,如果希望永久保存環(huán)境變量,可在用戶家目錄下的.bash_profile或.bashrc文件中或全局配置/etc/bashrc/或/etc/profile 文件或者/etc/profile.d中定義。將環(huán)境變量放入上述的文件中,每次用戶登錄時(shí)這些變量值都將被初始化一次 有一些環(huán)境變,比如HOME、PATH、UID、USER等,在用戶登陸之前就已經(jīng)被/bin/login 程序設(shè)置好了。通常環(huán)境變量定義保存在用戶家目錄下的.bash_profile文件或者全局的配置文件/etc/profile中。
查看系統(tǒng)變量 env命令,也可以使用set (顯示的沒(méi)有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è)置變量時(shí)使用export命令。帶-x選項(xiàng)的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è)置常見(jiàn)的為用戶家目錄下的.bashrc和.bash_profile 2、全局環(huán)境變量的配置 全局環(huán)境的配置文件常見(jiàn)的配置文件為
  • /etc/profile
  • /etc/bashrc
  • /etc/profile.d
  • 需要登陸后初始化或顯示加載內(nèi)容可以把腳本文件放在/etc/profile.d下,設(shè)置可執(zhí)行即可 3、生產(chǎn)環(huán)境 自定義JAVA環(huán)境鞭炮配置實(shí)例 環(huán)境變量知識(shí)小結(jié): 1、變量名通常要大寫(xiě) 2、變量可以在自身的shell以及子shell中使用。 3、通過(guò)export來(lái)定義環(huán)境變量 4、輸出用$變量名,取消用unset變量名 5、書(shū)寫(xiě)定時(shí)任務(wù)要注意環(huán)境變量,最好在執(zhí)行的shell腳本中重新定義。 6、如果系統(tǒng)永久生效可以放在用戶環(huán)境變量文件或全局環(huán)境變量文件里。

    1.1 普通變量

    1.1.1 定義本地變量

    本地變量在用戶當(dāng)前的Shell生存期的腳本中使用。例如,本地變量OLDBOY取值為bingbing,這個(gè)值在用戶當(dāng)前Shell生存期中有意義。如果在Shell中啟動(dòng)另一個(gè)進(jìn)程或退出,本地變量值將無(wú)效 1. 普通變量定義**** 變量名=value? ? #<==賦值時(shí)不加引號(hào) 變量名=’value’ ?#<==賦值時(shí)加單引號(hào) 變量名=”value” ?#<==賦值時(shí)加雙引號(hào) 2.Shell中定義變量名及給變量?jī)?nèi)容賦值的要求 變量名一般是由字母、數(shù)字、下劃線組成,可以字母或下劃線開(kāi)頭 abc,abc123,abc_123 變量的內(nèi)容可以使用單引號(hào)或雙引號(hào)引起來(lái),也可不加引號(hào),但是這三者是不同的。 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)容賦值給變量,不管用什么引號(hào)或者不用引號(hào),它的內(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)容變量定義可不加引號(hào),其他沒(méi)有特別要求的字符串等定義最好都加上雙引號(hào),確實(shí)真的需要原因輸出的的就加單引號(hào)

    1.2 把一個(gè)命令的結(jié)果作為變量的定義方法

    獲取命令結(jié)果的變量?jī)?nèi)容寫(xiě)法常見(jiàn)的有兩種: 變量名=`ls`?? ??? ? #<==命令用反引號(hào)引起來(lái) 變量名=$(ls)? ??? ?#<==命令用$()括起來(lái)

    自定義普通字符串變量

    (1)內(nèi)容是純數(shù)字,簡(jiǎn)單連續(xù)字符(內(nèi)容中不帶任何空格)此時(shí)定義方式可以不加任何引號(hào) a.OldboyAge=33 b.NETWORD=yes (2)沒(méi)特殊情況時(shí),字符串一律用雙引號(hào)定義,特別是多個(gè)字符串中間由空格時(shí) a.NFS_MODULE="no load" b.MyName="Good game" (3)當(dāng)變量里內(nèi)容需要原樣輸出時(shí),要用單引號(hào)”,這樣的需求極少 a.HOST_NAME=’OCALHOST’ 提示: 1、變量名只能為字母、數(shù)字、下劃線,只能以字母或下劃線開(kāi)頭 2、規(guī)范的命令名寫(xiě)法要見(jiàn)名如意。 1)OldboyAge=1 ?#每個(gè)單詞的首字母大寫(xiě) 2)oldboy_age=1#單詞之間用“_” 3)oldboyAgeSex=1#駝峰語(yǔ)法:首個(gè)單詞的首字母小寫(xiě),其余單詞首字母大寫(xiě) 4)OLDBOY=1#單詞全大寫(xiě)

    1.3 變量定義的完整小結(jié):

    (1)普通變量?jī)?nèi)容的定義: 1.連續(xù)的數(shù)字或字符串,可以不加引號(hào),例如a=123 2.變量?jī)?nèi)容很多,還希望解析變量,就加雙引號(hào),例如a=”/etc/rc.local $USER”,會(huì)對(duì)內(nèi)容中的USER解析輸出 3.希望原樣輸出就用單引號(hào),例如:a=’$USER’ (2)希望編譯內(nèi)容是命令得解析結(jié)果的定義: 1.反引號(hào)括起來(lái),例如:a=`ls` 2.或者$()括起來(lái),例如:a=$(ls) (3)變量的輸出方法: 使用$變量名輸出變量?jī)?nèi)容,常用echo $變量名

    1.4 變量定義的小結(jié)技巧:

    1、注意命令變量定義前后的字符“ 例如”CMD=`ls`” 2、在變量名前加$,可以取得該變量的值,使用echo或printf命令可以顯示變量的值,$A和${A}的寫(xiě)法不同,但功能是一樣的。 3、用echo等命令輸出變量的時(shí)候,也有單引號(hào)、雙引號(hào)、反引號(hào)的形式。 4、$dbname_tname,若變量后面有其他字符連接的時(shí)候,就必須給變量加上大括號(hào){} 例如:$dbname_tname就要改寫(xiě)成${dbname}_tname 5、養(yǎng)成所有字符串變量用雙引號(hào)括起來(lái)使用的習(xí)慣,將會(huì)減少很多編程時(shí)遇到的問(wèn)題。 有關(guān)shell變量定義及變量輸出單引號(hào)、雙引號(hào)不加引號(hào)的簡(jiǎn)要說(shuō)明如下

    名稱

    解釋

    單引號(hào)

    所見(jiàn)即所得,輸出時(shí)會(huì)將單引號(hào)內(nèi)的所有內(nèi)容都原樣輸出。

    雙引號(hào)

    把雙引號(hào)內(nèi)的所有內(nèi)容輸出出來(lái):如果內(nèi)容中有命令(要反引)變量特殊字符等,會(huì)先把變量、命令解析出來(lái),然后在輸出最終內(nèi)容來(lái)。

    無(wú)引號(hào)

    把內(nèi)容輸出出來(lái),會(huì)將含有空格的字符串視為一個(gè)整體輸出,

    反引號(hào)

    一般用于引用命令,執(zhí)行的時(shí)候命令會(huì)被執(zhí)行,相當(dāng)于$()

    1.5 特殊例子:awk調(diào)用shell變量引號(hào)例子

    [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}' 一道實(shí)用linux運(yùn)維問(wè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個(gè)參數(shù)值。如果n大于9,需要用大括號(hào)括起來(lái)${10}
    $* 獲取當(dāng)前shell腳本的所有傳參的參數(shù),將所有的字符視為單個(gè)字符,相當(dāng)于”$1$2$3$4″
    $# 獲取當(dāng)前執(zhí)行的shell腳本后面接的參數(shù)的總個(gè)數(shù)
    $@ 這個(gè)程序的所有參數(shù) “$1” “$2” “#3″,這是將參數(shù)傳遞給其他程序的最佳方式,因?yàn)樗麜?huì)保留所有內(nèi)嵌在每個(gè)參數(shù)里的任何空白,”$@”和”$*”都要加雙引號(hào)
    提示:$*和$@了解即可
    $*和$@的區(qū)別例子 1.$* 將命令行腳本所有參數(shù)視為單個(gè)字符串,等同于”$1$2$3″,”$*“ 要用雙引號(hào) 2.$@將命令行腳本每個(gè)參數(shù)視為單獨(dú)的字符串,等同于”$1″ “$2” “$3″這是將參數(shù)傳遞給其他程序的最佳方式,因?yàn)樗麜?huì)保留所有的內(nèi)嵌在每個(gè)參數(shù)里的任何空白. [root@web02 /]#for i in "$*";do echo $i;done ##在有雙引號(hào)的情況下"$*"參數(shù)里引號(hào)內(nèi)容當(dāng)做一個(gè)參數(shù)輸出了! I am oldboy [root@web02 /]#for i in "$@";do echo $i;done ##在有雙引號(hào)的情況下,每個(gè)參數(shù)以獨(dú)立的內(nèi)容輸出。 I am? oldboy 其他:linux下set和eval的使用小案例精彩解答(特殊位置變量用法)

    http://oldboy.blog.51cto.com/2561410/1175971

    范例1:$n的實(shí)踐例子 [root@web02 /]# cat p.sh? #!/bin/bash echo $1 [root@web02 /]# sh p.sh good #傳一個(gè)字符串參數(shù) good [root@web02 /]# sh p.sh good good #傳2個(gè)字符串參數(shù),第二個(gè)不會(huì)接受,$1只顯示第一個(gè) good [root@web02 /]# sh p.sh "good good" #加引號(hào)括起來(lái)表示為一個(gè)字符串參數(shù) good good 測(cè)試 26的英文字符
  • [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í)行的第一個(gè)參數(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 腳本傳參的第一個(gè)參數(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ù)的返回值

    Shell進(jìn)程狀態(tài)變量

    $$ 獲取當(dāng)前shell腳本的進(jìn)程號(hào)(PID) $! 執(zhí)行上一個(gè)指令的PID $? 獲取上一個(gè)指令的返回值(0為成功,非0為失敗) $_ 在此之前執(zhí)行的命令或腳本的最后一個(gè)參數(shù) 提示:查找知道方法:man bash,然后搜索Special Parameters.
    ?范例2:應(yīng)用案例:當(dāng)系統(tǒng)中只能有某個(gè)腳本同時(shí)只能運(yùn)行一個(gè)進(jìn)程的時(shí)候。 [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)置命令(沒(mé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的長(zhǎng)度 ${string:position} ? ? ? ? ? ? ? ? 在$string中,從位置$position之后開(kāi)始提取子串 ${string:position:length} ? ? ? ? ?在$string中,從位置$position之后開(kāi)始提取長(zhǎng)度為$length的子串 ${string#substring} ? ? ? ? ? ? ? ?從變量$string開(kāi)頭開(kāi)始刪除最短匹配$substring子串 ${string##substring } ? ? ? ? ? ? ?從變量$string開(kāi)頭開(kāi)始刪除最長(zhǎng)匹配$substring子串 ${string%substring} ? ? ? ? ? ? ? ?從變量$string結(jié)尾開(kāi)始刪除最短匹配$substring子串 ${string%%substring} ? ? ? ? ? ? ? 從變量$string結(jié)尾開(kāi)始刪除最長(zhǎng)匹配$substring子串 ${parameter/pattern/string} ? ? ? ?使用string,來(lái)代替第一個(gè)匹配的pattern ${parameter/#pattern/string} ? ? ? 從開(kāi)頭匹配string變量中的pattern,使用string來(lái)替換匹配的pettern ${parameter/%patter/string} ? ? ? ?從結(jié)尾開(kāi)始匹配string變量中的pattern,就用string來(lái)替換匹配pattern ${parameter//pattern/string} ? ? ? 使用string,來(lái)代替所有匹配的pattern 更多資料man bansh 查找“Parameter Expansion”
    獲取變量字符串的長(zhǎng)度 [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個(gè)字符之后開(kāi)始取,默認(rèn)取后面字符的全部,第二個(gè)字符不包含在內(nèi)。也可以理解為刪除前面多少個(gè)字符。 [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變量字符串從第二個(gè)字符之后開(kāi)始取,取2個(gè)字符 [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開(kāi)頭刪除最短匹配”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é): #是開(kāi)頭刪除匹配最短 ##是開(kāi)頭刪除匹配最長(zhǎng) %是結(jié)尾刪除匹配最短 %%是結(jié)尾刪除匹配最長(zhǎng)

    生產(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è)場(chǎng)景例子:盡量不要使用rm
  • [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/}
  • 擴(kuò)展:其他變量的替換

    變量替換表:了解,man bash查到資料Parameter Expansion

    變量的數(shù)值(整數(shù))計(jì)算

    ? ? 變量的數(shù)值計(jì)算常見(jiàn)的有如下幾個(gè)命令: (())、let、expr、bc(小數(shù))、$[],其他都是整數(shù)。 如果要執(zhí)行簡(jiǎn)單的整數(shù)運(yùn)算,只需將特定的算術(shù)表達(dá)式用”$((“和”))” 括起來(lái)即可。 shell的算術(shù)運(yùn)算符號(hào)常置于”$((“……”))”的語(yǔ)法中。這一語(yǔ)法如同雙引號(hào)的功能

    1)(())用法:(此方法很常用)

    范例:shell的算術(shù)運(yùn)算實(shí)例如下: [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在符號(hào)后,表達(dá)式值自增或自減,然后a值自增或自減 [root@db01?~]#?a=$((100*(100+1)/2))? [root@db01?~]#?echo?$a 5050

    范例6:這是一個(gè)實(shí)踐考試題,內(nèi)容如下:

    把a(bǔ),b兩個(gè)變量通過(guò)命令行腳本傳參的方式實(shí)現(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ù)值,但也可用于字符串,用來(lái)求表達(dá)式變量的值,同時(shí)expr也是一個(gè)手工命令計(jì)算器 1.計(jì)算 語(yǔ)法:expr Expression [root@web02 /]# expr 2+2 4 [root@web02 /]# expr 2-2 0 [root@web02 /]# expr 2*2 expr: syntax error ?語(yǔ)法錯(cuò)誤 [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ù) 判斷一個(gè)文件的擴(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

    判斷一個(gè)輸入是不是數(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í)行錯(cuò)誤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 chars

    expr match 整數(shù)判斷

    [[?`expr?match?"$a"?"[0-9][0-9]*$"`?==?0?]]?&&?{echo?"the?first?is?not?a?num"exit?3 }

    計(jì)算變量長(zhǎng)度

    [root@db01 scripts]# a="oldboy" [root@db01 scripts]# expr length "$a" 6

    expr功能

    1.整數(shù)計(jì)算 2.判斷擴(kuò)展名 3.判斷輸入是否為整數(shù) 4.計(jì)算變量的長(zhǎng)度 [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ù),通過(guò)?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命令簡(jiǎn)單的算法 [root@web02 ~]# i=2 [root@web02 ~]# i=`echo $i+1|bc` [root@web02 ~]# echo $i 3 可以做加法計(jì)算 [root@web02 ~]# echo 3.5+5 3.5+5 [root@web02 ~]# echo 3.5+5|bc 8.5 減法計(jì)算 [root@web02 ~]# echo 3.5-5|bc -1.5 乘法計(jì)算 [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ù)計(jì)算 awk也可以進(jìn)行小數(shù)計(jì)算 [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 范例:通過(guò)一條命令計(jì)算輸出1+2+3+…+10的表達(dá)式,并計(jì)算出結(jié)果,使用bc計(jì)算 輸出內(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 更多方法:因計(jì)算不是重點(diǎn),所以我們不重點(diǎn)研究。 特點(diǎn):bc的獨(dú)有特點(diǎn)是支持小數(shù)運(yùn)算,當(dāng)然也可以整數(shù)運(yùn)算。

    typeset命令的用法

    使用整數(shù)變量進(jìn)行計(jì)算 例如: [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]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。