Shell基础语法
Shell是一种胶水语言,把多个命令组合(粘贴)在一起以实现某种功能。核心思想是'通过各种高级语言的特性(变量/判断/条件/循环等语句)计算值,用于想要执行的命令'。
0.Shell文件及格式
- Shell文件以.sh结尾,例如:123.sh
- 文件头要添加'#!'告诉系统找个脚本是用什么解释器(sh/bash/zsh...)来执行,例如:#!/bin/bash , #!/bin/sh
1.变量
//定变量
- bian_liang="这是变量,不能有空格"
- Var1_="只能有字母数字下划线,不能有别的符合"
- shuzi=782
//循环赋值
for file in `ls /etc`
for file in $(ls etc)
//使用变量
echo $bian_liang
echo ${bian_liang}
- 用$美元符号使用变量,大括号{}是可选的,为了区分变量的边界,例如:
- $bian_liangMa -> 这样无法解释出bian_liang 这个变量,需要使用:${bian_liang}Ma
- 所以在使用变量的时候最好都加上大括号{}
//变量类型
- 局部变量: 定义在Shell脚本/命令中的变量,只能在当前shell脚本里使用
- 环境变量: 在所有程序中都都可以使用
- Shell变量: Shell程序设置的特殊变量,有环境变量和局部变量
//数组定义
array_name=(value0 value1 value2 value3)
array2=(
value0
value1
value2
....
)
array3[0]=value0
array3[1]=value1
array3[2]=value2
//数组读取
value=${array2[1]} //单个读取
echo ${array3[@]} //全部读取
//获取数组长度
length=${#array[@]}
length=${#array[*]}
2.条件语句
if [[真伪变量]] then
elif
else
fi
//swich
read num
case $num in
1) echo '条件1'
;;
2) echo '条件2'
break
;;
*) echo 'default'
;;
esac
3.循环语句
for ((int i ; i <= 5; i++)):do
echo "这是$i"
done
for in 1 2 3 4 5
do
content
break
done
for in arr
do
continue
done
while (( $int <= 5 ))
do
command
break
done
echo "输入一个字符串"
while read ZIFUCHUAN
do
echo "ZIFUCHUN"
done
while :
do
command //无限循环
done
//递增
idx=0
idx=`expr $idx + 1`
4.打印
echo "输出字符串"
echo "将输出定位到文件" > myfile
echo -e "开启转义\n"
n > m : n输出到m
n < m : m输入到n
n >> m : n追加到m
n << m : m追到到n
n >& m : n和m合并到m
n <& m : m和n合并到n
n <<< m : 将右侧的字符串传递到左侧命令的标准输入
//一个黑洞,抛弃输出的内容
/dev/null
printf : 格式化输出,类似于C语言
5.常用命令
`` : 反引号,把扩起来的内容执行一次,然后把结果返回
| : 管道,把上一个命令的输出到结果传递给下一个命令。
read val: 从命令行读取一行,并用后面的变量来接收
6.注释
# 单行注释
:<< EOF
多行注释,其中EOF可以换成别的字符,如,!...
EOF
7.参数
- $0,$1,$2....$n :用$符号获取参数,参数从0开始按顺序递增1
- $# :参数个数
- $* :所有参数拼接成一个字符串,如 "参数1参数2参数n"
- $$ :脚本运行的当前进程ID
- $! :后台运行的最后一个进程ID
- $@:与$*相同,但是用引号把参数括起来
- $? :显示最后命令的状态,0表示没有错误
- $- :显示shell使用的当前选项
8.运算符
expr : 表示后面为一个表达式,主要必须要有空格,且用反引号` `包住,例如 : `expr 2 + 2`
+-*/%= :加减乘除取余赋值和其他语言一样,其中*要用\反斜杠转移
==,!= :比较运算符要用中括号包起来[],返沪true或者false,例如:[$a == $b]
//关系运算符
-eq :等于 [$a -eq $b]
-ne :不等 [$a -ne $b]
-gt :大于 [$a -gt $b]
-lt :小于 [$a -lt $b]
-ge :大于等于 [$a -ge $b]
-le :小于等于 [$a -le $b]
! : 非 [!true] 返回false
-o : 或 [$a -gt $b -o $b -gt $c]
-a : 与 [$a -le 20 -a $b -lt 30]
//文件运算符
-d file : 是否为目录文件 [-d $file]
-e file : 文件是否存在 [-e $file]
-f file : 是否为普通文件(非设备文件且非目录) [-f $file]
//test
test : 命令可以检查某个条件是否成立,包括数值、字符和文件
if test $a -eq $b
then
echo "="
elif
echo 'oo'
else
echo '!='
fi
9. 函数
someFun() {
echo "函数体,可以不加return,不加return 则默认返回最后一条命令执行的结果"
}
//调用
someFun
paramFun() {
echo "$1第一个参数"
echo "$2第一个参数"
echo "如果参数大于等于10个,需要用$符获取参数${1}"
}
paramFun 1 2
10.引入其他文件
. 或者 source
source ./test1.sh
. ./test2.sh //.要有空格
11.grep搜索 -E "正则表达式要卸载括号里"
参数 |
作用 |
-v |
逆转显示 |
-i |
忽略大小写 |
-A |
向上显示几行 |
-B |
向下显示几行 |
-E |
启用扩展 |
—color |
显示颜色 egrep:grep -E |
12.字符串
- 'dan yin hao' : 单引号里面的字符串是纯字符串,变量不能使用,不能转义
- "shang yin hao "$bian_liang" \n " : 双引号里可以用变量,也可以转义
运算符 |
作用 |
= |
两个字符串是否相等 [b] 相等返回true |
-z |
是否长度为0,是返回true, [-z $a] |
-n |
长度是否不为0,不为0返回true, [-n $a] |
$ |
是否为空,空为0,[$a] |
=~ |
b 判断字符串a是否包含字符串b |
${#bian_liang} |
获取字符串长度 |
${bian_liang:3:4} |
提取子串,输出"n_li" |
Shell脚本应用
1.应用重签名
2.VPN 规则
3.PS批处理
4.图片批量改名
#!/bin/sh
#批量改名
DIR=$1
PREFIX=$2
pushd $DIR > /dev/null
Suffixes=('.png'
".jpg"
".jpeg"
'.PNG'
'.JPG'
'.JPEG')
idx=0
for name in `ls | tr " " "\?"`;
do
isImage=""
for suffix in ${Suffixes[@]}
do
if [[ $name =~ $suffix ]]; then
isImage=$suffix
fi
if [[ -n $isImage ]]; then
break
fi
done
if [[ -n $isImage ]]; then
idx=`expr $idx + 1`
if [[ -e "image_${idx}.png" ]]; then
echo "cant't be transform since file ${idx} exists"
else
mv "$name" "image_${idx}.png"
fi
fi
done
popd > /dev/null
5. Crash符号
网友评论