一個例子學會shell腳本(第一章)

篇幅很長,記錄待查。

一、變量

#變量分爲二種方式:系統變量,自設變量,形式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
~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章