shell字符串操作 正则表达式 读取终端和文件 特殊文件说明 文件覆盖策略

2015-05-29 22:10:00
admin
原创 3379
摘要:shell字符串操作 正则表达式 读取终端和文件 特殊文件说明 文件覆盖策略

一、shell字符串操作

1、字符串拼接:直接拼接,不使用任何符号;

2、字符串长度:${#str}、expr length "$str"

3、字符串去除空格:str=`echo "$str" | sed "s/[ \t]//g"`

4、字符串去除首尾空格:str=`echo "$str" | grep -oP "[^ \t]+([ \t]+[^ \t]+)*"`


变量内容检查:

1、https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion

2、${parameter:-word},变量未设置或为空时,不设置变量,返回默认值;

3、${parameter:=word},变量未设置或为空时,设置变量,返回默认值;


变量内容替换:

1、${file/dir/path},将第一个dir替换为path,结果/path1/dir2/file.txt.txt
2、${file//dir/path},将全部dir替换为path,结果/path1/path2/file.txt.txt


计算子串索引,索引从1开始,index支持字符串查找,match支持正则表达式查找:

1、echo "this is string" | awk '{printf("%d\n",index($0,"is"))}'

2、echo "this is string" | awk '{printf("%d\n",match($0,"is"))}'


变量子串:

1、${var:off:len},索引从0开始,长度不写表示取到字符串末尾,${file:0:5}提取最左边的5个字节;

2、expr substr "goodnight" 1 4,substr STRING POS LENGTH,索引从1开始;


变量子串,#去掉左边,%去掉右边:

1、file=/dir1/dir2/file.txt.txt

2、${file#*/},拿掉第一个/及其左边的字符串,结果dir1/dir2/file.txt.txt
3、${file##*/},拿掉最后一个/及其左边的字符串,结果file.txt.txt

4、${file%.*},拿掉最后一个.及其右边的字符串,结果/dir1/dir2/file.txt
5、${file%%.*},拿掉第一个.及其右边的字符串,结果/dir1/dir2/file


二、shell正则表达式

1、Bash3.0开始内置正则表达式,BASH_REMATCH变量存储匹配结果;

2、字符串包含正则表达式时,整个表达式返回真;

3、点符号匹配任意字符;


[[ "i am feinen" =~ [a-z\ ]*(feinen) ]]

echo ${BASH_REMATCH[*]} 输出i am feinen feinen


[[ "i am feinen" =~ .*(feinen) ]]

echo ${BASH_REMATCH[*]} 输出i am feinen feinen


[[ "i am feinen" =~ (feinen) ]]

echo ${BASH_REMATCH[*]} 输出feinen feinen


三、读取终端和文件

读取标准输入:

echo -n "Enter your name: "
read name

read -p "Enter your name: " name


默读标准输入:read -s password

读取文件内容:var=$(<file),忽略文件尾部的空白字符。


逐行读取文件,如果最后一行没有换行符,则最后一行无法读出。

方法1:

while read myline
do
echo $myline
done <file

方法2:

cat file | while read myline
do
echo $myline
done


四、linux特殊文件说明

/dev/null,空设备是特殊的设备文件,丢弃一切写入其中的数据,读取它则会立即得到一个EOF。

丢弃控制台输出:

>/dev/null 2>&1

1>/dev/null 2>&1

1>/dev/null 2>/dev/null

清空文件内容:

cat /dev/null >main.txt

>main.txt


/dev/zero,读它的时候提供无限空字符(NULL, ASCII NUL, 0x00),写入它的数据丢失不见。

/dev/zero主要用来创建指定长度的空文件,比如临时交换文件:

dd if=/dev/zero of=main.cpp bs=4M count=1,复制4M的内容;

dd if=/dev/zero of=main.cpp bs=512K count=1,复制512K的内容;


dd用于复制和转换文件,具有cp的功能,但比cp更强大,常用参数:

1、bs,read and write BYTES bytes at a time

2、if,read from FILE instead of stdin

3、of,write to FILE instead of stdout

4、单位包括:c=1、K=1024、M=1024*1024


五、文件覆盖策略

mkdir tmp,如果目录或者文件存在直接返回失败。

mkdir -p tmp,如果目录存在,不进行创建返回成功。


cp、mv、rm:i参数优先级高于f参数。

dd:等价于强制复制,dd if=/dev/zero of=myfile bs=512K count=1。


tar类似cp操作,但有以下区别:

创建压缩包时,会先删除原有压缩包,再创建一个全新压缩包。

解压时强制复制,如果不能复制,会先删除再进行复制。所以跨类型操作允许,目录和文件双向。

发表评论
评论通过审核之后才会显示。