Shell 脚本基础语法和使用

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"

13. 脚本执行命令

  • source filename : 立即影响当前shell
  • zsh/sh/bash filename : 在子shell中执行句子
  • ./filename : 读取并执行文件中的命令,但是需要有执行权限

14.查看有啥shell

cat /private/etc/shells

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

15.set -u/+u 、set -e/+e

set -e: 表示此命令后,当某命令返回值非0时,将出错。如果是非交互环境,将直接退出,不再执行后续命令
set +e: set -e的反向操作,恢复bash shell的默认行为,命令失败后继续执行后续命令

set -u: (set -o nounset), 表示此命令之后,当某命令使用了未定义变量或参数时(特殊参数“@”和“*”除外),将打印错误信息。如果是非交互环境(通常为脚本中),将直接退出,不再执行后续命令
set +u: set -u的反向操作,恢复bash shell的默认行为,命令使用未定义变量或参数时,继续执行后续命令

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符号

你可能感兴趣的:(Shell 脚本基础语法和使用)