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[@]}

浙公网安备 33010602011771号