篇幅很長,記錄待查。
一、變量
#變量分爲二種方式:系統變量,自設變量,形式var=value 使用$var
echo $PATH # PATH的內容
hello="hello world"
echo $hello # hello world
#變量可以接受命令執行的結果,形式 var=$() 或 var=``
path=$(pwd)
files=`ls -al`
echo current path:$path
echo files:"$files"
#一個執行時間計算的案例
begin=$(date +%s) # date +%s格式化時間爲秒制
sleep 2s
end=$(date +%s)
runtime=$((end-begin))
echo $runtime # 結果2
二、數學計算
expr 10+3 # 10+3
expr 10 / 3 # 3
expr 10 % 3 # 1
expr 10 \* 3 # 30
num1=$(expr 10 % 3)
num2=`expr 10 % 3`
echo $num1$num2
echo ..................忘記上面的方式
echo '採用 $[] $(())'
num1=3
num2=4
num3=$[$num1+$num2]
num4=$(($num1+$num2))
num5=$[3+4]
num6=$((3+4))
echo $num3$num4$num5$num6
echo '備註:字符串拼接可以用""(解析變量)或''(不解析變量)',加不加"在於是否有空格和特殊符
echo '比如 我在/etc/profile 內輸入$PATH的字符串,如果用"就會解析$Path的內容
,但是實際上我們需要的是$Path字符串輸入到/etc/profile內'
三、字符串截取等操作
#3.1 字符串截取
url="http://www.baidu.com/admin/index.html"
echo $url
echo "${url: 2: 3}"'截取2開始3個'
echo "${url: 0-12}"'截取最後開始12個'
echo "${#url}"'字符串長度'
echo "${url#*/}"'截取第一個/的右邊'
echo "${url##*/}"'截取最後一個/的右邊'
echo "${url%%/*}"'左邊'
echo "${url%/*}"'左邊'
#3.2 字符串替換
str=www.baidu.com.cn
echo ${str/\.//}'格式:${str/old_char/new_char}'
echo ${str//\.//}'格式: ${str//old_char/new_char}'
四、數組的操作
nums=(24 22 55 66)
echo "數組所有元素"${nums[@]}
nums[4]=99
echo "數組所有元素"${nums[*]}
echo "數組第二個元素"${nums[1]}
echo "數組長度"${#nums[@]}
五、if語句
#1、接受命令參數爲if條件(命令執行成功就執行)
if pwd
then
echo '命令成功執行'
fi
#2、[]條件,使用時注意各種間隔,並且<>需要用-gt或-lt等
if [ $(ps -ef | grep -c "ssh") -gt 1 ];then echo "true"; fi
#3、[[]]條件,無視上一條注意點,但是一般用於字符串的比較。
var1=test1
var2=test2
if [[ $var1 < $var2 ]]
then
echo "var1小"
else
echo "var2小"
fi
#4、數字比較建議用 (())格式
var1=100
var2=200
if [ $var1 -lt $var2 ]
then
echo 'var1小'
fi
var1=100
var2=200
if (($var1 < $var2))
then
echo 'var1小'
fi
六 、for語句 和while語句
#1、採用(())常規模式
for((i=1;i<=10;i++))
do
echo $[$i * 3 + 1];
done
#2、採用 for var in arr 模式
for i in $(seq 1 10)
do
echo $[$i * 2 +1];
done
for i in `ls`
do
echo $i is file name ;
done
#備註 字符串會用" "切割成數組遍歷
list="abc bcd def efg"
for i in $list
do
echo $i is appoint;
done
for f in $(ls *.sh)
do
name=$(echo "$f" | awk -F. '{print $1}')
echo $name;
done
# 累加操作
i=1
while(($i<100))
do
i=$(($i+1))
echo $i
done
min=1
max=105
while [ $min -le $max ]
do
echo $min
min=$[$min+1]
done
#演示break 跳出循環
a=1
while [ $a -le 5 ]
do
if [ $a -eq 3 ]
then
break
fi
echo "a=$a"
a=$[$a+1]
done
七、$特殊變量
#腳本內的參數獲取
echo "文件全名是 $0"
echo "基礎名稱是 $(basename $0)"
echo "輸入路徑是 $(dirname $0)"
echo -n "正確獲取當前文件的絕對路徑的目錄:"
echo "$(cd "$(dirname "$0")";pwd)"
echo 第一個參數是$1
echo 第二個參數是$2
echo 第三個參數是$3
echo 所有的參數是$@
echo 參數長度是$#
for param in $@
do
echo $param
done
# 方法內獲取參數類似!!
myfn() {
local sum=0
echo "方法參數$1"
echo "方法參數$2"
echo "方法所有的參數$@"
for param in $@
do
sum=$(( $param + $sum ))
done
return $sum
}
echo ............
myfn 33 44 55
echo #獲取方法返回值或者shell命令的返回值$?
八、方法(定義 fn() {} 使用 fn param1 param2 )
sumNums() {
local sum=0;
for i in $@
do
sum=$((sum+i))
done
return $sum
}
sumNums 1 2 3 4 5
echo $?
check() {
local in=$1;
if(( in < 100 ))
then
echo "lt 100"
else
echo "gt 100"
fi
}
check 500
echo $?
echo ##############################
echo "下面演示的是文件本身作爲命令時,退出狀態值的演示"
echo '在外部命令執行時,帶一個參數,並且在外部用$? 接受結果'
out_param=$1
if [ -n "$out_param" ];then
if(( $out_param < 100 ))
then
exit 0
else
exit 1
fi
九、read讀取輸入
# 讀取輸入的y或n
echo -n "please write (y/n)"
read choice
echo "your choice : $choice"
# 延時5秒,帶註釋讀取,如果有效期內打印輸入的值
if read -t 5 -p "Please enter your name: " name
then
echo "Hello $name"
else
echo "Sorry, timeout! "
fi
# 演示當前目錄的文件目錄選擇提示創建或者刪除
echo ..........................................
param=$1
echo $param
if [ -n "$param" ]
then
if [ -e "$param" ]
then
echo "文件存在,輸入y,則創建,輸入n則刪除"
if [ "$(read name)" == "y" ]
then
echo "創建目錄"`mkdir $param`
else
echo "刪除目錄"`rmdir $param`
fi
else
mkdir $param
fi
else
echo "參數沒有指定"
fi
~