Shell
shell的语法类似python,不需要 ;
Windows上使用shell 1.下载Git: https://www. git-scm.com/download/wi n
2.在目标.sh文件夹中右键打开Git.bash
3.命令行输入 sh test.sh 123
特别提醒:一定要使用这种 a=10 而不是 a = 10 =两边不要留空格,不要留空格
更改shell脚本权限
chmod u+x shell.sh 将shell权限变为可执行文件
标准头部写法
#!/bin/bash 标准的头部写法
变量使用
shell中变量定义必须赋予初值 a=10,后续用a的时候使用 $a
读取外部参数
$# 传递给脚本的参数个数
$@ 传递给脚本所有的参数
$0 当前脚本的名字
$1 传递给脚本的第一个参数(后面依次类推)
例:./test.sh COMP|head 此处读入的外界参数只有COMP,管道后面的并不会被当作参数
if的4种模式
=方式一
if(($# != 2)) 2>/dev/null (())类似于python中的判断格式
then 2>/dev/null意为输出错误不再显示到屏幕上,而是到null里
echo "$#"
else else后不用加then
echo "Hello"
fi
方式二
elif [ $# -ne 2 ] [ ]功能等同于test,使用-eq这些,而不是==
then [ ]中每个字符之间都要有空格
echo "$#"
fi
方式三
elif [[ $# < 5 && $# > 2 ]] [[ ]]非常强大,可以使用逻辑表达式,也可以使用=~正则表达式
then
echo "$#"
fi
方式四
elif test -e $file test测试后会返回一个值真或假,可测试数字、字符文件
then
echo "Exist" -e,-r为检测文件是否存在(注意此处的比较项要加-,而perl中不用)
fi
------test强调内容
=与!=
test详解
= 与 != 字符串匹配判断(perl里使用eq,切记没有-)
-gt,-eq,-ne,-lt 数字大小判断(perl 里使用==与!=)
-e,-r 判断文件存在,判断文件存在且可读
-a and 例:if test $a -gt 10 -a -lt 15
-o or
2种for循环
方式 一
for((i=1;i<=10;i++)) 注意此处是双括号
do
echo "Hi"
done
方式 二
for i in $(seq 1 10)
do
echo $i
done
依次读取目录下的文件
for file in *.jpg 读取当前目录下所有的.jpg文件
do
png=$(echo "$file" | sed 's/jpg/png/g')
#操作变量的时候要加$,类似Vue的语法
#此处转换.jpg为.png,注意此处的echo,它有打开此文件的作用,若无可能无法将值赋给变量png
done
------------------
for file in * 读取当前目录所有文件
echo的用法
echo
![d98343a752ec0ae341731de4507dde33.png](https://i-blog.csdnimg.cn/blog_migrate/6fd076b4909a0fb0b3e5e5239d24c30c.png)
赋值命令行结果给变量
test=$()
test=``
加减运算
num=$(($1 + 1)) 使用双括号进行运算赋值,$()这种无法进行计算会报错
num=$(expr $1 + 1) 请注意,每个字符之间一定要有空格,一定要有空格
其余常用命令
basename
name=`basename /tmp/test/file.txt` 输出为file.txt
name1=`basename /tmp/test/file.txt .txt` 输出为file
diff
diff file1 file2 >dev/null 2>&1 比较结果不输出到屏幕
---------------重点来了
if [ "$?" == "0" ];then $?是对比结果返回值
echo "the file or dir is same!"
else
echo "the file or dir is different!"
fi
exit
exit 0 退出并返回0
exit 1 退出并返回1
convert
convert "a.jpg" "a.png" 将jpg图片转换为png
read
read address 读取外界输入并将其值赋给address
echo $address
cp
cp file1 file2 将file1复制成file2
cp -p 保留源文件各种信息及属性
mv
mv aaa bbb 将文件名aaa改为bbb
mv aaa info/ 将文件移动到info/文件夹
display
display shell.png 打开一张图片
Regex
格式: egrep '匹配的内容' 目标文件 | 第二步操作
作用: 从目标文件中读取出包含匹配内容的 一整行,而不是要匹配的字符串片段
说明: 匹配内容里不需要用转义符,这与s///g不同
小技巧:使用特殊的标点符号作为匹配的标志可以提升效率
![b0f167977de5a1246d425a0bd2a08b72.png](https://i-blog.csdnimg.cn/blog_migrate/a3ccdfd7bf840103355aa67f1a62d3ae.jpeg)
常用匹配规则
[aeiouAEIOU] 从中随机选择一个
[0-9]{4} 从中选择4个
.* 匹配任意字符
w 匹配单词
d 匹配数字
^abc 以abc为开始
^(abc) 以abc为开头
[^abc] 不包含abc
abc$ 以abc为结尾
'|' 匹配内容里|表示或者
+ 至少匹配1个
? 至少匹配0个
() 同传统意义上的括号
常用选择项
-v 不包括匹配出的结果
-i 忽略大小写,在perl中为//i
cut
例子: abc,123,456,afg
cut -d',' -f2 注意此处是f2,取出123
cut -d',' -f2,3 取出123 456
sort
sort用法(单独使用为按字母顺序排序)
-n或-nr 按数字大小进行排序
-r 反向排序
-u 排序结果去掉重复项
与unqic一起使用
sort aim.txt | unqic -c | sort -n unic去重,-c显示重复行数量
![f20437f879032b3c4172e0bf2539978a.png](https://i-blog.csdnimg.cn/blog_migrate/6050a09a6b1ffa0091ff5dadf58ba397.png)
wc
wc <aim.txt
-l 只显示行数
-w 只显示字数
-----------
如果是用管道则为 | wc -l | 不需要<符号
tail
tail -1 显示最后一行
tr
tr '0123456789' '<<<<<5>>>>' 将0-9转换按规则为后面
sed
sed