[轉]shell腳本命令和用法

$#:代表命令行參數個數

$*:代表所有參數

$n:第n個參數

$?:代表最後一個命令返回值

$$:代表當前shell的進程號PID

$是變量的引用符

 

= 是最基本的賦值

:= 是覆蓋之前的值

?= 是如果沒有被賦值過就賦予等號後面的值

+= 是添加等號後面的值

 

declare: //定義變量


declare -a array //數組

declare -i sum=10+20 //整型

declare -x var //定義爲環境變量

declare -r var=456 //定義爲只讀的變量 不能用unset

 

read 命令: //從鍵盤讀入數據,賦值給變量;


-x read 時顯示腳本執行的過程(用於調試) 執行腳本時也可加-x

-t read -t 2 tmp 2秒鐘超時

-n read -n 3 tmp 讀入3個字符自動返回

-p read -p "please input " <<====> echo -n "please input : "

-s read -p "please input :" -s passwd 以密碼形式讀入

僞代碼用例

declare -i score //定義一個變量
 
read -p "input a int score:" score
 

echo 命令


echo -n "hello world" 不輸出回車符

echo -e "\033[31mking\033[0m" 支持終端控制碼命令m顏色屬性
30--37前景色
40-----47 背景色

\033[0m恢復默認顏色屬性

\033[45;36m設置背景爲45前景爲36

"\033[y;xH \033[10;25h" 把光標置於10行25列處

\033[K 清除光標行的內容

\033[u 恢復光標位

\033[s 保存當前光標位

 

test

// 與文件存在與否的判斷
-e 是否存在
-f 是否爲普通文件
-d 是否爲目錄
-s 是否爲非空的文件
-p 是否爲管道文件
-b 是否爲塊設備文件
-c 是否爲字符設備文件
-L 是否爲軟鏈接
-S 是否Socket文件


//與文件權限有關的判斷
-r 是否有可讀的權限
-w 是否有可寫的權限
-x 是否有可執行權限
-u 是否有特權位
-g 是否有組特權位
-k 是否有t位,即粘貼位


//兩個文件的比較判斷
-nt 比較file1比file2新
-ot 比較file1比file2舊
-ef 比較file1和file2是否爲同一個文件,一般用於判斷硬鏈接


//整數之間的大小判斷
-eq 相等
-ne 不等於
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於


//字符串之間的判斷
-z 是否爲空字符串
-n 是否爲非空字符串
str1 = str2 是否相等
str1 != str2 是否不等
test -d file 測試是否爲目錄
test -e file 是否存在
test -s file 文件大小是否不爲0


//多重條件判斷
-a 兩個條件同時滿足,就爲真,相當於and
-o 兩個條件滿足其一,就爲真,相當於or

 

(()) 也可判斷和test一樣,可以直接使用比較符號,支持C語言格式

 

 

regular變量的特殊其它引用及處理方法


$var 引用var變量的值
${var} 引用var變量的值
${var%a*} 引用var變量的值並且截取a左邊的字符串顯示,如果字符串有多個a,則按從左向右最後一個a截取
${var%%a*} 引用var變量的值並且截取a左邊的字符串顯示,如果字符串有多個a,則按從左向右第一個a截取
${var#*a} 引用var變量的值並且截取a右邊的字符串顯示,如果字符串有多個a,則按從左向右第一個a截取
${var##*a} 引用var變量的值並且截取a右邊的字符串顯示,如果字符串有多個a,則按從左向右最後一個a截取
${var:3} 引用var變量的值並且從第3個字符開始截取
${var:3:6} 引用var變量的值並且從第3個字符開始截取,截取6個字符顯示
${#var} 返回var變量值的長度
${var/a/b} 替換變量值的字符串,這裏是把var變量值裏的a換成b,如果有多個a也只能換一次
${var//a/b} 替換變量值的字符串,這裏把var變量值裏的a全換成b


if的各種形式


if test 6 -eq 5 -a 7 -gt 8
if [ 6 -eq 5 ] && [ 7 -gt 8 ]
if [ 6 -eq 6 -a 9 -gt 8 ]
if test 6 -eq 5
if ((6==5))
if test $score -lt 0 -o $score -gt //100小於0或者大於100

 

 

用法:

求變量的長度

 

len=${#num}
求出字符串的長度

    expr length "this is a test" 
 
    
    14 //輸出

 

數字商數 模運算

expr 14 % 9
    5 //輸出

 

從位置處抓取字串

expr substr "this is a test" 3 5 //遇到空格停止
     is is //輸出

 

數字串 only the first character 字符e第一次出現在串的位置

expr index "testforthegame" e
    2 //輸出

 

產生1000以內的隨機數

num=$(($RANDOM % 1000))
 

檢查是否爲整數

expr $num + 100 &> /dev/null //不顯示任何東西
if [ $? -ne 0 ]
then
    echo "input error!"
    exit 1
fi
 

檢測用戶是否存在

#!/bin/bash
 
 
 
if [ $? -ne 0 ]
 
then
 
  echo "user nonexistent"
 
  exit 1
 
fi
 
echo "$uid"
 
exit 0
 
 
 
#-n表示位數
 
read -p "input a key:" :-n 1 key
 

判斷某個文件是否存在,如果存在則判斷是否爲空文件 如果爲空實現刪除

#./xxx.sh /var/ftp/pub/ttt.txt
if [ $# -ne 1 ]
then
    echo -e "\033[31muse:$0 filePath\033[0m"
    exit 1
fi
#是否存在 '!'取假
fname=$1
if ! test -e $fname
then
    echo -e "\033[31m$fname is not exist\033[0m"
    exit 2
fi
#判度是否爲普通文件
if [ -f $fname ] #if test -f $fname
then
#判斷是否爲空文件
if ! test -s $fname
then
    rm -rf $fname
if [ $? -eq 0 ]
then
    echo "$fname is empty file,del..."
fi
fi
else
    echo "is not file!!!"
fi
 
exit 0
 

輸入某個IP 並測試是否可一通信 如果能打印YES 否則NO

read -p "input a ip:" ip
#檢查IP是否合法
ping -c 1 $ip &> /dev/null
if [ $? -eq 0 ]
then
    echo "Yes."
else
    echo "NO."
fi
 

檢查輸入是否爲數字

read -p "input a int number:" num
len=${#num}
for i in $(seq 0 $((len-1)))
do
n=${num:$i:1}
case $n in
[[:digit:]])
;;
*)
echo "input error!!!"
exit 1
;;
esac
 
done
 

將當前目錄下所有的.txt文件都改成.doc

#!/bin/bash
 
FILES='ls ./*.txt'
 
for txt in $FILES
 
do
 
     doc='echo $txt | sed "s/.txt/.doc"'
 
     mv  $txt  $doc
 
done
 

設計一個shell程序,備份並壓縮/etc目錄的所有內容,存放在/root/bak目錄裏,且文件名爲如下形式yymmdd_etc,yy爲年,#mm爲月,dd爲日

#! /bin/bash
 
DIRNAME='ls /root| grep bak'
 
if [ -z "$DIRNAME" ]
 
then
 
    mkdir /root/bak
 
    cd /root/bak
 
fi
 
YY='date % y'
 
MM='date % m'
 
DD='date % d'
 
BACKETC=$YY$MM$DD_etc.tar.gz
 
tar -zcvf $BACKETC /etc
 

Reference:

https://blog.csdn.net/haofeng_ma/article/details/80864799

 

發佈了358 篇原創文章 · 獲贊 41 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章