linuxshellput,LinuxShell使⽤笔记
1.背景
Linux Shell是⼀种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替。既然是基本功,那就需要掌握,毕竟学习Shell 脚本的过程中,还是能了解到很多Linux系统的内容。Linux脚本⼤师不是⼈⼈都可以达到的,但是⽤⼀些简单的Shell实现⼀些常见的基本功能还是很有必要的。
2.正题
1) 热⾝
下⾯的例⼦展⽰了如何向脚本传递参数、脚本如何获取参数、if-else判断、变量的使⽤等基本内容。
#!/bin/bash
if [[ $# -lt 1 ]]; then
echo "args count must > 1"
echo "Uage: bash +x example01.sh []"
exit
fi
arg=$1
if [[ $arg -gt 10 ]]; then
echo "$arg > 10"
else
echo "$arg < 10"
fi
这个脚本的调⽤⽅式如下:
bash +x example01.sh 52).数组、函数传参数,循环
下⾯的例⼦展⽰了数组、函数、循环等基本使⽤。
#!/bin/bash
if [[ $# -lt 1 ]]; then
echo "args count must > 1"
echo "Uage: bash +x example01.sh []"
exit
fi
args=$@
for arg in $args; do
echo $arg
done
function fun() {
linux循环执行命令脚本
echo $1
}
fun "hello shell"
fun2() {
echo "Linux"
}
fun2注意,函数fun中的$1,获取的是函数参数,不是脚本调⽤时传⼊的参数。$@ 是获取脚本调⽤时传⼊的参数列表。
3).while 循环以及其他⼏种循环、case、表达式expr的使⽤
#!/bin/bash
if [[ $# -lt 1 ]]; then
echo "args count must > 1"
echo "Uage: bash +x example01.sh []"
exit
fi
case $1 in
"install" )
echo "operation type is install"
;;
"uninstall" )
echo "operation type is uninstall"
;;
* )
echo "operation type is not support"
;;
esac
for ((i=0;i<3;i++))
do
if ((i==1))
then
continue
fi
echo $i
done
for i in `seq 5`
do
echo "loop $i"
done
注意这⾥的case * 并不是所有,⽽是输⼊值不在case中,相当于default. 在循环中可以使⽤continue/break等关键字,⾮常类似Java等其他语⾔的循环。
4).脚本之间互相引⽤
通过source 或者 . 的⽅式可以引⽤另⼀个脚本中的函数或者变量
first.sh
function fun(){
echo "i am from first."
}
file=firstsecond.sh
. first.sh
fun
echo $file
使⽤bash +x second.sh执⾏,在second.sh 中可以调⽤fun函数和使⽤file变量。
这⾥的.和source都可以实现引⽤first⽂件中的变量。注意: 如果同时引⽤了多个脚本的同⼀个变量名的变量,后⾯的值会覆盖前⾯的变量⽽不会报错。
5).关于错误处理
a)在shell中有⼀个变量 $? ,这个变量记录的是上次脚本执⾏的结果,如果正常结束则是0,否则是⾮0值;
b)如果在shell脚本中通过set -o errexit来实现遇到错误就退出,这样能够避免产⽣更多的错误;
c)在shell执⾏过程中如果出错,可以通过重定向的⽅式,输出到⽂件中,⽐如Command >> filename2
>&1
6).字典
shell中的字典是⾮常好的数据结构,能够很⽅便地处理配置
#!/bin/bash
set -o errexit
hput(){
eval "hkey_$1"="$2"
}
hget(){
eval echo '${'"hkey_$1"'}'
}
hput k1 v1
hget k1
declare -A dic
dic=([key1]="value1" [key2]="value2" [key3]="value3")
echo ${dic["key1"]}
# output all key
echo ${!dic[*]}
#outpull all value
echo ${dic[*]}
# access all
for key in $(echo ${!dic[*]})
do
echo "$key : ${dic[$key]}"
done
执⾏之后,输出如下:
v1
value1
key3 key2 key1
value3 value2 value1
key3 : value3
key2 : value2
key1 : value1
7).⽂本处理
sed 命令能够对对⽂本进⾏操作。
⽐如有⼀个⽂件sedfile,内容如下:
1
2
3
4
5执⾏ "sed '1,3d' sedfile,则会输出4,5 两⾏,即对1,2,3⾏做了删除处理,注意这时⽂件⾥⾯并没有删掉这两⾏。除了删除之外,还可以做替换操作。
root@Ubuntu:~/codelab# sed 's/1/0/g' sedfile
2
3
4
5
root@ubuntu:~/codelab# cat sedfile
1
2
3
4
5我们发现,在输出时,将1替换成了0;
⽂本处理还有⼀个⾮常强⼤的⼯具-awk
我们⾸先看看awk的基本处理-按照逗号(,)分割获取想要的⽂本;
root@ubuntu:~/codelab# cat awkfile
this,is,a,awk,file
this,is,a,awk,file
root@ubuntu:~/codelab# cat awkfile | awk -F ',' '{print $0}'
this,is,a,awk,file
this,is,a,awk,file
root@ubuntu:~/codelab# cat awkfile | awk -F ',' '{print $1}'
this
this
root@ubuntu:~/codelab#
这⾥我们可以看到awk可以按照任意形式分割⽂本,然后输出;
8).特殊变量和值
下列变量通常具有固定意义
$# 表⽰变量的个数,常⽤于循环
$@ 当前命令⾏所有参数。置于双引号中,表⽰个别参数
$* 当前命令⾏所有参数。置于双引号中,表⽰将命令⾏所有参数当初⼀个单独参数$-(连字号) 在引⽤数给予Shell的选项
$? 表⽰上⼀个命令退出的状态
$$ 表⽰当前进程编号
$0 表⽰当前程序名称
$! 表⽰最近⼀个后台命令的进程编号
$HOME 表⽰当前⽤户根⽬录
$IFS 表⽰内部的字段分隔符
$LANG 当前locale默认名称
$PATH 环境变量
$PPID ⽗进程编号
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论