Shell编程-基础
Posted 人塞不能怨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程-基础相关的知识,希望对你有一定的参考价值。
Shell编程-从基础到进阶
可执行文件
#创建并编辑脚本
touch cha01.sh
chmod u+x cha01.sh
------------------
#!/bin/bash
...
------------------
#执行脚本并根据需要传参
./PATH/cha01.sh PARAM[PARAM2 ... PARAMN]
#脚本中如何解析参数
$# #表示参数的数量
$n #表示第n个参数的值
变量
#变量
VAR_NAME=VALUE #声明并负值,等号右边的值决定了左边变量的数据类型
unset VAR_NAME #取消变量
echo $VAR_NAME #使用变量需要加 $
#将命令结果存入变量
RST=`ls /etc/profiled.` #[反引号执行命令有阻塞功能]
RST=$(ls /etc/profile.d)
#当命令中出现变量导致不能正常执行
#解决方案一:先将命令字符串拼接完成,再以命令的方式执行
RST="mv $SOFTWARE_DIR$RST $SOFTWARE_DIR'jdk'"
RST=$RST
#解决方案二:用eval表达式完成拼接和命令转换执行的过程
eval mv $SOFTWARE_DIR$RST $SOFTWARE_DIR'jdk'
#双引号中可以传入参数
“$RST”
#单引号只当字符串处理
'$RST'
算数表达式
#算数表达式
((ARITHMETIC_EXPRESSION))
((VAR++)) #自增
#数学计算
#1.let
#2.(())
#3.使用$[[]]
#4.使用expr
#5.bc
#6.使用awk
分支结构
#单分支
if []
then
...
fi
#双分支
if []
then
...
else
...
fi
#多分支
if []
then
...
else if []
then
...
else
...
fi
#条件表达式的书写规范
if [ $VAR -gt/ge/lt//le/eq/ne $VAR2/CONST -a/-o CONDITION2 ]
if (($VAR>=CONST && $VAR<top))
if [[ $VAR=~REGEX ]]
if [[ $VAR ]] #是否存在变量 VAR ture=>表示存在,false=>不存在
if [ -n $VAR ] #$true if not empty
if [ -z $VAR] #true if empty
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
循环结构
#数组
arr=(henry pola ariel) #创建数组
${arr[@]}/${arr[*]} #将数组转化为列表后返回
${arr[INDEX]} #获取数组指定下标的元素
${#arr[@]} #获取数组长度
#循环
for i in $arr
do
...
done
函数结构
#函数基本结构
[ function ] funname [()]
{
action;
[return int;] #只返回整数,基本不用
}
#获取函数返回值
function funname(){
RST=
}
#函数传入参数并获取返回值
function show(){
echo $1','$2','$#
}
RST=`show henry pola`
echo $RST
常用函数整理
字符串函数
#grep [文本查找]
#获取文件路径
dirname FILE_PATH
#获取文件名
basename FILE_PATH
#资源检索
find PATH [option] SOURCE_NAME
#例如
find / -name mysql
#echo控制台输出
#不换行输出
echo -n
#向文件中插入空行
echo -e>>file.txt
#cat
#把文件做成空文件
cat /dev/null > file.txt
#sed函数
#非交互流式文本【编辑】器
#对文本文件进行增、删、改、查等操作
#支持瀚航、字段、正则匹配文本内容
#基本语法
sed [-opts] 'COMMAND' FILE_PATH
#选项参数
-n #编辑结果不输出
-r #支持正则匹配
sed -rin '/^#jdk/,/^CLASSPATH/d' myenv.d
-e #支持油条有分号隔开的sed命令
sed -n -e 's/usr/USER/g;s/profile/PROFILE/g' profile
-f #将命令封装在文件中使用
vim opr.sed
----------------
s/usr/USER/g;
s/profile/PROFILE/g;
----------------
sed -f opr.sed profile
-i #无-i只输出预览,可以重定向到文件或覆盖源文件
#动作说明
i #插入:向匹配行之前插入内容
#在第三行之前插入hello
sed '3ihello' 1.txt
#"unset i"上插入AABBCC
sed -i '/unset i/iAABBCC' profile
#"unset i"下插入AABBCC
sed -i '/unset i/aAABBCC' profile
#在最后一行之前插入hello
sed '$ihello' 1.txt
#在第一行之前插入空行
sed -in '1{x;p;x}' $ENV_DIR
#在匹配行之前插入
sed -in '/games/{x;p;x}' 1.txt
#在匹配之后插入
sed -in '/games/G' 1.txt
#在匹配之前和之后插入
sed -in '/games/{x;p;x;G}' 1.txt
#在每一行之后添加空行
sed -in G 1.txt
#在每一行之后添加两行空行
sed -in 'G;G' 1.txt
#不管有没有空行,保证只有一个空行
sed -in '/^$/d;G' 1.txt
a #追加:向匹配行后插入内容
#向第三行后面添加hello,3表示行号
sed '3ahello' 1.txt
#向内容123后面添加hello,如果文中包含多行123,则每行后面都会添加
sed '/123/ahello' 1.txt
#在最后一行添加hello
sed '$ahello' 1.txt
c #更改:更改匹配行的内容
#将文件1.txt的第一行替换为hello
sed '1chello' 1.txt
#将包含123的行替换为hello
sed '/123/hello' 1.txt
#将最后一行替换为hello
sed '$chello' 1.txt
d #删除
#删除第四行
sed '4d' 1.txt
#从第一行开始删除,每个2行就删掉一行,级删除奇数行
sed '1~2d' 1.txt
#删除1~2行
sed '1,2d' 1.txt
#删除1~2之外的所有行
sed '1,2!d' 1.txt
#删除最后一行
sed '$d' 1.txt
#删除匹配123的行
sed '/123/d' 1.txt
#删除匹配123的行到最后一行
sed '/123/,$d' 1.txt
#删除匹配123的行及其后面一行
sed '/123/,+1d' 1.txt
#删除空行
sed '/^$/d' 1.txt
#删除不匹配123或abc的行,/123\\|abc/表示匹配123或abc,!取反
sed '/123\\|abc/!d' 1.txt
#删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行
sed '1,3{/123/d}' 1.txt
s #替换
#将文件中的123替换为hello,默认只替换为hello,默认只替换每行第一个123
sed 's/123/hello/' 1.txt
#将文本中所有的123都替换为hello
sed 's/123/hello/g' 1.txt
#将每行中第二个匹配的123替换为hello
sed 's/123/hello/2' 1.txt
#将每行中所有匹配的123替换为hello,并将替换后内容写入2.txt
sed -n 's/123/hellp/gpw 2.txt' 1.txt
#匹配有#号的行,替换匹配行中逗号后的所有内容为空(,.*)表示逗号后的所有内容
sed '/#/s/,.*//g' 1.txt
#替换每行中的最后两个字符为空,每个点代表一个字符,$表示匹配末尾(..$)表示匹配最后两个字符
sed 's/..$//g' 1.txt
#将1.txt文件中以#开头的行替换为空行,即注释的行(^#)表示匹配以#开头,(.*)代表所有内容
sed 's/^#.*//g' 1.txt
#先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开
sed 's/^#.*//;/^$/d' 1.txt
#将每一行中行首的数字加上一个小括号(^[0-9])表示行首是数字,&符号代表匹配的内容
sed 's/^[0-9]/(&)/' 1.txt
#替换左侧特殊字符需要转义,右侧不需要转义,\\1代表匹配的内容
sed 's/[0-9]/(\\1)/' 1.txt
#在文件的每一行后面加上“haha”字段
sed 's/$/&'haha'/' 1.txt
数学函数
#生成序列
seq -s 'SEPETATOR' -w | -f 'b%05ge' $1 step $2
以上是关于Shell编程-基础的主要内容,如果未能解决你的问题,请参考以下文章