# Shell 變量
定義變量時,變量名不加美元符號($,PHP語言中變量需要),如:
```
your_name="w3cschool.cc"
```
注意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則:
* 首個字符必須為字母(a-z,A-Z)。
* 中間不能有空格,可以使用下劃線(_)。
* 不能使用標點符號。
* 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
除了顯式地直接賦值,還可以用語句給變量賦值,如:
```
for file in `ls /etc`
```
以上語句將 /etc 下目錄的文件名循環出來。
### 使用變量
使用一個定義過的變量,只要在變量名前面加美元符號即可,如:
```
your_name="qinjx"
echo $your_name
echo ${your_name}
```
變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:
```
for skill in Ada Coffe Action Java do
echo "I am good at ${skill}Script"
done
```
如果不給skill變量加花括號,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變量(其值為空),代碼執行結果就不是我們期望的樣子了。
推薦給所有變量加上花括號,這是個好的編程習慣。
已定義的變量,可以被重新定義,如:
```
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
```
這樣寫是合法的,但注意,第二次賦值的時候不能寫$your_name="alibaba",使用變量的時候才加美元符($)。
## Shell 字符串
字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
### 單引號
```
str='this is a string'
```
單引號字符串的限制:
* 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
* 單引號字串中不能出現單引號(對單引號使用轉義符后也不行)。
### 雙引號
```
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
```
雙引號的優點:
* 雙引號里可以有變量
* 雙引號里可以出現轉義字符
### 拼接字符串
```
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
```
### 獲取字符串長度
```
string="abcd"
echo ${#string} #輸出 4
```
### 提取子字符串
```
string="alibaba is a great company"
echo ${string:1:4} #輸出liba
```
### 查找子字符串
```
string="alibaba is a great company"
echo `expr index "$string" is`
```
## Shell 數組
bash支持一維數組(不支持多維數組),并且沒有限定數組的大小。
類似與C語言,數組元素的下標由0開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大于或等于0。
### 定義數組
在Shell中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的一般形式為:
```
數組名=(值1 值2 ... 值n)
```
例如:
```
array_name=(value0 value1 value2 value3)
```
或者
```
array_name=(
value0
value1
value2
value3
)
```
還可以單獨定義數組的各個分量:
```
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
```
可以不使用連續的下標,而且下標的范圍沒有限制。
### 讀取數組
讀取數組元素值的一般格式是:
```
${數組名[下標]}
```
例如:
```
valuen=${array_name[n]}
```
使用@符號可以獲取數組中的所有元素,例如:
```
echo ${array_name[@]}
```
### 獲取數組的長度
獲取數組長度的方法與獲取字符串長度的方法相同,例如:
```
# 取得數組元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}
```
## Shell 注釋
以"#"開頭的行就是注釋,會被解釋器忽略。
sh里沒有多行注釋,只能每一行加一個#號。只能像這樣:
```
#--------------------------------------------
# 這是一個自動打ipa的腳本,基于webfrogs的ipa-build書寫:
# https://github.com/webfrogs/xcode_shell/blob/master/ipa-build
# 功能:自動為etao ios app打包,產出物為14個渠道的ipa包
# 特色:全自動打包,不需要輸入任何參數
#--------------------------------------------
##### 用戶配置區 開始 #####
#
#
# 項目根目錄,推薦將此腳本放在項目的根目錄,這里就不用改了
# 應用名,確保和Xcode里Product下的target_name.app名字一致
#
##### 用戶配置區 結束 #####
```
如果在開發過程中,遇到大段的代碼需要臨時注釋起來,過一會兒又取消注釋,怎么辦呢?
每一行加個#符號太費力了,可以把這一段要注釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和注釋一樣的效果。
## Shell echo命令
Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用于字符串的輸出。命令格式:
```
echo string
```
您可以使用echo實現更復雜的輸出格式控制。
### 1.顯示普通字符串:
```
echo "It is a test"
```
這里的雙引號完全可以省略,以下命令與上面實例效果一致:
```
echo It is a test
```
### 2.顯示轉義字符
```
echo "\"It is a test\""
```
結果將是:
```
"It is a test"
```
同樣,雙引號也可以省略
### 3.顯示變量
read 命令從標準輸入中讀取一行,并把輸入行的每個字段的值指定給 shell 變量
```
#!/bin/sh
read name
echo "$name It is a test"
```
以上代碼保存為 test.sh,name 接收標準輸入的變量,結果將是:
```
[root@www ~]# sh test.sh
OK #標準輸入
OK It is a test #輸出
```
### 4.顯示換行
```
echo -e "OK!\n" # -e 開啟轉義
echo "It it a test"
```
輸出結果:
```
OK!
It it a test
```
### 5.顯示不換行
```
#!/bin/sh
echo -e "OK! \c" # -e 開啟轉義 \c 不換行
echo "It is a test"
```
輸出結果:
```
OK! It is a test
```
### 6.顯示結果定向至文件
```
echo "It is a test" > myfile
```
### 7.原樣輸出字符串,不進行轉義或取變量(用單引號)
```
echo '$name\"'
```
輸出結果:
```
$name\"
```
### 8.顯示命令執行結果
```
echo `date`
```
結果將顯示當前日期
```
Thu Jul 24 10:08:46 CST 2014
```
- Linux 基礎
- Linux 簡介
- Linux 安裝
- Linux 系統啟動過程
- Linux 系統目錄結構
- Linux 忘記密碼解決方法
- Linux 遠程登錄
- Linux 文件基本屬性
- Linux 文件與目錄管理
- Linux 用戶和用戶組管理
- Linux 磁盤管理
- Linux vi/vim
- Shell 編程
- Shell 教程
- Shell 變量
- Shell test命令
- Shell 流程控制
- Shell 函數
- Linux命令大全
- Linux命令大全 - 文件管理
- Linux cat命令
- Linux chattr命令
- Linux chgrp命令
- Linux chmod命令
- Linux chown命令
- Linux cksum命令
- Linux cmp命令
- Linux diff命令
- Linux diffstat命令
- Linux file命令
- Linux find命令
- Linux git命令
- Linux gitview命令
- Linux indent命令
- Linux cut命令
- Linux ln命令
- Linux less命令
- Linux locate命令
- Linux lsattr命令
- Linux mattrib命令
- Linux mc命令
- Linux mdel命令
- Linux mdir命令
- Linux mktemp命令
- Linux more命令
- Linux mmove命令
- Linux mread命令
- Linux mren命令
- Linux mtools命令
- Linux mtoolstest命令
- Linux mv命令
- Linux od命令
- Linux paste命令
- Linux patch命令
- Linux rcp命令
- Linux rm命令
- Linux slocate命令
- Linux split命令
- Linux tee命令
- Linux tmpwatch命令
- Linux touch命令
- Linux umask命令
- Linux which命令
- Linux cp命令
- Linux mcopy命令
- Linux mshowfat命令
- Linux rhmask命令
- Linux whereis命令
- Linux scp命令
- Linux awk 命令
- Linux命令大全 - 文檔編輯
- Linux col命令
- Linux colrm命令
- Linux comm命令
- Linux csplit命令
- Linux ed命令
- Linux egrep命令
- Linux ex命令
- Linux fgrep命令
- Linux fmt命令
- Linux fold命令
- Linux grep命令
- Linux ispell命令
- Linux jed命令
- Linux joe命令
- Linux join命令
- Linux look命令
- Linux mtype命令
- Linux pico命令
- Linux rgrep命令
- Linux sed命令
- Linux sort命令
- Linux spell命令
- Linux tr命令
- Linux expr命令
- Linux uniq命令
- Linux wc命令
- Linux命令大全 - 文件傳輸
- Linux lprm命令
- Linux lpr命令
- Linux lpq命令
- Linux lpd命令
- Linux bye命令
- Linux ftp命令
- Linux ncftp命令
- Linux tftp命令
- Linux uuto命令
- Linux uupick命令
- Linux uucp命令
- Linux uucico命令
- Linux ftpshut命令
- Linux ftpwho命令
- Linux ftpcount命令
- Linux命令大全 - 磁盤管理
- Linux cd命令
- Linux df命令
- Linux dirs命令
- Linux du命令
- Linux edquota命令
- Linux mlabel命令
- Linux mkdir命令
- Linux mdu命令
- Linux mdeltree命令
- Linux mcd命令
- Linux eject命令
- Linux mount命令
- Linux mmd命令
- Linux mrd命令
- Linux mzip命令
- Linux pwd命令
- Linux quota命令
- Linux mmount命令
- Linux rmdir命令
- Linux rmt命令
- Linux stat命令
- Linux tree命令
- Linux umount命令
- Linux ls命令
- Linux quotacheck命令
- Linux quotaoff命令
- Linux lndir命令
- Linux repquota命令
- Linux quotaon命令
- Linux命令大全 - 磁盤維護
- Linux badblocks命令
- Linux cfdisk命令
- Linux dd命令
- Linux e2fsck命令
- Linux ext2ed命令
- Linux mkbootdisk命令
- Linux fsck命令
- Linux fsck.minix命令
- Linux fsconf命令
- Linux fdformat命令
- Linux hdparm命令
- Linux mformat命令
- Linux mkdosfs命令
- Linux mke2fs命令
- Linux mkfs.ext2命令
- Linux mkfs.msdos命令
- Linux mkinitrd命令
- Linux mkisofs命令
- Linux mkswap命令
- Linux mpartition命令
- Linux swapon命令
- Linux symlinks命令
- Linux sync命令
- Linux mbadblocks命令
- Linux mkfs.minix命令
- Linux fsck.ext2命令
- Linux fdisk命令
- Linux losetup命令
- Linux mkfs命令
- Linux getty命令
- Linux sfdisk命令
- Linux swapoff命令
- Linux命令大全 - 網絡通訊
- Linux apachectl命令
- Linux arpwatch命令
- Linux nc命令
- Linux dip命令
- Linux mingetty命令
- Linux netconfig命令
- Linux ppp-off命令
- Linux uustat命令
- Linux uulog命令
- Linux wall命令
- Linux uux命令
- Linux telnet命令
- Linux netstat命令
- Linux dnsconf命令
- Linux mesg命令
- Linux httpd命令
- Linux ifconfig命令
- Linux minicom命令
- Linux traceroute命令
- Linux talk命令
- Linux ping命令
- Linux pppstats命令
- Linux samba命令
- Linux statserial命令
- Linux write命令
- Linux setserial命令
- Linux tty命令
- Linux newaliases命令
- Linux uuname命令
- Linux netconf命令
- Linux smbd命令
- Linux ytalk命令
- Linux tcpdump命令
- Linux cu命令
- Linux efax命令
- Linux pppsetup命令
- Linux testparm命令
- Linux smbclient命令
- Linux shapecfg命令
- Linux命令大全 - 系統管理
- Linux date命令
- Linux chfn命令
- Linux adduser命令
- Linux groupdel命令
- Linux useradd命令
- Linux groupmod命令
- Linux logname命令
- Linux logout命令
- Linux ps命令
- Linux exit命令
- Linux finger命令
- Linux fwhios命令
- Linux sleep命令
- Linux suspend命令
- Linux login命令
- Linux lastb命令
- Linux rlogin命令
- Linux last命令
- Linux reboot命令
- Linux kill命令
- Linux halt命令
- Linux nice命令
- Linux procinfo命令
- Linux top命令
- Linux pstree命令
- Linux shutdown命令
- Linux screen命令
- Linux sliplogin命令
- Linux rsh命令
- Linux rwho命令
- Linux sudo命令
- Linux gitps命令
- Linux uname命令
- Linux logrotate命令
- Linux tload命令
- Linux swatch命令
- Linux chsh命令
- Linux whoami命令
- Linux who命令
- Linux vlock命令
- Linux usermod命令
- Linux userdel命令
- Linux userconf命令
- Linux id命令
- Linux w命令
- Linux skill命令
- Linux su命令
- Linux renice命令
- Linux newgrp命令
- Linux whois命令
- Linux free命令
- Linux命令大全 - 系統設定
- Linux bind命令
- Linux aumix命令
- Linux dircolors命令
- Linux alias命令
- Linux clear命令
- Linux reset命令
- Linux enable命令
- Linux dmesg命令
- Linux depmod命令
- Linux declare命令
- Linux crontab命令
- Linux clock命令
- Linux chroot命令
- Linux insmod命令
- Linux rpm命令
- Linux grpconv命令
- Linux pwunconv命令
- Linux export命令
- Linux eval命令
- Linux set命令
- Linux minfo命令
- Linux lsmod命令
- Linux liloconfig命令
- Linux lilo命令
- Linux kbdconfig命令
- Linux modprobe命令
- Linux ntsysv命令
- Linux mouseconfig命令
- Linux passwd命令
- Linux pwconv命令
- Linux rdate命令
- Linux resize命令
- Linux rmmod命令
- Linux grpunconv命令
- Linux modinfo命令
- Linux time命令
- Linux setup命令
- Linux sndconfig命令
- Linux setenv命令
- Linux chkconfig命令
- Linux unset命令
- Linux ulimit命令
- Linux timeconfig命令
- Linux setconsole命令
- Linux mkkickstart命令
- Linux hwclock命令
- Linux apmd命令
- Linux fbset命令
- Linux unalias命令
- Linux SVGATextMode命令
- Linux命令大全 - 備份壓縮
- Linux bzip2recover命令
- Linux bzip2命令
- Linux bunzip2命令
- Linux ar命令
- Linux gunzip命令
- Linux unarj命令
- Linux compress命令
- Linux cpio命令
- Linux dump命令
- Linux uuencode命令
- Linux restore命令
- Linux lha命令
- Linux gzip命令
- Linux gzexe命令
- Linux zipinfo命令
- Linux zip命令
- Linux unzip命令
- Linux uudecode命令
- Linux tar命令
- Linux命令大全 - 設備管理
- Linux setleds命令
- Linux loadkeys命令
- Linux rdev命令
- Linux dumpkeys命令
- Linux MAKEDEV命令
- 免責聲明