歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

linux基礎之shell編程(1)

shell:屬於弱類型編程語言

什麼是弱類型,什麼是強類型?

強類型:變量在使用前,必須事先聲明,甚至還需要初始化; 弱類型:變量用時聲明,甚至不區分類型;

變量賦值,引用

賦值: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 ~]# 

哈哈,這樣就搞定了~

Copyright © Linux教程網 All Rights Reserved