強類型:變量在使用前,必須事先聲明,甚至還需要初始化; 弱類型:變量用時聲明,甚至不區分類型;什麼是弱類型,什麼是強類型?
變量賦值,引用
賦值:VAR_NAME=VALUE
引用:${VARNAME} (花括號一般可以省略)
例:
[root@iZ28g26851kZ ~]# name=test --賦值
[root@iZ28g26851kZ ~]# echo $name --引用
test
[root@iZ28g26851kZ ~]#
bash變量類型
環境變量
export VARNAME=VALUE ; 作用域為當前shell進程及其子進程。
命令行中啟動的腳本會繼承當前shell環境變量;
系統自動執行的腳本(非命令行啟動)就需要自我定義需要的各環境變量;
例:
[root@iZ28g26851kZ ~]# JAVA_HOME=/opt/java/jdk7/
[root@iZ28g26851kZ ~]# export JAVA_HOME
[root@iZ28g26851kZ ~]# echo $JAVA_HOME
/opt/java/jdk7/
[root@iZ28g26851kZ ~]#
本地變量
set VARNAME=VALUE: 作用域為整個bash進程;(set關鍵字 可以省略)
局部變量
local VARNAME=VALUE:作用域為當前代碼段;(local 是關鍵字)
位置變量
$1,$2, ...
位置變量是用來引用腳本的參數的
特殊變量
特殊變量是用來保存一些特殊數據的。
$?:上一個命令的執行狀態返回值;
例:
[root@iZ28g26851kZ ~]# ls
libiconv-1.14 mhash-0.9.4.tar.gz mysql-5.1.51.tar.gz nginx-1.8.0.tar.gz
libiconv-1.14.tar.gz mysql-5.1.51 nginx-1.8.0
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]# lsss
-bash: lsss: command not found
[root@iZ28g26851kZ ~]# echo $?
127
[root@iZ28g26851kZ ~]#
可以看出,當執行命令成功和失敗時,$? 的值是不同的
0: 正確執行
1-255:錯誤執行;(1,2,127系統預留)
/dev/null
軟件設備,bit bucket,數據黑洞
什麼意思呢?
當命令執行的結果我們不需要顯示出來時,就可以重定向到/dev/null中,數據不會在/dev/null中保存,所以不會產生垃圾數據
例:
[root@iZ28g26851kZ ~]# ls &> /dev/null
[root@iZ28g26851kZ ~]# cat /dev/null --可以發現,數據並不存在
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]# lsss &> /dev/null
[root@iZ28g26851kZ ~]# echo $?
127
[root@iZ28g26851kZ ~]#
這樣就可以只獲取命令是否執行成功的狀態,而不需要知道命令執行的詳細結果
釋放(撤銷)變量
unset VARNAME
例:
[root@iZ28g26851kZ ~]# echo $name
test
[root@iZ28g26851kZ ~]# unset name
[root@iZ28g26851kZ ~]# echo $name
[root@iZ28g26851kZ ~]#
操作變量時,什麼時候加$符號,什麼時候不加$符號
操作變量本身不需要加$符號 操作變量的值要加$符號
查看當前shell中的變量
set 不加任何參數可以列出當前所有變量
查看當前shell中的環境變量
printenv
env
export
給字符串變量追加值
對於shell來說,默認所有的變量都是字符串
[root@iZ28g26851kZ ~]# mylist=www
[root@iZ28g26851kZ ~]# mylist=${mylist}qqq
[root@iZ28g26851kZ ~]# echo $mylist
wwwqqq
[root@iZ28g26851kZ ~]#
那麼問題來了,如果設置java的環境變量?
[root@iZ28g26851kZ ~]# export PATH=$PATH:${JAVA_HOME}/bin
[root@iZ28g26851kZ ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/java/jdk7/bin
[root@iZ28g26851kZ ~]#
當然這樣只是臨時的,退出當前shell後就失效了
如何讓自己寫的文件當腳本執行
在文件開頭加上 #!/bin/bash 就行了
#! 叫 shebang(魔數) ,用來指定腳本解釋器的路徑,所以這裡寫上/bin/bash 就行了
例:
#!/bin/bash
#這是注釋
ls -al
~
~
將文件保存為list.sh(當然文件名可以隨便寫)
此時文件還沒有x權限
-rw-r--r-- 1 root root 33 May 7 12:00 list.sh
添加權限
[root@iZ28g26851kZ ~]# chmod +x list.sh
好,現在執行,
[root@iZ28g26851kZ ~]# list.sh
-bash: list.sh: command not found
[root@iZ28g26851kZ ~]#
居然不行???,
好吧,其實是當執行一個命令時,系統默認會先去環境變量的路徑下尋找可執行程序,
也可以直接給定可執行程序的路徑,
[root@iZ28g26851kZ ~]# ./list.sh
total 30364
dr-xr-x---. 5 root root 4096 May 7 12:03 .
dr-xr-xr-x. 22 root root 4096 Dec 27 23:24 ..
-rw------- 1 root root 12296 May 7 08:52 .bash_history
-rw-r--r--. 1 root root 18 May 20 2009 .bash_logout
-rw-r--r-- 1 root root 270 May 7 08:52 .bash_profile
-rw-r--r--. 1 root root 176 Sep 23 2004 .bashrc
-rw-r--r--. 1 root root 100 Sep 23 2004 .cshrc
-rw------- 1 root root 41 May 3 17:36 .lesshst
、、、、、、、、、、、、、、、、、
-rw-r--r--. 1 root root 129 Dec 4 2004 .tcshrc
-rw------- 1 root root 6937 May 7 12:03 .viminfo
[root@iZ28g26851kZ ~]#
哈哈,這樣就搞定了~