shell 腳本之獲取命令輸出字符串以及函數參數傳遞


在ubuntu 14.04之后,所有的U盤掛載也分用戶之分,最近很多操作也和U盤有關,所以就研究了一上午shell腳本函數以及字符串操作的方法。

字符串操作:

獲取他的命令輸出比較簡單,打個簡單的比方,我想獲取whoami 的用戶名,那么直接可以使用如下代碼。
```sh
#!/bin/sh                                                                       
                                                                            
                                                                            
USER_NAME=$(whoami)                                                             
                                                                            
main() {                                                                        
                                                                            
    sudo cp target/*    /media/$USER_NAME/rootfs/ -rf                           
}                                                                               
                                                                            
main                                                                            
```
```sh
#如果你想操作這些字符串的話,那么可以有以下方法
#shell中截取字符串的方法有很多中,
${expression}一共有9種使用方法。
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word} 
#上面4種可以用來進行缺省值的替換。

${#parameter}
# 上面這種可以獲得字符串的長度。 

${parameter%word} 最小限度從后面截取word
${parameter%%word} 最大限度從后面截取word
${parameter#word} 最小限度從前面截取word
${parameter##word} 最大限度從前面截取word
# 上面4個就是用來截取字符串的方法了。
# 有了着四種用法就不必使用cut命令來截取字符串了

#第一種又可以分為四種情況,下面一一介紹。
#1、使用 # 號操作符。用途是從左邊開始刪除第一次出現子字符串即其左邊字符,保留右邊字符。用法為#*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str#*//}
# 得到的結果為www.你的域名.com/cut-string.html,即刪除從左邊開始到第一個"//"及其左邊所有字符

#2、使用 ## 號操作符。用途是從左邊開始刪除最后一次出現子字符串即其左邊字符,保留右邊          字符。用法為##*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str##*/}    
# 得到的結果為cut-string.html,即刪除最后出現的"/"及其左邊所有字符

#3、使用 % 號操作符。用途是從右邊開始刪除第一次出現子字符串即其右邊字符,保留左邊字符。用法為%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%/*}
# 得到的結果為http://www.你的域名.com,即刪除從右邊開始到第一個"/"及其右邊所有字符

#4、使用 %% 號操作符。用途是從右邊開始刪除最后一次出現子字符串即其右邊字符,保留左邊字符。用法為%%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%%/*}
# 得到的結果為http://www.你的域名.com,即刪除從右邊開始到最后一個"/"及其右邊所有字符

# 第二種也分為四種,分別介紹如下:
# 1、從左邊第幾個字符開始以及字符的個數,用法為:start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:0:5}
# 其中的 0 表示左邊第一個字符開始,5 表示字符的總個數。
# 結果是:http:

2、從左邊第幾個字符開始一直到結束,用法為:start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:7}
# 其中的 7 表示左邊第8個字符開始
# 結果是:www.你的域名.com/cut-string.html

# 3、從右邊第幾個字符開始以及字符的個數,用法:0-start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}
# 其中的 0-6 表示右邊算起第6個字符開始,10 表示字符的個數。    
# 結果是:cut-string

# 4、從右邊第幾個字符開始一直到結束,用法:0-start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}
# 其中的 0-6 表示右邊算起第6個字符開始,10 表示字符的個數。
# 結果是:html
# 注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)
```sh

函數參數傳遞

#!/bin/sh

SDCARD_BOOT=/media/chen_7109/boot
SDCARD_ALL=/media/chen_7109/*

# Copy image to sd card boot partition
mycptosd() {
    cp  am335x-sbc7109.dtb  MLO  u-boot.img  uEnv_emmc.txt  uEnv.txt  zImage /media/chen_7109/boot/  -rf
    sync
    echo    "Copy Image to sdcard over ....."
}

# The main function
main () {
    if [ -e $SDCARD_BOOT ]; then
        mycptosd
        if [ 1 -eq $# ]; then
            if [ "$1" = "umount" ]; then
                sudo umount $SDCARD_ALL
            else
                echo "Please input arguments "umount" to umount sd card"
            fi
        else
            echo "You can input arguments of "umount" to umount sd card"
        fi
    else
        echo "No such file of sd card boot partition"
    fi
}


# Main Start ....
if [ 1 -eq $# ];then
    main $1
else
    main
fi

上面這個腳本中,本來要傳遞到main的一個參數的,我一開始以為在shell  外面直接帶一個參數就可以傳到main()函數內部,
發現這樣是不可以的,shell里面的函數調用的時候參數是獨立的參數,所以只能用main $1 的方式將參數傳遞進去。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM