shell生活序

從編程語言的觀點看linux shell-變量的作用域,環境變量,位置變量
我們仍以BASH 為討論的shell 語言
每一種編程語言中,我們都會碰到變量的作用域的問題。(比如在函數中定義的變量在函數外不能使用的)
BASH 中也有類似的問題,局部變量和環境變量(全局變量)。
局部變量是普通的變量,僅在創建它的Shell中有效。
環境變量。我們更多的使用“環境變量”而不是“全局變量”,因為這個名稱更
能體現它的特點。環境變量對創建它的Shell及其派生出來的子進程都有效。或者說環境變量可以繼承,但它對其它與創建它的Shell沒有關系的Shell并不可見。
聲明環境變量:declare -x 變量名=值
??????????????????????????? export 變量名=值
??????????????????????????? export 已經定義的局部變量名
在談談另一類的重要變量,位置變量。函數,腳本等都需要參數,位置變量就是

用來獲得這些參數的。相當于其它編程語言的形參。
$0? 表示當前腳本文件名。
$1,$2,$3,........,$9,${10},.... 表示第1,2,3.......個參數。
$# 位置變量的個數
$* $@ 表示所有的位置變量。(當然,兩者還是有區別的。)

shell中的變量和運算符

1.什么是變量?
???
??? 這個就不用廢話了,shell中的變量跟其他高級語言中的變量概念是一樣的。

2.shell中變量的類型?
????
??? shell中的變量類型有:本地變量、環境變量、位置變量、標準變量、特殊變量。

??? 2.1.本地變量在shell腳本的生存周期中使用的變量(也就是登錄一個shell到退出,這個shell為生存周期)設置一個本地變量格式為:變量名=變量,顯示一個變量:echo ${變量名}也可以不要大括號,顯示本地所有變量:set就可以,本地變量還可以設置為只讀的:readonly 變量名,這時的變量就具有只讀屬性,如果在shell下運行命令readonly,就會顯示當前環境下所有的只讀變量。
???
??? 2.2.環境變量用于所有的用戶進程(也就shell下所有的子進程),這個就有點像windows中的環境變量了(系統–>高級–>環境變量),環境變量一般保存在$HOME/.bash_profile和/etc/profile中,前者是只適用于當前用戶,后者適用于所有用戶設置一個環境變量用export,比喻我們這里設置一個環境變量:export pagename=”ghostwwl”這樣就設置了一個叫做pagename的環境變量,我們可以通過env這個命令來查看,還有就是可以直接通過運行export來查看。

??? 2.3.位置變量也就相當于程序中的參數(也就相當于C中的argv),在shell中位置變量一般允許$0-$9一共10個,超過10個的,嘿嘿就必須使用其他方式了。很顯然這里$0就是腳本的名字了,從$1開始就是后面的參數了。說白了也就是那個argv了。
我們這里舉個小例子,比喻有shell程序aa.sh于下:
??? #!/bin/bash
??? #named aa
??? echo “程序名為: $0″
??? echo “姓名為: $1″
??? echo “年齡為: $2″
??? echo “所屬省分為: $3″
??? echo “所在城市為: $4″
??? echo “第五個參數為: $5″

我們運行這個腳本 ./aa.sh ghostwwl 24 Hubei Wuhan 顯示結果為:
??? 程序名為: ./aa.sh
??? 姓名為: ghostwwl
??? 年齡為: 24
??? 所屬省分為: Hubei
??? 所在城市為: Wuhan
??? 第五個參數為:
可以看出因為第五個參數沒有所以就為空了
當然我們可以在腳本中系統命令傳遞參數,比喻下面一句:
find /usr/share/realpaly -name $1 -print
這個腳本語句就可以在腳本中對文件目錄/usr/share/realplay中文件名為第一個參數的文件進行查找。
說這么多他*的就是參數,搞半天。
??
??? 2.4.標準變量,也就是bash環境建立的一些標準環境的標量,他會自動去解析,基本都在/etc/profile中定義了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等。
??? EXINIT 是vi編輯器初始化運行的一些參數
??? HOME 這個傻子都知道,就是偶們的主目錄
??? IFS 一個個字段域之間用什么隔開的理論上可以任意字符,比喻/usr/bin;/usr/sbin
這里的IFS就是”;”了。
??? LOGNAME 看名字就知道 是登錄名可以用 echo $LOGNAME 來查看
??? MAIL 表示當用戶的郵箱路徑
??? MAILCHECK 表示每間隔多少秒檢查一次收件箱
還有一堆標準變量PATH,tz,PS1,PS2,PWD等等,我這里就不全部寫了,自己去找資料看,相信應該蠻好找的。

??? 2.5.特殊變量
$# 表示傳遞到腳本的參數列表
$* 以一個字符串顯示所有向腳本傳遞的參數,跟位置變量不同的是這里參數可超過9個。
$$ 表示當前運行腳本的進程ID號
$! 表示后臺運行的一個進程的ID號
$@ 與$#相同,但是使用時加引號,并在引號中返回每一個參數
$- 顯示shell使用的當前選項,與set命令相同
$? 顯示最后命令運行的推出狀態,0表示沒有錯誤,其他任何值表示有錯誤?

3.shell中的變量替換

??? 這里說一下變量替換這個經常用到,其實就是用變量的值替 換他的名字,顯示變量的時候就是這個,可以用:
為了試驗我們先定義一個變量haha=”**** you”
???? a.${變量名}來搞定(這里的大括號可要可不要,不過偶一般都加)
???? b.${變量名:+變量值}這個表示如果前面的變量值不為空,則顯示變量值,否則置空,比喻echo ${name:+”ghostwwl”}這樣可不管你以前有沒有對name賦過值都會顯示這里的”ghostwwl”
???? c.${變量名:?錯誤信息}這個表示當變量名存在,就是變量的值,不存在就顯示問號后面的錯誤信息比喻echo ${age:+”No defined variable age”}這個因為age不存在所以它會顯示錯誤信息age:No defined variable age
???? d.${變量名:-變量值}這個表示如果如果變量名沒有設置,就用這里給出變量值來代替,顯然如果設置了肯定就是返回原來設置的值:比喻echo ${age:-24}因為age變量沒有設置,所以它會用24去代替,如果是echo ${haha:-”hello”}這里會顯示原來所賦的值”**** you”記得不要跟b中的情況搞混。
???? e.${變量名:=變量值}表示如果沒有設置變量名這個變量,就設置它的值,比喻echo ${age:=24}因為沒有設置age這個值,所以運行這句的時候會賦值并顯示。當然這樣賦值以后就可以把age當正常變量用了,也就是這時我們有haha和age這兩個變量了。

??? 就這五種了(當然如果把第一種去掉大括號,就6種了),開始可能并不習慣,用多了就習慣了,啊哈哈!

4.清除變量(unset)
??? 能定義變量當然也就能刪除變量了,比喻我們要刪除那個haha,因為值為”**** you”不太文明,我們可以用:unset haha 從這里就可以看出清除變量用unset 變量名。
??? 這里我們要注意,設置了readonly的只讀變量不能取消也不能重新設置值。

我們這里再來把前面個例子改一下:
??? #!/bin/bash
??? #named aa
??? echo “程序名為: $0″
??? echo “姓名為: $1″
??? echo “年齡為: $2″
??? echo “所屬省分為: $3″
??? echo “所在城市為: $4″
??? echo “參數個數為: $#”
??? echo “腳本參數為: $*”
??? echo “腳本進程ID為: $$”
我們再來運行這個腳本 ./aa.sh ghostwwl 24 hubei wuhan 結果為:
??? 程序名為: ./aa.sh
??? 姓名為: ghostwwl
??? 年齡為: 24
??? 所屬省分為: hubei
??? 所在城市為: wuhan
??? 腳本參數個數為: 4
??? 腳本參數為: ghostwwl 24 hubei wuhan
??? 腳本進程ID為: 212

5.影響變量的一些命令
??? 5.1 declare 創建或顯示變量
??????? 參數-f 只顯示函數名
??????? 參數-r 創建只讀變量(typeset也可以)
??????? 參數-x 創建轉出變量
??????? 參數-i 創建整數變量
??????? 如果參數中使用+來代替-,表示選項的含義相反。
????
??? 5.2 export 創建環境變量
??????? 參數– 表明選項結束,所有后面的參數都是實參
??????? 參數-f 表示在”變量-值”對照中的變量是一個函數名
??????? 參數-n 表示把全局變量轉換成局部變量(也就是本地變量)。
??????? 參數-p 顯示全局變量列表
?
??? 5.3 readonly 創建或顯示只讀變量
??????? 參數– 表示選項結束
??????? 參數-f 創建只讀變量

??? 5.4 set 設置或者重設各種shell
??? 5.5 shift [n] 用來移動或調整位置變量,使$4賦給$3(也就是全都向前面移動一次),這個里面的n表示移動幾位,默認是移動一位。
??? 5.6 typeset 這個就跟declare相同了
??? 5.7 unset 清除變量的定義
??????? 參數– 表示選項結束
??????? 參數-f 刪除只讀變量,但是不能sehll環境中制定的變量和函數。

6.shell的運算符
?? 6.1 位運算 ~,>>,<<,&,|,^ 一看就知道分別是取反,左移,右移,與,或,異或。
?? 6.2 $[]表示對[]中的表達式求值和$(())相等的。
?? 6.3 邏輯運算符 &&,||,>,<,==,!= 是人都看得懂跟C里一樣的。?

?? 6.4 賦值運算符 =,+=,-=,*=,/=,%=,&=,|=,<<=,>>=,^= 跟其他語言差不多一看就明白的。當然表達式賦值let $a=$b+$c這種形式。

?? 6.5 運算符的優先級我就不想廢話了,都跟其他語言差不多的,自己去找。


http://why-gudu.spaces.live.com/Blog/cns!1pziotErZQfm5-4NtdB7DJ3w!155.entry

http://bbs.topsage.com/dv_rss_xm_119_195915_1.html

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535593.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux下安裝phantomjs

PhantomJS俗稱為&#xff1a;無界面的瀏覽器。 PhantomJS是一個基于webkit的JavaScript API。它使用QtWebKit作為它核心瀏覽器的功能&#xff0c;使用webkit來編譯解釋執行JavaScript代碼。任何你可以在基于webkit瀏覽器做的事情。 1、下載安裝包 官網下載地址&#xff1a;htt…

shell 生活0806012145

引用&#xff1a;        學習 Shell Scripts 如果您真的很想要走信息這條路&#xff0c;并且想要好好的管理好屬于您的主機&#xff0c;那么&#xff0c;別說鳥哥不告訴您&#xff0c; Shell Scripts 真的是必須要學習的一項課題呢&#xff01;基本上&#xff0c; shel…

linux系統啟動流程詳解

一、MBR的概念 主引導扇區位于硬盤的0磁道0柱面1扇區,共512bytes,可存放一小段程序及主分區表,由三大部分組成: 硬盤主引導記錄MBR(Master Boot Record)占446bytes 分區表DPT(Disk Partition Table)占64bytes 硬盤有效標志(Magic Number)占2bytes。 硬盤…

linux下安裝davinci

官網地址 https://edp963.github.io/davinci/ 1、準備 JDK 1.8&#xff08;或更高版本&#xff09; MySql5.5&#xff08;或更高版本&#xff09; Mail Server (本人測試可以不用安裝) phantomjs 或 chrome&#xff08;需同時安裝chromedriver&#xff0c;清注意版本&#xf…

GRUB詳解

一、GRUB介紹 GRUB (GRand Unified Bootloader)是GNU 下的FSF 組織所推行的一套多重開機管理軟件,目前 GRUB 在 Linux 上使用的版本為 0.97 版,FSF 的官方網站表示已經不會在此版本上再追加任何新的功能,會將心思放在 GRUB 2 上。 GNU GRUB(GRand Unified Bootloader)是一…

好用的yum

從Windows轉到Linux下面&#xff0c;一個不習慣的地方就是在圖形界面下安裝和刪除軟件的時候非常緩慢。但是如果你掌握了用yum的命令行模式進行配置程序&#xff0c;你肯定會從心底喜歡上這個強大的工具。因為yum提供了查找、安裝、刪除某一個、一組甚至全部軟件包的命令&#…

Ambari系統架構

一、Ambari系統架構 Ambari框架采用的是Server/Client的模式&#xff0c;主要由兩部分組成&#xff1a;ambari-agent和ambari-server。ambari依賴其它已經成熟的工具&#xff0c;例如其ambari-server 就依賴python&#xff0c;而ambari-agent還同時依賴ruby, puppet&#xff0…

Linux系統的基本安裝

一、制作Linux安裝啟動盤 1.準備一個干凈的U盤&#xff0c;格式化。 2.下載64位系統鏡像&#xff1a;rhel-server-6.8-x86_64-dvd.iso。64位系統直接安裝就好&#xff0c; 3.首先制作一個啟動盤&#xff0c;解壓rhel-server-6.8-i386-dvd.iso文件 4.下載安裝UltraISO&#…

linux tips 技巧筆記一

作者: Jeffrey出處: http://blog.zhangjianfeng.com/?p171 實現RedHat非正常關機的自動磁盤修復先登錄到服務器&#xff0c;然后在/etc/sysconfig里增加一個文件autofsck,內容如下&#xff1a;AUTOFSCK_DEF_CHECKyesPROMPTyes 改變文件或目錄之最后修改時間(變為當前時間)執…

Shell基本概念

一、什么是shell shell是外殼的意思&#xff0c;就是操作系統的外殼。我們可以通過shell命令來操作和控制操作系統&#xff0c;比如Linux中的Shell命令就包括ls、cd、pwd等等。總結來說&#xff0c;Shell是一個命令解釋器&#xff0c;它通過接受用戶輸入的Shell命令來啟動、暫…

Shell解釋器

shell解釋器&#xff0c;用戶和操作系統內核之間的橋梁 一、Shell常見種類 就像不同地區有不同方言一樣&#xff0c;不同的Linux/Unix系統使用著不同類型的shell Bsh:由貝爾實驗室編寫。Bsh是產生較早的UNIX Shell程序&#xff0c;實現了最基本的命令解釋器的功能&#xff0c…

mysql安裝、導入數據腳本

mysql安裝&#xff1a; #!/bin/bash if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root to install mysql"exit 1 fi unzip Mysql.zip cd /home/install_LFS/Mysql cur_dir$(pwd) mkdir -p /usr/local/mysq…

linux tips 技巧筆記二

如何查找大小為500K到1000K之間的文件find / -type f -size 500k -and -size -1000k 僅列出當前目錄下的文件名.find ./ -type f -maxdepth 1 -exec basename {} /; 讓主機不響應pingecho 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all若想恢復就用echo 0 > /proc/sys/…

Shell腳本——入門

shell腳本編程需要注意以下幾個事項&#xff1a; shell腳本名稱命名一般為英文的大寫、小寫&#xff1b;不能使用特殊符號、空格來命名&#xff1b;shell腳本后綴以.sh結尾&#xff1b;不建議shell命名為純數字&#xff0c;一般以腳本功能命名&#xff1b;shell腳本內容首行需以…

Linux下C開發環境的構成和安裝

本文介紹了Linux的C開發環境的構成和安裝&#xff0c;使讀者對Linux的C開發環境能有初步的了解。 你了解Linux嗎&#xff1f;相信現在越來越多的人會說“是”的。那么你了解到何種程度呢&#xff1f;不可否認&#xff0c;目前決大多 數的Linux用戶對Linux的了解還處于比較低級的…

Shell腳本——變量

變量是任何一種編程語言都必不可少的組成部分&#xff0c;變量用來存放各種數據。腳本語言在定義變量時通常不需要指明類型&#xff0c;直接賦值就可以&#xff0c;Shell 變量也遵循這個規則 在 Bash shell 中&#xff0c;每一個變量的值都是字符串&#xff0c;無論你給變量賦值…

基礎環境安裝腳本

#/bin/bash # Check if user is root if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root"exit 1 fiecho "安裝環境包"if [ -f /etc/yum.repos.d/rhel-source.repo ];thenrm -r /etc/yum.repos.d…

Apache 虛擬主機的配置[Ubuntu]

基本配置 我們都知道&#xff0c;如果我們想在單臺機器上設置多個域名或主機名時&#xff0c;我們就要用到基于名稱的虛擬主機了。那么要如何進行設置呢&#xff1f;這就是本 HowTo 想解決的問題了。在 Ubuntu 的 /etc/apache2/ 目錄下有個 Apache2 的主配置文件 apache2.conf…

Shell腳本——數字計算

Shell 和其它編程語言不同&#xff0c;Shell 不能直接進行算數運算&#xff0c;必須使用數學計算命令 要想讓數學計算發揮作用&#xff0c;必須使用數學計算命令&#xff0c;Shell 中常用的數學計算命令如下表所示。 運算操作符/運算命令說明(( ))用于整數運算&#xff0c;效率…

windows下最好的C++ IDE

1. 你是不是用慣了VC6.0&#xff1f;假如是&#xff0c;我現在推薦的IDE仍然是VC6.0的IDE。 2. 你是不是覺得VC6.0過時了&#xff0c;很多C語法它都不支持&#xff1f;我現在推薦的編譯器她在一直發展著&#xff0c;支持最新的C語法。 3. VC.net的界面弱智&#xff0c;而且包含…