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"
}
- 将空格替换成制定字符,然后在函数中解析
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