shell腳本基礎
shell腳本:
包含一些命令或聲明,并符合一定格式的文本文件
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell腳本的用途有:
自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或文件
創建shell腳本
第一步:使用文本編輯器來創建文本文件
第一行必須包括shell聲明序列:#!
#!/bin/bash
添加注釋
注釋以#開頭
第二步:運行腳本
給予執行權限,在命令行上指定腳本的絕對或相對路徑
直接運行解釋器,將腳本作為解釋器程序的參數運行
直接執行腳本權限會拒絕,要給腳本加個X權限
腳本規范
腳本代碼開頭約定
1、第一行一般為調用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改后的時間
5、作者相關信息
6、該程序的作用,及注意事項
7、最后是各版本的更新簡要說明
示例:
#!/bin/bash
# ——————————————
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: wang
# Email: wang@gmail.com
# Website: www.magedu.com
# Description: This is the first script
# ——————————————
# Copyright: 2017 wang
# License: GPL
echo “hello world”
腳本調試
bash -n f1.sh 檢測腳本中語法的錯誤
設置變量b,故意將$后的小括號打成中文的括號,然后檢測,就會報錯,提示你括號打錯了
bash -x f1.sh 調試執行
每一步都顯示出來
變量
變量:命名的內存空間
數據存儲方式:
字符:
數值:整型,浮點型(有小數)
變量:變量類型
作用:
1、數據存儲格式
2、參與的運算
3、表示的數據范圍
類型:
字符
數值:整型、浮點型
強類型:變量不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型轉換。一般定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤
如java,c#
弱類型:語言的運行時會隱式做數據類型轉換。無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用
如:bash 不支持浮點數,php
變量命名法則:
1、不能使程序中的保留字:例如if, for
2、只能使用數字、字母及下劃線,且不能以數字開頭
3、見名知義
4、統一命名規則:駝峰命名法
bash中變量的種類
根據變量的生效范圍等標準:
1.本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效
設置個本地變量d=444,當前shell是一級(echo $SHLVL查看當前shell是幾級shell),可以引用變量d。進入2級shell,再引用變量d,不會顯示吃結果, 說明變量d已經不存在了,進入3級shell,還是一樣。當再次返回一級shell,又能引用變量d了,所以本地變量只對當前shell有效,對當前shell的子shell及以下的shell都無效。
變量賦值:name=‘value’
可以使用引用value:
(1) 可以是直接字串; name=“root”
(2) 變量引用:name=”$USER”
(3) 命令引用:name=`COMMAND`(命令用反單引號引起來) name=$(COMMAND)
變量引用:${name} $name
“”:弱引用,其中的變量引用會被替換為變量值
”:強引用,其中的變量引用不會被替換為變量值,而保持原字符串
顯示已定義的所有變量:set(既可以查本地變量又能查環境變量)
刪除變量:unset name(在腳本中設置了變量,用完了之后最好把變量刪除掉)
2.環境變量:生效范圍為當前shell進程及其子進程
設置環境變量a,當前是一級shell,能引用環境變量a,進入2級shell,依舊能引用,3級也是如此,所以環境變量對當前shell及其子shell或以下都有效。
變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:$name, ${name}
顯示所有環境變量:(只顯示環境變量)
env
printenv
export
declare -x
刪除變量:(在腳本中設置了變量,用完了之后最好把變量刪除掉)
unset name
bash內建的環境變量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
HOSTNAME
HISTSIZE
—
source
寫一個腳本66.sh,內容為設置一個本地變量f=1111,然后把本地變量f顯示出來(腳本中變量f是在2級shell設置的),寫完腳本后,在當前shell也設置一個本地變量f=magedu,然后把腳本66.sh加上權限,用路徑執行腳本,結果為1111,在當前shell顯示變量f結果為magedu,再用source來執行腳本,結果還為1111,但再在當前shell顯示變量f結果為1111,所以可以得出結論:source在當前shell執行腳本后,腳本中設置的變量(在當前shell的子shell中設置的)會覆蓋當前shell相同的變量。用source執行腳本是極為不安全的,因為會破壞掉當前shell的變量。
.也就是source
3.局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)
4.位置變量:$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$1, $2, …:對應第1、第2等參數,shift [n]換位置
這的$10和$11不是整體,是$1和0,$1和1
所以$10顯示的是第一個參數和0,$11顯示的是第一個參數和1
把10和11用大括號括起來,使其變成一個整體 ,這樣就能使${10}顯示第10個參數,${11}顯示第11個參數。
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set —清空所有位置變量
5.特殊變量:$?, $0, $*, $@, $#,$$
6.只讀變量: 只能聲明,但不能修改和刪除
聲明只讀變量:
readonly varname
declare -r varname
查看所有的只讀變量
readonly -p
(只讀變量不能修改和刪除)reboot重啟后只讀變量會自動消失。
退出狀態
進程使用退出狀態來報告成功或失敗
0 代表成功,1-255代表失敗
$? 變量保存最近的命令退出狀態
例如:
ping-c1-W1 hostdown&>/dev/null
echo $?
退出狀態碼
bash自定義退出狀態碼
exit [n]:自定義退出狀態碼
注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼
轉譯:
\ 完全轉譯
“”部分轉譯 (\ ` ! $ 不能轉譯)
” 完全轉譯
引用變量時
$varname
“$varname”
${varname}
當變量值當中包含換行符,如果希望引用出的值同樣包含換行符,只能使用“$varname”
$()和${}的區別:當引用一些命令的結果時用$(),當引用的是設置變量的名字時用${},來劃分界限。
算術運算
bash中的算術運算:help let
+, -, *, /, %取模(取余), **(乘方)在bc當中乘方是^
實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 …) 乘法時要轉譯* ,即\*
(5) declare –i var = 數值
(6) echo ‘算術表達式’ | bc(這種算術表達乘方是^)
bash有內建的隨機數生成器:$RANDOM(0-32767)
echo $[$RANDOM%50] :0-49之間隨機數
echo $[$RANDOM%72+1]取個隨機數0到71再加1(就是1到72)
賦值
增強型賦值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3后自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var–
原創文章,作者:fuming,如若轉載,請注明出處:http://www.www58058.com/83748