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='www.你的域名/cut-string.html'
echo ${str#*//}
# 得到的结果为www.你的域名/cut-string.html,即删除从左边开始到第⼀个"//"及其左边所有字符
#2、使⽤ ## 号操作符。⽤途是从左边开始删除最后⼀次出现⼦字符串即其左边字符,保留右边字符。⽤法为##*substr,例如:
str='www.你的域名/cut-string.html'
echo ${str##*/}
# 得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符
#3、使⽤ % 号操作符。⽤途是从右边开始删除第⼀次出现⼦字符串即其右边字符,保留左边字符。⽤法为%substr*,例如:
str='www.你的域名/cut-string.html'
echo ${str%/*}
# 得到的结果为www.你的域名,即删除从右边开始到第⼀个"/"及其右边所有字符
#4、使⽤ %% 号操作符。⽤途是从右边开始删除最后⼀次出现⼦字符串即其右边字符,保留左边字符。⽤法为%%substr*,例如:
str='www.你的域名/cut-string.html'
echo ${str%%/*}
# 得到的结果为www.你的域名,即删除从右边开始到最后⼀个"/"及其右边所有字符
# 第⼆种也分为四种,分别介绍如下:
# 1、从左边第⼏个字符开始以及字符的个数,⽤法为:start:len,例如:
str='www.你的域名/cut-string.html'
echo ${var:0:5}
# 其中的 0 表⽰左边第⼀个字符开始,5 表⽰字符的总个数。
# 结果是:http:
2、从左边第⼏个字符开始⼀直到结束,⽤法为:start,例如:
str='www.你的域名/cut-string.html'
echo ${var:7}
# 其中的 7 表⽰左边第8个字符开始
# 结果是:www.你的域名/cut-string.html
# 3、从右边第⼏个字符开始以及字符的个数,⽤法:0-start:len,例如:
str='www.你的域名/cut-string.html'
echo ${str:0-15:10}
# 其中的 0-6 表⽰右边算起第6个字符开始,10 表⽰字符的个数。
# 结果是:cut-string
# 4、从右边第⼏个字符开始⼀直到结束,⽤法:0-start,例如:
str='www.你的域名/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      zImage /media/chen_7109/boot/  -rf
sync
echo    "Copy Image to sdcard over ....."shell 字符串长度
}
# 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 的⽅式将参数传递进去。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。