Bash ${}及其它

  • Post author:
  • Post category:其他


bash ${} 属于参数替换一类,用man bash 可以输出完整帮助文档,查找参数替换部分可阅读帮助.

一: bash 字符串操作:

例: FILE_NAME=”/usr/local/world.txt”

1. 取字符串长度

${#FILE_NAME}

2. 取子串

${FILE_NAME:10}    #从位置10开始取字串

${FILE_NAME:5:10}    #从位置5开始,取10个字符


3. 删除字符串(匹配)

${FILE_NAME##*/}    #删除从左开始到/ 止的所有字符, 最大匹配

${FILE_NAME#*/}        #删除从左开始到/ 止的所有字符, 最小匹配

${FILE_NAME%%/*}    #删除从右开始到左/ 止的所有字符,最大匹配

${FILE_NAME%/*}        #删除从右开始到左/ 止的所有字符,最小匹配

关键是理解#,%,*元字符的作用,#是左,%是右开始,*多字符匹配。左trim,右trim之意!

上面那个/是普通的字符。不要混淆。

另见例子:

${FILE_NAME#*local}, ${FILE_NAME##*local}

${FILE_NAME%local*} ${FILE_NAME%%local*}


4. 替换字符串 (也使用匹配操作)

${FILE_NAME/world.txt/hello.txt}     # 将world.txt 替换成hello.txt

${FILE_NAME//w/W}            # 将w 全部换成 W

/元字符是查找替换之意

就是说它有左trim, 右trim 及查找替换功能.

对应的函数原型为:

${#string}  $string的长度

${string:position}  在$string中, 从位置$position开始提取子串

${string:position:length}   在$string中, 从位置$position开始提取长度为$length的子串

${string#substring}     从变量$string的开头, 删除最短匹配$substring的子串

${string##substring}    从变量$string的开头, 删除最长匹配$substring的子串

${string%substring}     从变量$string的结尾, 删除最短匹配$substring的子串

${string%%substring}    从变量$string的结尾, 删除最长匹配$substring的子串

${string/substring/replacement}     使用$replacement, 来代替第一个匹配的$substring

${string//substring/replacement}    使用$replacement, 代替所有匹配的$substring

可见, bash 内置函数,其函数名称,输入参数,调用方法,返回值与|C 非常不同。

它用了一种更简单的书写方式。

${}内对变量进行赋值和变量引用, 用echo 命令可以实验

=变量不存在,赋值并传回,有值(包括空值)无操作,但会传回原来值

:=变量不存在或为空,赋值并传回

-变量不存在,传回默认值,有值传原值

:-变量不存在或为空,传回默认值,非空值传回原值

+变量不存在,不操作,有值时用新值覆盖

:+变量不存在或为空,不操作,非空用新值覆盖

?变量不存在,新值输出至STDERR

:?变量不存在或为空,新值输出至STDERR

举例:

${file=my.file.txt}  :若$file 不存在,则使用 my.file.txt 作传回值,同时将$file 赋值为 my.file.txt.

${file:=my.file.txt} :若$file 不存在或为空值,则使用my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt .

${file-my.file.txt}  :若$file 不存在,则使用 my.file.txt 作传回值。

${file:-my.file.txt} :若$file 不存在或为空值,则使用 my.file.txt 作传回值。

${file+my.file.txt}  :若$file 不存在,不做处理,若为空值或非空值,均使用 my.file.txt 作传回值.

${file:+my.file.txt} :若$file为非空值,则使用 my.file.txt 作传回值。

${file?my.file.txt}  :若$file 不存在,则将 my.file.txt 输出至 STDERR。

${file:?my.file.txt} :若$file 不存在或为空值,则将 my.file.txt 输出至 STDERR。

${var:n:m} 取字串,前面有例子

${var} (%,#,%%,##)操作根据模板删除字串,前面说过

(//) 字符串替换,前面说过。

二: Bash 取得命令行参数

$#, $1,$2,$3

枚举命令行参数: for a in $@ { echo $a; }

—————————————-

三:执行bash如何让命令回显?

bash -v test.sh

或#!/bin/bash -v

-x 执行前打印

-n 只运行不执行

—————————————-

四: bash 输出等宽数字到变量

$ printf -v str “%06d\n” 15

$ echo $str

000015

—————————————-

其它: bash 替换字符串中的/为空格, 还得借助sed 才比较方便:

echo $FILE_NAME |sed ‘s#/# #g’

—————————————-

五: bash 的执行顺序:

—————————————-

别名,函数,内置命令,外部命令

—————————————-

六:关于bash的有用的几个辅助命令

—————————————-

alias 显示所有alias 定义

declare -F 显示所有的函数定义

declare -f 显示所有的函数定义及内容

help 给出所有的内部命令的帮助, 具体的帮助用 help <item>

hash -l 显示命令hash表

enable 判断一个命令是否是内置命令, 例如: enable ls

enable -a 列出所有的内部命令

type 也可以判断一个命令是什么类型,例如: type ls

alias,declare,enable,hash,type都是内置命令。

最常见和常用的内置命令是cd 命令,其次pwd.alias 命令,

写脚本语言常用的if then,fi;while do,done;for do,done; case in,esac;也是内部命令

用help,及enables 查看所有内部命令。



版权声明:本文为hejinjing_tom_com原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。