鸟哥私房菜中,对这一内容的描述,简直让人看不懂,好不容易找来文章可以帮助理解下。
linux中对shell变量内容的修改和替换
1.变量内容修改
file=/dir1/dir2/dir3/my.file.txt
可以用 ${ } 分别替换获得不同的值:
${file#*/}: 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}: 拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}: 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}: 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
${file/.txt/.cpp} 将.txt取代为.cpp:/dir1/dir2/dir3/my.file.cpp
2.有条件的变量替换
${variable: -value}
变量替换时将使用命令行中定义的默认值,但变量的值并没有因此而改变。
例:$echo Hello $UNAME
结果显示:Hello
$echo Hello ${UNAME: -there}
结果显示:Hello there
$echo $UNAME
结果显示: (空)
$UNAME=John
$echo Hello ${UNAME: -there}
结果显示:Hello John
${variable:=value}
不但使用默认值进行替换,而且将默认值赋给该变量。该形式在变量替换后同时把值value符给变量variable。
例:$echo Hello $UNAME
结果显示:Hello
$echo Hello ${UNAME:=there}
结果显示:Hello there
$echo $UNAME
结果显示:there
${variable: +value}
只有当变量已赋值时才用指定值替换,变量variable已赋值时,其值才用value替换,否则不进行任何替换。
例:$ERROPT=A
$echo ${ERROPT: +"Error tracking is acitive"}
结果显示:Error tracking is acitive
$ERROPT=
$echo ${ERROPT: +"Error tracking is acitive"}
结果显示: (空)
${variable:?message}
使用错误检查的条件进行变量替换,当变量variable已设置时,正常替换。
例:$UNAME=
$echo $ {UNAME:?"UNAME HAS NOT BEEN SET"}
结果显示:UNAME HAS NOT BEEN SET
$UNAME=Stephanie
$echo ${UNAME:?"UNAME HAS NOT BEEN SET"}
结果显示:Stephanie
3.在操作中的使用
集体增加后缀
find . ! -type d |xargs -i mv {} {}.c;
find . ! -type d -exec mv -f {} {}.suf \;
把*.txt 变成 *.cpp
方法一
for file in `find ./ -name "*.txt" -type f`;do mv $file ${file%.*}.cpp;done
方法二
rename .txt .cpp *.txt