shell编程tips;数组操作;管道符后读不到变量;带空格的参数;grep搜索的变量中有空格、换行符

shell 脚本经验:

获取目录名,文件名,后缀

dirname
basename
${string#*chars}
从 string 字符串第一次出现 *chars 的位置开始,截取 chars 右边的所有字符。
${string##chars}
从 string 字符串最后一次出现 *chars 的位置开始,截取 chars 右边的所有字符。
${string%chars}
从 string 字符串第一次出现 *chars 的位置开始,截取 chars 左边的所有字符。
${string%%chars}
从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

数 组操作:

声明:
array=() 空数组
追加:
array=($array[@] item)
赋值:
array[i]=a
数组长度:
${#array[@]}
删除:
unset array[i]
删除整个数组:
unset array

数值变量;local变量声明

shell里默认使用全局变量,局部变量使用local 声明;尤其函数中:嵌套调用注意;函数中用local声明;否则会用到上层调用函数的变量。

for i到n

let i=0
while [ $i lt 100 ]
do
let i+=1
...
done

文件读一行

cat filename | while read line
do
	echo $line
done

管道符后的命令子shell中,无法访问

如上,使用管道符| ,管道符后while内无法使用全局变量:

let a=0
cat $filename | while read line
do
 echo $line
 let a+=1
 echo "a=$a"   #out: 1
done
echo "a=$a"     #out :  0
``

管道符后是在子shell中执行的,子shell无法获取父shell的变量。
解决不用管道符用重定位

while read line
do
....
done < $filename 

参数$表示意义

$0 文件名
参数从$1 开始
$# 参数个数,不包括脚本文件名!

有空格的参数处理

传参时用双引号 “ ” ;在解析时也要“ ”
1.

a=nihao shijie
func "$a"
function func()
{
local a="$1"
echo "a:$a"
}
  1. 将空格替换成制定字符,然后在函数中解析
new_str=echo @old_str | sed 's/ /,/g'; 
#将空格替换成',';确保这个替换的符号原来的字符串不会出现。
func $new_str
function func()
{
	local new_str=$1
	local raw_str=echo $new_str | sed 's/,/ /g' #注意echo后会给字符串添加换行符导致后面一系列操作有问题;
	#将换行符去掉
	raw_str=echo $new_str | sed ‘s/[\r\n]//g’
}

sed 不从文件读从字符串读内容;echo命令

如上

echo 命令会自动加换行符;grep 时不对;

如上;对raw_str;进行grep搜索,但是搜索不到结果;echo $raw_str出来显示也正常;但是grep错误:

local new_str=$1
 local raw_str=echo $new_str | sed 's/,/ /g' 
 echo "raw_str:$raw_str"  #显示正确
 grep $raw_str $filename显示错误
 #将换行符去掉
# raw_str=echo $new_str | sed ‘s/[\r\n]//g’
}

grep中有空格

使用[[:space:]] 或者‘\ ’将空格转义

grep nihao\ shijie file.txt -n
grep nihao[[:space:]]hijie file.txt -n

用pushd popd不要用cd -

cd - 只能记住old_pwd; 只有一层;只能记住一级目录;而pushd,popd 相当于栈,函数调用,访问多级目录可以返回。

屏蔽多行

if false; then
#屏蔽内容
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值