Shell 基礎知識node
1.簡介shell
在計算機科學中,Shell俗稱殼(用來區別於核),是指「爲使用者提供操做界面」的軟件(命令解析器)。它接收用戶命令,而後調用相應的應用程序。(百度百科)vim
kernel主要的四種功能bash
內存管理ide
軟件程序管理函數
硬件管理工具
文件系統學習
知識點小節:測試
#!/bin/bash 腳本文件的第一行是個特例ui
# 註釋行,不執行
執行:sh
顯示腳本debug: sh -x vim/set -x 重複debug模式
不執行只檢測語法: sh -n
bash
./
~~~~~~~~~~~~~~~
註釋信息
#!/bin/bash
# Description:
# Date: 2016-9-26 16:50:10
# Email: lnredone@126.com
# Author: Mag
# Version: 0.01
~~~~~~~~~~~~~~~
腳本加密工具shc
shc -r -f filename
2.Shell環境變量
變量類型:
字符型
數值型:
bash中的變量的種類:【根據變量的生效範圍等標準】
本地變量:生效範圍爲當前shell進程;對當前shell以外的其它shell進程,包括當前shell的子shell進程均無效;【也包括當前shell的父shell】
環境變量:生效範圍爲當前shell進程及其子進程;
局部變量:生效範圍爲當前shell進程中某代碼片段(一般指函數);
位置變量:$1, $2, ...來表示,用於讓腳本在腳本代碼中調用經過命令行傳遞給它的參數;
特殊變量:$?, $0, $*, $@, $#
###
本地變量:
變量賦值:name='value'
(1) 能夠是直接字串; name="username"
(2) 變量引用:name="$username"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND)
變量引用:${name}, $name
"":弱引用,其中的變量引用會被替換爲變量值;
'':強引用,其中的變量引用不會被替換爲變量值,而保持原字符串;
顯示已定義的全部變量:
set
銷燬變量:
unset name
環境變量:
變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:$name, ${name}
顯示全部環境變量:
export
env
printenv
銷燬變量:
unset name
bash有許多內建的環境變量:PATH, SHELL, UID, HISTSIZE, HOME, PWD, OLD, HISTFILE, PS1
只讀變量:
readonly name
declare -r name
位置變量:
在腳本代碼中調用經過命令行傳遞給腳本的參數;
$1, $2, ...:對應調用第一、第2等參數;
shift [n]
特殊變量:
$0: 腳本名稱自身
$?: 上一條命令的執行狀態
狀態用數字來表示:0-255;
0: 成功
1-255: 失敗
$!: 執行上一個後臺命令的PID
$#: 這個程序的參數個數(傳給腳本的參數個數)
$*: 這個程序的全部參數(傳遞給腳本的全部參數,視爲一個總體,是以一個單字符串顯示全部向腳本傳遞的參數,與位置變量不一樣,參數可超過9個)
$$: 這個程序的PID(腳本運行的當前進程ID號)
$@: 傳給腳本的全部參數的列表,每個參數看成獨立的一個字符串
變量的命名要求:
一、不能使程序中的保留字[關鍵字]:例如if, for
二、只能使用數字、字母和下劃線組成,且不能以數字開頭
三、見名知義
3.bash的配置文件
profile類:爲交互式登陸的用戶提供配置
/etc/profile: 全局
/etc/profile.d/*.sh: 全局
~/.bash_profile: 我的配置,僅對當前用戶有效
功能:
設定環境變量
運行命令或腳本
bashrc類:非交互式登陸用戶提供配置
/etc/bashrc: 全局
~/.bashrc: 我的配置
功能:
設定本地變量
定義命令別名
通知shell重讀配置文件的命令:
source(.)
. FILE
從新登陸
交互式登陸用戶:
/etc/profile --> /etc/profile.d/*.sh -->~/.bash_profile -->~/.bashrc --> /etc/bashrc
非交互式登陸用戶:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4.語法
bash中條件判斷使用if
單分支:
if 條件; then
分支1;
fi
###示例
if [ -f /tmp/aaa ]
then
echo "yes"
else
echo "no"
fi
雙分支:
if 條件;then
分支1;
else
分支2;
fi
多分支:
if 條件1; then
分支1;
elif 條件2;then
分支2
elif 條件3;then
分支3
...
else
分支n;
fi
###示例
if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
elif [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
else
echo "$NUM1 = $NUM2"
fi
運算語法:
#let var=$s+$i
#var=$(expr $s + $i)
#var=`expr $s + $i`
#var=$[$s+$i]
#var=$(($s+$i))
條件測試方法:
bash: 每一個命令,執行狀態返回值:
成功: 0
失敗: 非0
[[ 測試表達式 ]] 腳本關鍵字 bash關鍵字
[ 測試表達式 ] 內生命令 bash命令
test 測試表達式
###示例
test 1 -gt 2; echo $? #是否大於2
test 1 -lt 2; echo $? #是否小於2
test 1 -ge 2; echo $? #是否大於等於2
test 1 -le 2; echo $? #是否小於等於2
test 1 -eq 2; echo $? #是否等2
test 1 -ne 2; echo $? #是否不等於2
組合條件測試: 對條件作邏輯運算
與: 條件1 && 條件2
條件1爲假,則最終結果必定爲假,所以,條件2將不執行
條件1爲真,則最終結果決於後面的條件,所以,條件2必須執行
或: 條件1 || 條件2
條件1爲真,則最終結果必定爲真,所以,條件2將再也不執行
條件1爲假,則最終結果決於後面的條件,所以,條件2必須執行
非: !條件
整數測試:
-eq , -ne , -le , -ge, -gt , -lt
字符測試:
雙目:
>: 大於
<: 小於
==: 等於,等值比較, 一個」=「 是作賦值的 【= 其實一個等於號也能夠,只要放在測試命令中】
=~: 左則是字符串,右則是一個模式,斷定左側的字符串可否被右側的模式所匹配,一般只在[[ ]]使用,模式中能夠使用行首、行尾錨定符:但模式不要加引號
!=,<>: 不等於
文件測試:
存在性測試
-a FILE
-e FILE: 文件存在性測試,存在爲真,不然爲假;
存在性及類別測試
-b FILE:是否存在且爲塊設備文件;
-c FILE:是否存在且爲字符設備文件;
-d FILE:是否存在且爲目錄文件;
-f FILE:是否存在且爲普通文件;
-h FILE 或 -L FILE:存在且爲符號連接文件;
-p FILE:是否存在且爲命名管道文件;
-S FILE:是否存在且爲套接字文件;
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
文件特殊權限測試:
-g FILE:是否存在且擁有sgid權限;
-u FILE:是否存在且擁有suid權限;
-k FILE:是否存在且擁有sticky權限;
文件大小測試:
-s FILE: 是否存且非空;
文件是否打開:
-t fd: fd表示文件描述符是否已經打開且與某終端相關
-N FILE:文件自動上一次被讀取以後是否被修改過;
-O FILE:當前有效用戶是否爲文件屬主;
-G FILE:當前有效用戶是否爲文件屬組;
雙目測試:
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設備上的相同inode
FILE1 -nt FILE2: FILE1是否新於FILE2;
FILE1 -ot FILE2: FILE1是否舊於FILE2;
shell腳本學習方法