一文搞懂shell腳本
1 、shell腳本介紹
- 什么是shell腳本
一系列的shell命令的集合, 還可以加入一些邏輯操作(if else for) 將這些命令放入一個文件中.
- 什么是shell命令?
- ls
- pwd
- cd
- chmod +x test.sh
- shell腳本的基本格式
- 命名格式
- 一般命名規則 : xxxxx.sh (建議以.sh為后綴命名)
- 書寫格式
- 命名格式
# test.sh #是shell腳本中的注釋
# 第一行如果忘了了寫, 使用默認的命令解析器 /bin/sh
#!/bin/bash # 指定解析shell腳本的時候使用的命令解析器 /bin/sh也可以
# 一系列的shell命令
ls
pwd
cp
rm
- shell腳本的執行
# 執行shell腳本
./xxx.sh
sh test.sh
2、 shell腳本中的變量
- 普通變量(本地變量)
# 定義變量, 定義完成, 必須要賦值, =前后不能有空格
temp=666
# 普通變量只能在當前進程中使用
- 環境變量——一般大寫
# 可以理解問全局變量, 在當前操作系統中可以全局訪問
# 分類
- 系統自帶的
- PWD
- SHELL
- PATH
- HOME
- 用戶自定義的
- 將普通變量提升為系統級別的環境變量
GOPATH=/home/zoro/go/src - > 普通環境變量
set GOPATH=/home/zoro/go/src - > 系統環境變量
export GOPATH=/home/zoro/go/src
~/.bashrc
- 位置變量
- 執行腳本的時候, 可以給腳本傳遞參數, 在腳本內部接收這些參數, 需要使用位置變量
# 已經存在的腳本test.sh
#!/bin/bash
echo "hello , world, $0"
echo "第一個參數: $1"
echo "第2參數: $2"
echo "第3個參數: $3"
echo "第4個參數: $4"
echo "第5個參數: $5"
echo "第6個參數: $6"
# 執行test.sh
$ ./test.sh 11 22 3 4 5 6 aa bb
hello , world, ./test.sh
第一個參數: 11
第2參數: 22
第3個參數: 3
第4個參數: 4
第5個參數: 5
第6個參數: 6
- 特殊變量
- $#: 獲取傳遞的參數的個數
- $@: 給腳本傳遞的所有的參數
- $?: 腳本執行完成之后的狀態, 失敗>0 or 成功=0
- $$: 腳本進程執行之后對應的進程ID
# test.sh
#!/bin/bash
echo "hello , world, $0"
echo "第一個參數: $1"
echo "第2參數: $2"
echo "第3個參數: $3"
echo "第4個參數: $4"
echo "第5個參數: $5"
echo "第6個參數: $6"
echo "傳遞的參數個數: $#"
echo "傳遞的所有的參數: $@"
echo "當前腳本的進程ID: $$"
$ ./test.sh aa bb cc dd ee ff 8 9 0
hello , world, ./test.sh
第一個參數: aa
第2參數: bb
第3個參數: cc
第4個參數: dd
第5個參數: ee
第6個參數: ff
傳遞的參數個數: 9
傳遞的所有的參數: aa bb cc dd ee ff 8 9 0
當前腳本的進程ID: 47946
# 腳本執行狀態查看
$ echo $?
0 -> 成功
非0 -> 失敗
- 普通變量取值
# 變量定義
value=123 # 默認以字符串處理
value1 = "123 456"
echo $value
# 如何取變量的值:
- $變量名
- ${變量名}
- 取命令執行之后的結果值
# 取值的兩種方式:
var=$(shell命令)
var=`shell命令`
- 引號的使用
# 雙引號
echo "當前文件: $var"
- 打印的時候會將var中的值取出并輸出
# 單引號
echo '當前文件: $var'
- 將字符串原樣輸出
3 、條件判斷和循環
- shell腳本中的if條件判斷
# if語句
# 注意事項:
- if 和 []直接有一個空格
- [ 條件 ] : 條件的前后都有空格
- else if => elif
-
if [ 條件判斷 ];then
邏輯處理 -> shell命令
xxx
xxxx
xxxx
fi
# ===================
if [ 條件判斷 ]
then
邏輯處理 -> shell命令
xxx
xxx
fi
# if ... elif .. fi
if [ 條件判斷 ];then
邏輯處理 -> shell命令
xxx
xxxx
xxxx
elif [ 條件判斷 ];then
shell命令
elif [ 條件判斷 ];then
shell命令
elif [ 條件判斷 ];then
shell命令
else
shell命令
fi
//-------------------------------------------------------------------------------
# if.sh
#!/bin/bash
# 需要對傳遞到腳本內部的文件名做判斷
if [ -d $1 ];then
echo "$1 是一個目錄!"
elif [ -s $1 ];then
echo "$1 是一個文件, 并文件不為空"
else
echo "$1 不是目錄, 有可能不存在, 或文件大小為0"
fi
-
- shell腳本for循環
# shell中的循環 for/ while
# 語法: for 變量 in 集合; do;done
for var in 集合;do
shell命令
done# for.sh
#!/bin/bash
# 對當前目錄下的文件進行遍歷
list=`ls`
for var in $list;do
echo "當前文件: $var"
echo '當前文件: $var'
done
4、shell腳本中的函數
# 沒有函數修飾, 沒有參數, 沒有返回值
# 格式
funcName(){
# 得到第一個參數
arg1=$1
# 得到第2個參數
arg2=$2
函數體 -> shell命令 + 邏輯循環和判斷
mkdir /root/abc
}
# 沒有參數列表, 但是可以傳參
# 函數調用
funcName aa bb cc dd
# 函數調用之后的狀態:
0 -> 調用成功
非0 -> 失敗
#!/bin/bash
# 判斷傳遞進行來的文件名是不是目錄, 如果不是, 創建...
# 定義函數
is_directory()
{
# 得到文件名, 通過參數得到文件名
name=$1
if [ -d $name ];then
echo "$name 是一個目錄!"
else
# 創建目錄
mkdir $name
if [ 0 -ne $? ];then
echo "目錄創建失敗..."
exit
fi
echo "目錄創建成功!!!"
fi
}
# 函數調用
is_directory $1