shell脚本基础语法

shell基础语法学习记录速查。

1、正则表达式

1. 基础正则

特殊符号

[:alnum:] 【所有数字和字母】 a-z A-Z 0-9
[:alpha:] 【所有字母】 a-zA-Z
[:digit:] 【数字】 0-9
[:lower:] 【小写字母】 a-z
[:upper:] 【大写字母】 A-Z

字符集合

^ 行首
$ 行末
. 任意字符
***** 重复0到无穷多次前一个RE字符
** 转意字符
[list] 查找一个待选取字符
[n1-n2] 查找一个待选取字符 grep -n '[A-Z]' test.txt
[^list] 取反 grep -n '[oo[^t]]' test.ext
{} {n} 连续n个的前一个RE字符 {n,}连续n个以上的前一个RE字符 {n,m}连续n到m个的前一个RE字符 grep -n 'go{2,3}gle' test.txt# google 或 gooogle

2. 扩展正则

扩展正则可以使用grep -E 或 egrep命令。

字符集合

+ 重复一个或一个以上的前一个RE字符
? 0个或一个的前一个RE字符
| or
() 查找群组字符 egrep -n 'g(oo|la)d' test.txt# 查找 good或glad字符串。
()+ 多个重复群组字符的判别 echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'

2、bash shell基础语法

1. sh与source执行脚本的区别?

  • sh或bash命令执行脚本会新开一个bash环境子进程执行。
  • source或.命令会在当前父进程bash中执行,所以在配置了.bashrc文件后要立即生效就要用source执行。

2. test判断测试

也可以利用判断符号[]来进行数据判断,括号两边内侧一定要一个空格

  • 【文件类型】判断,test -e filename,没有返回值

    -e 是否存在【常用】

    -f 是否存在并且是文件【常用】

    -d 是否存在并且是目录【常用】

  • 【文件权限检测】 test -r filename

    -r 文件名是否存在且具有读权限

    -w 文件名是否存在且具有写权限

    -x 文件名是否存在且具有执行权限

  • 关系运算符 只支持数字,不支持字符串

    运算符 说明 举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
  • 布尔运算符

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
    -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
  • 字符串运算符

    运算符 说明 举例
    = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
    != 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    -n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
    $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
  • 逻辑运算符

    运算符 说明 举例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

3. shell默认变量

  • $# 脚本名称后面的参数个数

  • $@ 列出所有参数

  • $* 列出所有参数

  • $0 $1 $2...$n 局部变量,$0是脚本名称,$1-$n是传入的参数。

3. shell默认变量

  • $# 脚本名称后面接的参数个数

  • $@ 列出所有参数

  • $* 列出所有参数

  • $0...$9 局部变量,$0是脚本名称,$1-$9是传入的参数。

4. if语句

#!/bin/bash
if [ "${1}" == 100 ]; then
	echo '第一个参数的值是100'
elif [ "${1}" == 200 ]; then
	echo "第一个参数的值是200"
else
	echo "不知道输入的啥!"
fi

5. case语句

        #!/bin/bash
        case ${1} in
            "one")
                echo "selected is one!"
                ;;
            "two")
                echo "selected is two!"
                ;;
            "three")
                echo "selected is three!"
                ;;
            *)
                echo "only select in {one|two|three}"
                ;;
        esac

6. while语句

#!/bin/bash
        #计算1-100的和
        i=0
        s=0
        while [ "$i" -lt 100 ]
        do
                i=$(( $i+1 ))
                s=$(( $i+$s ))
        done
        echo "1+2+3+...+100=${s}"
		
		while read line
		do
			echo $line
		done < 1.txt
		
		while :
		do
			echo "死循环"
		done

7. for语句

#!/bin/bash
users=$(cut -d ':' -f1 /etc/passwd)
for user in ${users}
do
#       echo ${user}
id ${user}
done

8、${}中的字符串截取 %、#

"#"井号处理左边
"%"百分号处理右边
键盘上 #在👈 %在👉

str=/dir1/dir2/dir3/my.file.txt
echo ${str#*.}		# file.txt 删除第一个.符号及左边的所有字符
echo ${str##*.}		# txt 删除最后一个.符号及左边的所有字符

echo ${str%.*}		# /dir1/dir2/dir3/my.file 删除最后一个.符号及右边的所有字符
echo ${str%%.*}		# /dir1/dir2/dir3/my 删除第一个.符号及右边的所有字符

# 截取
echo ${str:0:5}		# /dir1 从第0为开始截取5位
echo ${str:0:-1}	# /dir1/dir2/dir3/my.file.txt 截取全部

# 替换
echo ${str/dir/DIR}	# /DIR1/dir2/dir3/my.file.txt 将第一个dir替换为DIR
echo ${str//dir/DIR}# /DIR1/DIR2/DIR3/my.file.txt 将全部dir替换为DIR

3、sed

sed工具可以将数据进行替换、删除、新增选取特定的行等功能。

语法:sed [-nefr] ''

-n	[安静模式]只有处理的行被打印出来

-i	处理作用于文件  

a	新增,a后面接字符串 会增加到下一行

i	插入,i后面接字符串 会插入到上一行

c	替换,c后面接字符串 会替换n1到n2行的内容

d	删除

p	打印,通常与-n一起使用

s	替换,搭配正则替换字符串

例如:取ip地址。

ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'

4、awk

awk工具常用语按列处理数据。

语法:

awk '[BEGIN] {} 表达式1 {操作1} 表达式2 {操作2}'

awk内置变量

  • NF 每一行共有几列

  • $NF 表示最后一列

  • NR 当前读取的行号

  • FS 指定列分隔符,默认为空格, -F参数也可指定列分隔符

  • OFS:输出列分隔符

BEGIN关键字 一般用在开头指定分隔符

cat /etc/passwd | awk 'BEGIN {FS=":"} {if(NR==1)printf "%20s %10s \n", "UID", "PID"} NR>=2 {printf "%20s %10s\n",$1,$3}'

逻辑运算符: > < >= <= != ==

5、数组

Bash Shell 只支持一维数组,初始化时不需要定义数组大小。

与大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

#!/bin/bash

# 声明一个数组
declare -a files

# 初始化一个数组
files=('鸟哥的linux私房菜' 'java编程思想' '漫画算法')

# 读取数组
# 打印下标为0
echo ${files}

# 打印指定下标
echo ${files[1]}

# 打印所有元素
echo ${files[*]}


# 按下标修改或增加元素
files[0]='计算机网络'

# 获取数组长度
echo ${#files[*]}

# 追加元素,shell中没有直接追加的函数,可以利用数组长度追加元素
files[${#files[*]}]='软件工程'
files[${#files[*]}]='java核心技术卷Ⅰ'

# 打印所有元素
echo ${files[@]}

posted @ 2021-06-26 23:03  浩瀚的雨  阅读(287)  评论(0)    收藏  举报